From 61ad0879c529697fddf791a25a94bf8b6d87e9ac Mon Sep 17 00:00:00 2001 From: Federico Amedeo Izzo Date: Tue, 2 Feb 2021 20:52:37 +0100 Subject: [PATCH] CPS-UI: Make channels, zones and contacts 1-based to fix zone bound --- openrtx/src/state.c | 4 +++- openrtx/src/ui/ui.c | 23 +++++++++++++---------- openrtx/src/ui/ui_menu.c | 6 +++--- platform/drivers/NVM/nvmem_MD3x0.c | 15 +++++++++------ platform/drivers/NVM/nvmem_MDUV3x0.c | 17 ++++++++++------- platform/drivers/NVM/nvmem_linux.c | 6 +++--- 6 files changed, 41 insertions(+), 30 deletions(-) diff --git a/openrtx/src/state.c b/openrtx/src/state.c index 882973bd..63708c4b 100644 --- a/openrtx/src/state.c +++ b/openrtx/src/state.c @@ -40,7 +40,9 @@ void state_init() state.v_bat = platform_getVbat(); state.charge = battery_getCharge(state.v_bat); state.rssi = rtx_getRssi(); - + + // Set default channel index (it is 1-based) + state.channel_index = 1; // Set VFO channel default settings state.channelInfoUpdated = true; state.channel.mode = FM; diff --git a/openrtx/src/ui/ui.c b/openrtx/src/ui/ui.c index fcf7721a..d7353966 100644 --- a/openrtx/src/ui/ui.c +++ b/openrtx/src/ui/ui.c @@ -450,10 +450,11 @@ int _ui_fsm_loadChannel(uint16_t zone_index, bool *sync_rtx) { { // Calculate zone size const uint8_t zone_size = sizeof(state.zone.member)/sizeof(state.zone.member[0]); - if(zone_index >= zone_size) + if((zone_index <= 0) || (zone_index > zone_size)) return -1; else - channel_index = state.zone.member[zone_index]; + // Channel index is 1-based while zone array access is 0-based + channel_index = state.zone.member[zone_index - 1]; } int result = nvm_readChannelData(&channel, channel_index); // Read successful and channel is valid @@ -847,20 +848,23 @@ void ui_updateFSM(event_t event, bool *sync_rtx) if(state.ui_screen == MENU_ZONE) { zone_t zone; - // The index is -1 because the first zone "All channels" is not read from flash - if(nvm_readZoneData(&zone, ui_state.menu_selected) != -1) + // menu_selected is 0-based while channels are 1-based + // menu_selected == 0 corresponds to "All Channels" zone + if(nvm_readZoneData(&zone, ui_state.menu_selected + 1) != -1) ui_state.menu_selected += 1; } else if(state.ui_screen == MENU_CHANNEL) { channel_t channel; - if(nvm_readChannelData(&channel, ui_state.menu_selected + 1) != -1) + // menu_selected is 0-based while channels are 1-based + if(nvm_readChannelData(&channel, ui_state.menu_selected + 2) != -1) ui_state.menu_selected += 1; } else if(state.ui_screen == MENU_CONTACTS) { contact_t contact; - if(nvm_readContactData(&contact, ui_state.menu_selected + 1) != -1) + // menu_selected is 0-based while channels are 1-based + if(nvm_readContactData(&contact, ui_state.menu_selected + 2) != -1) ui_state.menu_selected += 1; } } @@ -876,8 +880,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) else { state.zone_enabled = true; - // The index is -1 because the first zone "All channels" is not read from flash - result = nvm_readZoneData(&newzone, ui_state.menu_selected - 1); + result = nvm_readZoneData(&newzone, ui_state.menu_selected); } if(result != -1) { @@ -886,7 +889,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) if(ui_state.last_main_state == MAIN_VFO) state.vfo_channel = state.channel; // Load zone first channel - _ui_fsm_loadChannel(0, sync_rtx); + _ui_fsm_loadChannel(1, sync_rtx); // Switch to MEM screen state.ui_screen = MAIN_MEM; } @@ -896,7 +899,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) // If we were in VFO mode, save VFO channel if(ui_state.last_main_state == MAIN_VFO) state.vfo_channel = state.channel; - _ui_fsm_loadChannel(ui_state.menu_selected, sync_rtx); + _ui_fsm_loadChannel(ui_state.menu_selected + 1, sync_rtx); // Switch to MEM screen state.ui_screen = MAIN_MEM; } diff --git a/openrtx/src/ui/ui_menu.c b/openrtx/src/ui/ui_menu.c index d4135440..9a32386d 100644 --- a/openrtx/src/ui/ui_menu.c +++ b/openrtx/src/ui/ui_menu.c @@ -155,7 +155,7 @@ int _ui_getZoneName(char *buf, uint8_t max_len, uint8_t index) else { zone_t zone; - result = nvm_readZoneData(&zone, index - 1); + result = nvm_readZoneData(&zone, index); if(result != -1) snprintf(buf, max_len, "%s", zone.name); } @@ -165,7 +165,7 @@ int _ui_getZoneName(char *buf, uint8_t max_len, uint8_t index) int _ui_getChannelName(char *buf, uint8_t max_len, uint8_t index) { channel_t channel; - int result = nvm_readChannelData(&channel, index); + int result = nvm_readChannelData(&channel, index + 1); if(result != -1) snprintf(buf, max_len, "%s", channel.name); return result; @@ -174,7 +174,7 @@ int _ui_getChannelName(char *buf, uint8_t max_len, uint8_t index) int _ui_getContactName(char *buf, uint8_t max_len, uint8_t index) { contact_t contact; - int result = nvm_readContactData(&contact, index); + int result = nvm_readContactData(&contact, index + 1); if(result != -1) snprintf(buf, max_len, "%s", contact.name); return result; diff --git a/platform/drivers/NVM/nvmem_MD3x0.c b/platform/drivers/NVM/nvmem_MD3x0.c index c831fd01..9e595325 100644 --- a/platform/drivers/NVM/nvmem_MD3x0.c +++ b/platform/drivers/NVM/nvmem_MD3x0.c @@ -264,13 +264,14 @@ void nvm_loadHwInfo(hwInfo_t *info) int nvm_readChannelData(channel_t *channel, uint16_t pos) { - if(pos > maxNumChannels) return -1; + if((pos <= 0) || (pos > maxNumChannels)) return -1; W25Qx_wakeup(); delayUs(5); md3x0Channel_t chData; - uint32_t readAddr = chDataBaseAddr + pos * sizeof(md3x0Channel_t); + // Note: pos is 1-based because an empty slot in a zone contains index 0 + uint32_t readAddr = chDataBaseAddr + (pos - 1) * sizeof(md3x0Channel_t); W25Qx_readData(readAddr, ((uint8_t *) &chData), sizeof(md3x0Channel_t)); W25Qx_sleep(); @@ -342,13 +343,14 @@ int nvm_readChannelData(channel_t *channel, uint16_t pos) int nvm_readZoneData(zone_t *zone, uint16_t pos) { - if(pos >= maxNumZones) return -1; + if((pos <= 0) || (pos > maxNumZones)) return -1; W25Qx_wakeup(); delayUs(5); md3x0Zone_t zoneData; - uint32_t zoneAddr = zoneBaseAddr + pos * sizeof(md3x0Zone_t); + // Note: pos is 1-based to be consistent with channels + uint32_t zoneAddr = zoneBaseAddr + (pos - 1) * sizeof(md3x0Zone_t); W25Qx_readData(zoneAddr, ((uint8_t *) &zoneData), sizeof(md3x0Zone_t)); W25Qx_sleep(); @@ -373,13 +375,14 @@ int nvm_readZoneData(zone_t *zone, uint16_t pos) int nvm_readContactData(contact_t *contact, uint16_t pos) { - if(pos >= maxNumContacts) return -1; + if((pos <= 0) || (pos > maxNumContacts)) return -1; W25Qx_wakeup(); delayUs(5); md3x0Contact_t contactData; - uint32_t contactAddr = contactBaseAddr + pos * sizeof(md3x0Contact_t); + // Note: pos is 1-based to be consistent with channels + uint32_t contactAddr = contactBaseAddr + (pos - 1) * sizeof(md3x0Contact_t); W25Qx_readData(contactAddr, ((uint8_t *) &contactData), sizeof(md3x0Contact_t)); W25Qx_sleep(); diff --git a/platform/drivers/NVM/nvmem_MDUV3x0.c b/platform/drivers/NVM/nvmem_MDUV3x0.c index b7e5eb36..549f2f2f 100644 --- a/platform/drivers/NVM/nvmem_MDUV3x0.c +++ b/platform/drivers/NVM/nvmem_MDUV3x0.c @@ -286,13 +286,14 @@ void nvm_loadHwInfo(hwInfo_t *info) int nvm_readChannelData(channel_t *channel, uint16_t pos) { - if(pos >= maxNumChannels) return -1; + if((pos <= 0) || (pos > maxNumChannels)) return -1; W25Qx_wakeup(); delayUs(5); mduv3x0Channel_t chData; - uint32_t readAddr = chDataBaseAddr + pos * sizeof(mduv3x0Channel_t); + // Note: pos is 1-based because an empty slot in a zone contains index 0 + uint32_t readAddr = chDataBaseAddr + (pos - 1) * sizeof(mduv3x0Channel_t); W25Qx_readData(readAddr, ((uint8_t *) &chData), sizeof(mduv3x0Channel_t)); W25Qx_sleep(); @@ -379,15 +380,16 @@ int nvm_readChannelData(channel_t *channel, uint16_t pos) int nvm_readZoneData(zone_t *zone, uint16_t pos) { - if(pos >= maxNumZones) return -1; + if((pos <= 0) || (pos > maxNumZones)) return -1; W25Qx_wakeup(); delayUs(5); mduv3x0Zone_t zoneData; mduv3x0ZoneExt_t zoneExtData; - uint32_t zoneAddr = zoneBaseAddr + pos * sizeof(mduv3x0Zone_t); - uint32_t zoneExtAddr = zoneExtBaseAddr + pos * sizeof(mduv3x0ZoneExt_t); + // Note: pos is 1-based to be consistent with channels + uint32_t zoneAddr = zoneBaseAddr + (pos - 1) * sizeof(mduv3x0Zone_t); + uint32_t zoneExtAddr = zoneExtBaseAddr + (pos - 1) * sizeof(mduv3x0ZoneExt_t); W25Qx_readData(zoneAddr, ((uint8_t *) &zoneData), sizeof(mduv3x0Zone_t)); W25Qx_readData(zoneExtAddr, ((uint8_t *) &zoneExtData), sizeof(mduv3x0ZoneExt_t)); W25Qx_sleep(); @@ -418,13 +420,14 @@ int nvm_readZoneData(zone_t *zone, uint16_t pos) int nvm_readContactData(contact_t *contact, uint16_t pos) { - if(pos >= maxNumContacts) return -1; + if((pos <= 0) || (pos > maxNumContacts)) return -1; W25Qx_wakeup(); delayUs(5); mduv3x0Contact_t contactData; - uint32_t contactAddr = contactBaseAddr + pos * sizeof(mduv3x0Contact_t); + // Note: pos is 1-based to be consistent with channels + uint32_t contactAddr = contactBaseAddr + (pos - 1) * sizeof(mduv3x0Contact_t); W25Qx_readData(contactAddr, ((uint8_t *) &contactData), sizeof(mduv3x0Contact_t)); W25Qx_sleep(); diff --git a/platform/drivers/NVM/nvmem_linux.c b/platform/drivers/NVM/nvmem_linux.c index 77633b94..752b5d28 100644 --- a/platform/drivers/NVM/nvmem_linux.c +++ b/platform/drivers/NVM/nvmem_linux.c @@ -44,7 +44,7 @@ void nvm_loadHwInfo(hwInfo_t *info) int nvm_readChannelData(channel_t *channel, uint16_t pos) { - if(pos >= maxNumChannels) return -1; + if((pos <= 0) || (pos > maxNumChannels)) return -1; /* Generate dummy channel name */ snprintf(channel->name, 16, "Channel %d", pos); @@ -57,7 +57,7 @@ int nvm_readChannelData(channel_t *channel, uint16_t pos) int nvm_readZoneData(zone_t *zone, uint16_t pos) { - if(pos >= maxNumZones) return -1; + if((pos <= 0) || (pos > maxNumZones)) return -1; /* Generate dummy zone name */ snprintf(zone->name, 16, "Zone %d", pos); @@ -71,7 +71,7 @@ int nvm_readZoneData(zone_t *zone, uint16_t pos) int nvm_readContactData(contact_t *contact, uint16_t pos) { - if(pos >= maxNumContacts) return -1; + if((pos <= 0) || (pos > maxNumContacts)) return -1; /* Generate dummy contact name */ snprintf(contact->name, 16, "Contact %d", pos);