CPS-UI: Make channels, zones and contacts 1-based to fix zone bound
This commit is contained in:
parent
08a44375fc
commit
61ad0879c5
|
|
@ -40,7 +40,9 @@ void state_init()
|
||||||
state.v_bat = platform_getVbat();
|
state.v_bat = platform_getVbat();
|
||||||
state.charge = battery_getCharge(state.v_bat);
|
state.charge = battery_getCharge(state.v_bat);
|
||||||
state.rssi = rtx_getRssi();
|
state.rssi = rtx_getRssi();
|
||||||
|
|
||||||
|
// Set default channel index (it is 1-based)
|
||||||
|
state.channel_index = 1;
|
||||||
// Set VFO channel default settings
|
// Set VFO channel default settings
|
||||||
state.channelInfoUpdated = true;
|
state.channelInfoUpdated = true;
|
||||||
state.channel.mode = FM;
|
state.channel.mode = FM;
|
||||||
|
|
|
||||||
|
|
@ -450,10 +450,11 @@ int _ui_fsm_loadChannel(uint16_t zone_index, bool *sync_rtx) {
|
||||||
{
|
{
|
||||||
// Calculate zone size
|
// Calculate zone size
|
||||||
const uint8_t zone_size = sizeof(state.zone.member)/sizeof(state.zone.member[0]);
|
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;
|
return -1;
|
||||||
else
|
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);
|
int result = nvm_readChannelData(&channel, channel_index);
|
||||||
// Read successful and channel is valid
|
// 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)
|
if(state.ui_screen == MENU_ZONE)
|
||||||
{
|
{
|
||||||
zone_t zone;
|
zone_t zone;
|
||||||
// The index is -1 because the first zone "All channels" is not read from flash
|
// menu_selected is 0-based while channels are 1-based
|
||||||
if(nvm_readZoneData(&zone, ui_state.menu_selected) != -1)
|
// menu_selected == 0 corresponds to "All Channels" zone
|
||||||
|
if(nvm_readZoneData(&zone, ui_state.menu_selected + 1) != -1)
|
||||||
ui_state.menu_selected += 1;
|
ui_state.menu_selected += 1;
|
||||||
}
|
}
|
||||||
else if(state.ui_screen == MENU_CHANNEL)
|
else if(state.ui_screen == MENU_CHANNEL)
|
||||||
{
|
{
|
||||||
channel_t 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;
|
ui_state.menu_selected += 1;
|
||||||
}
|
}
|
||||||
else if(state.ui_screen == MENU_CONTACTS)
|
else if(state.ui_screen == MENU_CONTACTS)
|
||||||
{
|
{
|
||||||
contact_t contact;
|
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;
|
ui_state.menu_selected += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -876,8 +880,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
state.zone_enabled = true;
|
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);
|
||||||
result = nvm_readZoneData(&newzone, ui_state.menu_selected - 1);
|
|
||||||
}
|
}
|
||||||
if(result != -1)
|
if(result != -1)
|
||||||
{
|
{
|
||||||
|
|
@ -886,7 +889,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
|
||||||
if(ui_state.last_main_state == MAIN_VFO)
|
if(ui_state.last_main_state == MAIN_VFO)
|
||||||
state.vfo_channel = state.channel;
|
state.vfo_channel = state.channel;
|
||||||
// Load zone first channel
|
// Load zone first channel
|
||||||
_ui_fsm_loadChannel(0, sync_rtx);
|
_ui_fsm_loadChannel(1, sync_rtx);
|
||||||
// Switch to MEM screen
|
// Switch to MEM screen
|
||||||
state.ui_screen = MAIN_MEM;
|
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 we were in VFO mode, save VFO channel
|
||||||
if(ui_state.last_main_state == MAIN_VFO)
|
if(ui_state.last_main_state == MAIN_VFO)
|
||||||
state.vfo_channel = state.channel;
|
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
|
// Switch to MEM screen
|
||||||
state.ui_screen = MAIN_MEM;
|
state.ui_screen = MAIN_MEM;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,7 @@ int _ui_getZoneName(char *buf, uint8_t max_len, uint8_t index)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
zone_t zone;
|
zone_t zone;
|
||||||
result = nvm_readZoneData(&zone, index - 1);
|
result = nvm_readZoneData(&zone, index);
|
||||||
if(result != -1)
|
if(result != -1)
|
||||||
snprintf(buf, max_len, "%s", zone.name);
|
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)
|
int _ui_getChannelName(char *buf, uint8_t max_len, uint8_t index)
|
||||||
{
|
{
|
||||||
channel_t channel;
|
channel_t channel;
|
||||||
int result = nvm_readChannelData(&channel, index);
|
int result = nvm_readChannelData(&channel, index + 1);
|
||||||
if(result != -1)
|
if(result != -1)
|
||||||
snprintf(buf, max_len, "%s", channel.name);
|
snprintf(buf, max_len, "%s", channel.name);
|
||||||
return result;
|
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)
|
int _ui_getContactName(char *buf, uint8_t max_len, uint8_t index)
|
||||||
{
|
{
|
||||||
contact_t contact;
|
contact_t contact;
|
||||||
int result = nvm_readContactData(&contact, index);
|
int result = nvm_readContactData(&contact, index + 1);
|
||||||
if(result != -1)
|
if(result != -1)
|
||||||
snprintf(buf, max_len, "%s", contact.name);
|
snprintf(buf, max_len, "%s", contact.name);
|
||||||
return result;
|
return result;
|
||||||
|
|
|
||||||
|
|
@ -264,13 +264,14 @@ void nvm_loadHwInfo(hwInfo_t *info)
|
||||||
|
|
||||||
int nvm_readChannelData(channel_t *channel, uint16_t pos)
|
int nvm_readChannelData(channel_t *channel, uint16_t pos)
|
||||||
{
|
{
|
||||||
if(pos > maxNumChannels) return -1;
|
if((pos <= 0) || (pos > maxNumChannels)) return -1;
|
||||||
|
|
||||||
W25Qx_wakeup();
|
W25Qx_wakeup();
|
||||||
delayUs(5);
|
delayUs(5);
|
||||||
|
|
||||||
md3x0Channel_t chData;
|
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_readData(readAddr, ((uint8_t *) &chData), sizeof(md3x0Channel_t));
|
||||||
W25Qx_sleep();
|
W25Qx_sleep();
|
||||||
|
|
||||||
|
|
@ -342,13 +343,14 @@ int nvm_readChannelData(channel_t *channel, uint16_t pos)
|
||||||
|
|
||||||
int nvm_readZoneData(zone_t *zone, 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();
|
W25Qx_wakeup();
|
||||||
delayUs(5);
|
delayUs(5);
|
||||||
|
|
||||||
md3x0Zone_t zoneData;
|
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_readData(zoneAddr, ((uint8_t *) &zoneData), sizeof(md3x0Zone_t));
|
||||||
W25Qx_sleep();
|
W25Qx_sleep();
|
||||||
|
|
||||||
|
|
@ -373,13 +375,14 @@ int nvm_readZoneData(zone_t *zone, uint16_t pos)
|
||||||
|
|
||||||
int nvm_readContactData(contact_t *contact, 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();
|
W25Qx_wakeup();
|
||||||
delayUs(5);
|
delayUs(5);
|
||||||
|
|
||||||
md3x0Contact_t contactData;
|
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_readData(contactAddr, ((uint8_t *) &contactData), sizeof(md3x0Contact_t));
|
||||||
W25Qx_sleep();
|
W25Qx_sleep();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -286,13 +286,14 @@ void nvm_loadHwInfo(hwInfo_t *info)
|
||||||
|
|
||||||
int nvm_readChannelData(channel_t *channel, uint16_t pos)
|
int nvm_readChannelData(channel_t *channel, uint16_t pos)
|
||||||
{
|
{
|
||||||
if(pos >= maxNumChannels) return -1;
|
if((pos <= 0) || (pos > maxNumChannels)) return -1;
|
||||||
|
|
||||||
W25Qx_wakeup();
|
W25Qx_wakeup();
|
||||||
delayUs(5);
|
delayUs(5);
|
||||||
|
|
||||||
mduv3x0Channel_t chData;
|
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_readData(readAddr, ((uint8_t *) &chData), sizeof(mduv3x0Channel_t));
|
||||||
W25Qx_sleep();
|
W25Qx_sleep();
|
||||||
|
|
||||||
|
|
@ -379,15 +380,16 @@ int nvm_readChannelData(channel_t *channel, uint16_t pos)
|
||||||
|
|
||||||
int nvm_readZoneData(zone_t *zone, 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();
|
W25Qx_wakeup();
|
||||||
delayUs(5);
|
delayUs(5);
|
||||||
|
|
||||||
mduv3x0Zone_t zoneData;
|
mduv3x0Zone_t zoneData;
|
||||||
mduv3x0ZoneExt_t zoneExtData;
|
mduv3x0ZoneExt_t zoneExtData;
|
||||||
uint32_t zoneAddr = zoneBaseAddr + pos * sizeof(mduv3x0Zone_t);
|
// Note: pos is 1-based to be consistent with channels
|
||||||
uint32_t zoneExtAddr = zoneExtBaseAddr + pos * sizeof(mduv3x0ZoneExt_t);
|
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(zoneAddr, ((uint8_t *) &zoneData), sizeof(mduv3x0Zone_t));
|
||||||
W25Qx_readData(zoneExtAddr, ((uint8_t *) &zoneExtData), sizeof(mduv3x0ZoneExt_t));
|
W25Qx_readData(zoneExtAddr, ((uint8_t *) &zoneExtData), sizeof(mduv3x0ZoneExt_t));
|
||||||
W25Qx_sleep();
|
W25Qx_sleep();
|
||||||
|
|
@ -418,13 +420,14 @@ int nvm_readZoneData(zone_t *zone, uint16_t pos)
|
||||||
|
|
||||||
int nvm_readContactData(contact_t *contact, 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();
|
W25Qx_wakeup();
|
||||||
delayUs(5);
|
delayUs(5);
|
||||||
|
|
||||||
mduv3x0Contact_t contactData;
|
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_readData(contactAddr, ((uint8_t *) &contactData), sizeof(mduv3x0Contact_t));
|
||||||
W25Qx_sleep();
|
W25Qx_sleep();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ void nvm_loadHwInfo(hwInfo_t *info)
|
||||||
|
|
||||||
int nvm_readChannelData(channel_t *channel, uint16_t pos)
|
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 */
|
/* Generate dummy channel name */
|
||||||
snprintf(channel->name, 16, "Channel %d", pos);
|
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)
|
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 */
|
/* Generate dummy zone name */
|
||||||
snprintf(zone->name, 16, "Zone %d", pos);
|
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)
|
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 */
|
/* Generate dummy contact name */
|
||||||
snprintf(contact->name, 16, "Contact %d", pos);
|
snprintf(contact->name, 16, "Contact %d", pos);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue