[Taranis] Bitmap name moved to the start of the structure

[Taranis] Bitmap displayed in MODELSEL
[Taranis] Empty EEPROM is not calculated on each keypress in MODELSEL screen
[stock/stock128] Huge RAM saving (thanks Mike!)
[sky9x] Good register used for reboot cause
This commit is contained in:
bsongis@gmail.com
2013-04-19 17:49:53 +00:00
parent 2f3f2157fb
commit a23a7204cf
19 changed files with 293 additions and 240 deletions
+3 -12
View File
@@ -49,20 +49,11 @@ void eeDirty(uint8_t msk)
}
#if defined(CPUARM)
char modelNames[MAX_MODELS][sizeof(g_model.name)];
#if defined(PXX)
uint8_t modelIds[MAX_MODELS];
#endif
void eeLoadModelNames()
ModelHeader modelHeaders[MAX_MODELS];
void eeLoadModelHeaders()
{
for (uint32_t i=0; i<MAX_MODELS; i++) {
eeLoadModelName(i, modelNames[i]);
#if defined(PXX)
modelIds[i] = eeLoadModelId(i);
#endif
eeLoadModelHeader(i, &modelHeaders[i]);
}
}
#endif
+5 -12
View File
@@ -57,16 +57,9 @@ void eeLoadModelName(uint8_t id, char *name);
void eeLoadModel(uint8_t id);
#if defined(CPUARM)
extern char modelNames[MAX_MODELS][sizeof(g_model.name)];
void eeLoadModelNames();
#if defined(PXX)
extern uint8_t modelIds[MAX_MODELS];
#endif
#else // defined(CPUARM)
#define eeLoadModelNames()
extern ModelHeader modelHeaders[MAX_MODELS];
void eeLoadModelHeader(uint8_t id, ModelHeader *header);
void eeLoadModelHeaders();
#else
#define eeLoadModelHeaders()
#endif
+2 -2
View File
@@ -155,7 +155,7 @@ bool eeConvert()
}
read32_eeprom_data((File_system[id+1].block_no << 12) + sizeof(struct t_eeprom_header), (uint8_t *)&oldModel, size);
memcpy(g_model.name, oldModel.name, 10);
memcpy(g_model.header.name, oldModel.name, 10);
for (uint8_t i=0; i<2; i++) {
g_model.timers[i].mode = oldModel.timers[i].mode;
g_model.timers[i].start = oldModel.timers[i].val;
@@ -220,7 +220,7 @@ bool eeConvert()
}
g_model.ppmFrameLength = oldModel.ppmFrameLength;
g_model.thrTraceSrc = oldModel.thrTraceSrc;
g_model.modelId = oldModel.modelId;
g_model.header.modelId = oldModel.modelId;
g_model.switchWarningStates = oldModel.switchWarningStates;
g_model.frsky.usrProto = oldModel.frsky.usrProto;
g_model.frsky.voltsSource = oldModel.frsky.voltsSource;
+21 -22
View File
@@ -105,7 +105,7 @@ void eeDeleteModel(uint8_t id)
{
eeCheck(true);
memset(modelNames[id], 0, sizeof(g_model.name));
memset(modelHeaders[id].name, 0, sizeof(g_model.header.name));
Eeprom32_source_address = (uint8_t *)&g_model ; // Get data from here
Eeprom32_data_size = 0 ; // This much
@@ -121,10 +121,10 @@ bool eeCopyModel(uint8_t dst, uint8_t src)
uint16_t size = File_system[src+1].size ;
read32_eeprom_data( (File_system[src+1].block_no << 12) + sizeof( struct t_eeprom_header), ( uint8_t *)&Eeprom_buffer.data.model_data, size) ;
if (size > sizeof(g_model.name))
memcpy(modelNames[dst], Eeprom_buffer.data.model_data.name, sizeof(g_model.name));
if (size > sizeof(g_model.header.name))
memcpy(modelHeaders[dst].name, Eeprom_buffer.data.model_data.header.name, sizeof(g_model.header.name));
else
memset(modelNames[dst], 0, sizeof(g_model.name));
memset(modelHeaders[dst].name, 0, sizeof(g_model.header.name));
Eeprom32_source_address = (uint8_t *)&Eeprom_buffer.data.model_data; // Get data from here
Eeprom32_data_size = sizeof(g_model) ; // This much
@@ -146,12 +146,12 @@ void eeSwapModels(uint8_t id1, uint8_t id2)
// block_no(id1) has been shifted now, but we have the size
// TODO flash saving with function above ...
if (id2_size > sizeof(g_model.name)) {
if (id2_size > sizeof(g_model.header.name)) {
read32_eeprom_data( (id2_block_no << 12) + sizeof( struct t_eeprom_header), ( uint8_t *)&Eeprom_buffer.data.model_data, id2_size);
memcpy(modelNames[id1], Eeprom_buffer.data.model_data.name, sizeof(g_model.name));
memcpy(modelHeaders[id1].name, Eeprom_buffer.data.model_data.header.name, sizeof(g_model.header.name));
}
else {
memset(modelNames[id1], 0, sizeof(g_model.name));
memset(modelHeaders[id1].name, 0, sizeof(g_model.header.name));
}
Eeprom32_source_address = (uint8_t *)&Eeprom_buffer.data.model_data; // Get data from here
@@ -427,26 +427,25 @@ bool eeModelExists(uint8_t id)
void eeLoadModelName(uint8_t id, char *name)
{
memclear(name, sizeof(g_model.name));
memclear(name, sizeof(g_model.header.name));
if (id < MAX_MODELS) {
id += 1;
if (File_system[id].size > sizeof(g_model.name) ) {
read32_eeprom_data( ( File_system[id].block_no << 12) + 8, ( uint8_t *)name, sizeof(g_model.name));
if (File_system[id].size > sizeof(g_model.header.name) ) {
read32_eeprom_data((File_system[id].block_no << 12)+8, (uint8_t *)name, sizeof(g_model.header.name));
}
}
}
#if defined(PXX)
uint8_t eeLoadModelId(uint8_t id)
#if defined(CPUARM)
void eeLoadModelHeader(uint8_t id, ModelHeader *header)
{
uint8_t modelId = 0;
memclear(header, sizeof(ModelHeader));
if (id < MAX_MODELS) {
id += 1;
if (File_system[id].size > sizeof(g_model.name) + 1) {
read32_eeprom_data( ( File_system[id].block_no << 12) + 8 + sizeof(g_model.name), &modelId, 1);
if (File_system[id].size > sizeof(ModelHeader)) {
read32_eeprom_data((File_system[id].block_no << 12)+8, (uint8_t *)header, sizeof(ModelHeader));
}
}
return modelId;
}
#endif
@@ -484,7 +483,7 @@ void eeReadAll()
STORE_MODELVARS;
}
else {
eeLoadModelNames() ;
eeLoadModelHeaders() ;
}
stickMode = g_eeGeneral.stickMode; // TODO common!
@@ -689,7 +688,7 @@ void ee32_process()
#if defined(SDCARD)
const pm_char * eeBackupModel(uint8_t i_fileSrc)
{
char *buf = reusableBuffer.models.mainname;
char *buf = reusableBuffer.modelsel.mainname;
FIL archiveFile;
DIR archiveFolder;
UINT written;
@@ -746,7 +745,7 @@ const pm_char * eeBackupModel(uint8_t i_fileSrc)
const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
{
char *buf = reusableBuffer.models.mainname;
char *buf = reusableBuffer.modelsel.mainname;
FIL restoreFile;
UINT read;
@@ -795,10 +794,10 @@ const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
}
// TODO flash saving ...
if (read > sizeof(g_model.name))
memcpy(modelNames[i_fileDst], Eeprom_buffer.data.model_data.name, sizeof(g_model.name));
if (read > sizeof(g_model.header.name))
memcpy(modelHeaders[i_fileDst].name, Eeprom_buffer.data.model_data.header.name, sizeof(g_model.header.name));
else
memset(modelNames[i_fileDst], 0, sizeof(g_model.name));
memset(modelHeaders[i_fileDst].name, 0, sizeof(g_model.header.name));
Eeprom32_source_address = (uint8_t *)&Eeprom_buffer.data.model_data; // Get data from here
Eeprom32_data_size = sizeof(g_model); // This much
-4
View File
@@ -66,10 +66,6 @@ extern bool eeModelExists(uint8_t id) ;
extern bool eeCopyModel(uint8_t dst, uint8_t src);
extern void eeSwapModels(uint8_t id1, uint8_t id2);
#if defined(PXX)
uint8_t eeLoadModelId(uint8_t id);
#endif
#define DISPLAY_PROGRESS_BAR(x)
struct t_file_entry
+78 -27
View File
@@ -40,9 +40,12 @@
#include "string.h"
uint8_t s_write_err = 0; // error reasons
RlcFile theFile; //used for any file operation
EeFs eeFs;
#if defined(PCBTARANIS)
blkid_t freeBlocks = 0;
#endif
RlcFile theFile; //used for any file operation
EeFs eeFs;
#if !defined(CPUARM)
uint8_t s_sync_write = false;
@@ -163,15 +166,15 @@ static void EeFsFlush()
uint16_t EeFsGetFree()
{
#if defined(CPUARM)
int32_t ret = 0;
int32_t ret = freeBlocks * (BS-sizeof(blkid_t));
#else
int16_t ret = 0;
#endif
blkid_t i = eeFs.freeList;
while (i) {
ret += BS-1;
ret += BS-sizeof(blkid_t);
i = EeFsGetLink(i);
}
#endif
ret += eeFs.files[FILE_TMP].size;
ret -= eeFs.files[FILE_MODEL(g_eeGeneral.currModel)].size;
return (ret > 0 ? ret : 0);
@@ -182,7 +185,18 @@ static void EeFsFree(blkid_t blk)
{
blkid_t i = blk;
blkid_t tmp;
while ((tmp=EeFsGetLink(i))) i = tmp;
#if defined(PCBTARANIS)
freeBlocks++;
#endif
while ((tmp=EeFsGetLink(i))) {
i = tmp;
#if defined(PCBTARANIS)
freeBlocks++;
#endif
}
EeFsSetLink(i, eeFs.freeList);
eeFs.freeList = blk; //chain in front
EeFsFlushFreelist();
@@ -192,17 +206,23 @@ int8_t EeFsck()
{
ENABLE_SYNC_WRITE(true);
uint8_t *bufp = reusableBuffer.eefs_buffer;
uint8_t *bufp = (uint8_t *)&g_model;
memclear(bufp, BLOCKS);
blkid_t blk ;
#if defined(PCBTARANIS)
blkid_t blocksCount;
#endif
for (uint8_t i=0; i<=MAXFILES; i++) {
#if defined(PCBTARANIS)
blocksCount = 0;
#endif
blkid_t *startP = (i==MAXFILES ? &eeFs.freeList : &eeFs.files[i].startBlk);
blkid_t lastBlk = 0;
blk = *startP;
while (blk) {
if (blk < FIRSTBLK || // bad blk index
blk >= BLOCKS || // bad blk index
blk >= BLOCKS || // bad blk indexchan
bufp[blk]) // blk double usage
{
if (lastBlk) {
@@ -215,14 +235,25 @@ int8_t EeFsck()
blk = 0; // abort
}
else {
#if defined(PCBTARANIS)
blocksCount++;
#endif
bufp[blk] = i+1;
lastBlk = blk;
blk = EeFsGetLink(blk);
}
}
}
#if defined(PCBTARANIS)
freeBlocks = blocksCount;
#endif
for (blk=FIRSTBLK; blk<BLOCKS; blk++) {
if (!bufp[blk]) { // unused block
#if defined(PCBTARANIS)
freeBlocks++;
#endif
EeFsSetLink(blk, eeFs.freeList);
eeFs.freeList = blk; // chain in front
EeFsFlushFreelist();
@@ -248,6 +279,9 @@ void EeFsFormat()
}
EeFsSetLink(BLOCKS-1, 0);
eeFs.freeList = FIRSTBLK;
#if defined(PCBTARANIS)
freeBlocks = BLOCKS;
#endif
EeFsFlush();
ENABLE_SYNC_WRITE(false);
@@ -399,6 +433,9 @@ void RlcFile::nextWriteStep()
if (!m_currBlk && m_pos==0) {
eeFs.files[FILE_TMP].startBlk = m_currBlk = eeFs.freeList;
if (m_currBlk) {
#if defined(PCBTARANIS)
freeBlocks--;
#endif
eeFs.freeList = EeFsGetLink(m_currBlk);
m_write_step |= WRITE_FIRST_LINK;
EeFsFlushFreelist();
@@ -427,6 +464,7 @@ void RlcFile::nextWriteStep()
}
m_write_step += WRITE_NEXT_LINK_1;
EeFsSetLink(m_currBlk, eeFs.freeList);
// TODO not good
return;
}
m_currBlk = nextBlk;
@@ -434,6 +472,9 @@ void RlcFile::nextWriteStep()
switch (m_write_step & 0x0f) {
case WRITE_NEXT_LINK_1:
m_currBlk = eeFs.freeList;
#if defined(PCBTARANIS)
freeBlocks--;
#endif
eeFs.freeList = EeFsGetLink(eeFs.freeList);
m_write_step += 1;
EeFsFlushFreelist();
@@ -513,7 +554,7 @@ bool RlcFile::copy(uint8_t i_fileDst, uint8_t i_fileSrc)
extern FIL g_oLogFile;
const pm_char * eeBackupModel(uint8_t i_fileSrc)
{
char *buf = reusableBuffer.models.mainname;
char *buf = reusableBuffer.modelsel.mainname;
DIR archiveFolder;
UINT written;
@@ -532,9 +573,9 @@ const pm_char * eeBackupModel(uint8_t i_fileSrc)
buf[sizeof(MODELS_PATH)-1] = '/';
eeLoadModelName(i_fileSrc, &buf[sizeof(MODELS_PATH)]);
buf[sizeof(MODELS_PATH)+sizeof(g_model.name)] = '\0';
buf[sizeof(MODELS_PATH)+sizeof(g_model.header.name)] = '\0';
uint8_t i = sizeof(MODELS_PATH)+sizeof(g_model.name)-1;
uint8_t i = sizeof(MODELS_PATH)+sizeof(g_model.header.name)-1;
uint8_t len = 0;
while (i>sizeof(MODELS_PATH)-1) {
if (!len && buf[i])
@@ -595,7 +636,7 @@ const pm_char * eeBackupModel(uint8_t i_fileSrc)
const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
{
char *buf = reusableBuffer.models.mainname;
char *buf = reusableBuffer.modelsel.mainname;
UINT read;
// we must close the logs as we reuse the same FIL structure
@@ -742,9 +783,18 @@ void RlcFile::nextRlcWriteStep()
blkid_t fri=0;
if (m_currBlk && (fri=EeFsGetLink(m_currBlk))) {
// TODO reuse EeFsFree!!!
blkid_t prev_freeList = eeFs.freeList;
eeFs.freeList = fri;
while( EeFsGetLink(fri)) fri = EeFsGetLink(fri);
#if defined(PCBTARANIS)
freeBlocks++;
#endif
while( EeFsGetLink(fri)) {
fri = EeFsGetLink(fri);
#if defined(PCBTARANIS)
freeBlocks++;
#endif
}
m_write_step = WRITE_FREE_UNUSED_BLOCKS_STEP1;
EeFsSetLink(fri, prev_freeList);
return;
@@ -835,20 +885,21 @@ bool eeLoadGeneral()
void eeLoadModelName(uint8_t id, char *name)
{
memclear(name, sizeof(g_model.name));
memclear(name, sizeof(g_model.header.name));
if (id < MAX_MODELS) {
theFile.openRlc(FILE_MODEL(id));
theFile.readRlc((uint8_t*)name, sizeof(g_model.name));
theFile.readRlc((uint8_t*)name, sizeof(g_model.header.name));
}
}
#if defined(PXX)
// must be called just after eeLoadModelName!
uint8_t eeLoadModelIdAfterName()
#if defined(CPUARM)
void eeLoadModelHeader(uint8_t id, ModelHeader *header)
{
uint8_t modelId = 0;
theFile.readRlc(&modelId, sizeof(modelId));
return modelId;
memclear(header, sizeof(ModelHeader));
if (id < MAX_MODELS) {
theFile.openRlc(FILE_MODEL(id));
theFile.readRlc((uint8_t*)header, sizeof(ModelHeader));
}
}
#endif
@@ -950,7 +1001,7 @@ void eeReadAll()
theFile.writeRlc(FILE_MODEL(0), FILE_TYP_MODEL, (uint8_t*)&g_model, sizeof(g_model), true);
}
else {
eeLoadModelNames();
eeLoadModelHeaders();
}
stickMode = g_eeGeneral.stickMode;
@@ -985,7 +1036,7 @@ void eeCheck(bool immediately)
bool eeCopyModel(uint8_t dst, uint8_t src)
{
if (theFile.copy(FILE_MODEL(dst), FILE_MODEL(src))) {
memcpy(modelNames[dst], modelNames[src], sizeof(g_model.name));
memcpy(modelHeaders[dst].name, modelHeaders[src].name, sizeof(g_model.header.name));
return true;
}
else {
@@ -997,9 +1048,9 @@ void eeSwapModels(uint8_t id1, uint8_t id2)
{
EFile::swap(FILE_MODEL(id1), FILE_MODEL(id2));
char tmp[sizeof(g_model.name)];
memcpy(tmp, modelNames[id1], sizeof(g_model.name));
memcpy(modelNames[id1], modelNames[id2], sizeof(g_model.name));
memcpy(modelNames[id2], tmp, sizeof(g_model.name));
char tmp[sizeof(g_model.header.name)];
memcpy(tmp, modelHeaders[id1].name, sizeof(g_model.header.name));
memcpy(modelHeaders[id1].name, modelHeaders[id2].name, sizeof(g_model.header.name));
memcpy(modelHeaders[id2].name, tmp, sizeof(g_model.header.name));
}
#endif
-5
View File
@@ -144,11 +144,6 @@ class EFile
#define eeFileSize(f) eeFs.files[f].size
#define eeModelSize(id) eeFileSize(FILE_MODEL(id))
#if defined(PXX)
uint8_t eeLoadModelIdAfterName();
#define eeLoadModelId(id) eeLoadModelIdAfterName()
#endif
#define ERR_NONE 0
#define ERR_FULL 1
extern uint8_t s_write_err; // error reasons
+4 -4
View File
@@ -681,7 +681,7 @@ void lcd_invert_line(int8_t y)
#if !defined(PCBTARANIS) // TODO test inversion
void lcdDrawTelemetryTopBar()
{
putsModelName(0, 0, g_model.name, g_eeGeneral.currModel, 0);
putsModelName(0, 0, g_model.header.name, g_eeGeneral.currModel, 0);
uint8_t att = (g_vbat100mV < g_eeGeneral.vBatWarn ? BLINK : 0);
putsVBat(14*FW,0,att);
if (g_model.timers[0].mode) {
@@ -693,7 +693,7 @@ void lcdDrawTelemetryTopBar()
#else
void lcdDrawTelemetryTopBar()
{
putsModelName(0, 0, g_model.name, g_eeGeneral.currModel, 0);
putsModelName(0, 0, g_model.header.name, g_eeGeneral.currModel, 0);
uint8_t att = (g_vbat100mV < g_eeGeneral.vBatWarn ? BLINK : 0);
putsVBat(16*FW+2,0,att);
if (g_model.timers[0].mode) {
@@ -828,13 +828,13 @@ void putsChnLetter(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags attr)
void putsModelName(xcoord_t x, uint8_t y, char *name, uint8_t id, LcdFlags att)
{
uint8_t len = sizeof(g_model.name);
uint8_t len = sizeof(g_model.header.name);
while (len>0 && !name[len-1]) --len;
if (len==0) {
putsStrIdx(x, y, STR_MODEL, id+1, att|LEADING0);
}
else {
lcd_putsnAtt(x, y, name, sizeof(g_model.name), ZCHAR|att);
lcd_putsnAtt(x, y, name, sizeof(g_model.header.name), ZCHAR|att);
}
}
+3 -3
View File
@@ -62,10 +62,10 @@ const pm_char * openLogs()
}
filename[sizeof(LOGS_PATH)-1] = '/';
memcpy(&filename[sizeof(LOGS_PATH)], g_model.name, sizeof(g_model.name));
filename[sizeof(LOGS_PATH)+sizeof(g_model.name)] = '\0';
memcpy(&filename[sizeof(LOGS_PATH)], g_model.header.name, sizeof(g_model.header.name));
filename[sizeof(LOGS_PATH)+sizeof(g_model.header.name)] = '\0';
uint8_t i = sizeof(LOGS_PATH)+sizeof(g_model.name)-1;
uint8_t i = sizeof(LOGS_PATH)+sizeof(g_model.header.name)-1;
uint8_t len = 0;
while (i>sizeof(LOGS_PATH)-1) {
if (!len && filename[i])
+48 -48
View File
@@ -571,7 +571,7 @@ void onSdManagerMenu(const char *result)
#endif
if (f_mkfs(0, 1, 0) == FR_OK) {
f_chdir("/");
reusableBuffer.sd.offset = -1;
reusableBuffer.sdmanager.offset = -1;
}
else {
s_warning = STR_SDCARD_ERROR;
@@ -580,25 +580,25 @@ void onSdManagerMenu(const char *result)
else if (result == STR_DELETE_FILE) {
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
strcat_P(lfn, PSTR("/"));
strcat(lfn, reusableBuffer.sd.lines[index]);
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
f_unlink(lfn);
strncpy(statusLineMsg, reusableBuffer.sd.lines[index], 13);
strncpy(statusLineMsg, reusableBuffer.sdmanager.lines[index], 13);
strcpy_P(statusLineMsg+min((uint8_t)strlen(statusLineMsg), (uint8_t)13), STR_REMOVED);
showStatusLine();
if ((uint16_t)m_posVert == reusableBuffer.sd.count) m_posVert--;
reusableBuffer.sd.offset = s_pgOfs-1;
if ((uint16_t)m_posVert == reusableBuffer.sdmanager.count) m_posVert--;
reusableBuffer.sdmanager.offset = s_pgOfs-1;
}
#if defined(CPUARM)
/* TODO else if (result == STR_LOAD_FILE) {
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
strcat(lfn, "/");
strcat(lfn, reusableBuffer.sd.lines[index]);
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
s_warning = eeLoadModelSD(lfn);
} */
else if (result == STR_PLAY_FILE) {
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
strcat(lfn, "/");
strcat(lfn, reusableBuffer.sd.lines[index]);
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
audioQueue.playFile(lfn, PLAY_NOW);
}
#endif
@@ -617,7 +617,7 @@ void menuGeneralSdManager(uint8_t event)
char lfn[SD_SCREEN_FILE_LENGTH];
#endif
SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, menuTabDiag, e_Sd, 1+reusableBuffer.sd.count);
SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, menuTabDiag, e_Sd, 1+reusableBuffer.sdmanager.count);
if (s_editMode > 0)
s_editMode = 0;
@@ -625,7 +625,7 @@ void menuGeneralSdManager(uint8_t event)
switch(event) {
case EVT_ENTRY:
f_chdir(ROOT_PATH);
reusableBuffer.sd.offset = 65535;
reusableBuffer.sdmanager.offset = 65535;
break;
#if defined(PCBTARANIS)
@@ -638,11 +638,11 @@ void menuGeneralSdManager(uint8_t event)
{
if (m_posVert > 0) {
uint8_t index = m_posVert-1-s_pgOfs;
if (!reusableBuffer.sd.lines[index][SD_SCREEN_FILE_LENGTH+1]) {
f_chdir(reusableBuffer.sd.lines[index]);
if (!reusableBuffer.sdmanager.lines[index][SD_SCREEN_FILE_LENGTH+1]) {
f_chdir(reusableBuffer.sdmanager.lines[index]);
s_pgOfs = 0;
m_posVert = 1;
reusableBuffer.sd.offset = 65535;
reusableBuffer.sdmanager.offset = 65535;
break;
}
}
@@ -660,7 +660,7 @@ void menuGeneralSdManager(uint8_t event)
else {
#if defined(CPUARM)
uint8_t index = m_posVert-1-s_pgOfs;
char * ext = reusableBuffer.sd.lines[index];
char * ext = reusableBuffer.sdmanager.lines[index];
ext += strlen(ext) - 4;
/* TODO if (!strcmp(ext, MODELS_EXT)) {
s_menu[s_menu_count++] = STR_LOAD_FILE;
@@ -677,26 +677,26 @@ void menuGeneralSdManager(uint8_t event)
break;
}
if (reusableBuffer.sd.offset != s_pgOfs) {
if (reusableBuffer.sdmanager.offset != s_pgOfs) {
if (s_pgOfs == 0) {
reusableBuffer.sd.offset = 0;
memset(reusableBuffer.sd.lines, 0, sizeof(reusableBuffer.sd.lines));
reusableBuffer.sdmanager.offset = 0;
memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines));
}
else if (s_pgOfs == reusableBuffer.sd.count-7) {
reusableBuffer.sd.offset = s_pgOfs;
memset(reusableBuffer.sd.lines, 0, sizeof(reusableBuffer.sd.lines));
else if (s_pgOfs == reusableBuffer.sdmanager.count-7) {
reusableBuffer.sdmanager.offset = s_pgOfs;
memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines));
}
else if (s_pgOfs > reusableBuffer.sd.offset) {
memmove(reusableBuffer.sd.lines[0], reusableBuffer.sd.lines[1], 6*sizeof(reusableBuffer.sd.lines[0]));
memset(reusableBuffer.sd.lines[6], 0xff, SD_SCREEN_FILE_LENGTH);
reusableBuffer.sd.lines[6][SD_SCREEN_FILE_LENGTH+1] = 1;
else if (s_pgOfs > reusableBuffer.sdmanager.offset) {
memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], 6*sizeof(reusableBuffer.sdmanager.lines[0]));
memset(reusableBuffer.sdmanager.lines[6], 0xff, SD_SCREEN_FILE_LENGTH);
reusableBuffer.sdmanager.lines[6][SD_SCREEN_FILE_LENGTH+1] = 1;
}
else {
memmove(reusableBuffer.sd.lines[1], reusableBuffer.sd.lines[0], 6*sizeof(reusableBuffer.sd.lines[0]));
memset(reusableBuffer.sd.lines[0], 0, sizeof(reusableBuffer.sd.lines[0]));
memmove(reusableBuffer.sdmanager.lines[1], reusableBuffer.sdmanager.lines[0], 6*sizeof(reusableBuffer.sdmanager.lines[0]));
memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0]));
}
reusableBuffer.sd.count = 0;
reusableBuffer.sdmanager.count = 0;
FRESULT res = f_opendir(&dir, "."); /* Open the directory */
if (res == FR_OK) {
@@ -711,62 +711,62 @@ void menuGeneralSdManager(uint8_t event)
#endif
if (strlen(fn) > SD_SCREEN_FILE_LENGTH) continue;
reusableBuffer.sd.count++;
reusableBuffer.sdmanager.count++;
bool isfile = !(fno.fattrib & AM_DIR);
if (s_pgOfs == 0) {
for (uint8_t i=0; i<LCD_LINES-1; i++) {
char *line = reusableBuffer.sd.lines[i];
char *line = reusableBuffer.sdmanager.lines[i];
if (line[0] == '\0' || isFilenameLower(isfile, fn, line)) {
if (i < 6) memmove(reusableBuffer.sd.lines[i+1], line, sizeof(reusableBuffer.sd.lines[i]) * (6-i));
memset(line, 0, sizeof(reusableBuffer.sd.lines[i]));
if (i < 6) memmove(reusableBuffer.sdmanager.lines[i+1], line, sizeof(reusableBuffer.sdmanager.lines[i]) * (6-i));
memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[i]));
strcpy(line, fn);
line[SD_SCREEN_FILE_LENGTH+1] = isfile;
break;
}
}
}
else if (reusableBuffer.sd.offset == s_pgOfs) {
else if (reusableBuffer.sdmanager.offset == s_pgOfs) {
for (int8_t i=6; i>=0; i--) {
char *line = reusableBuffer.sd.lines[i];
char *line = reusableBuffer.sdmanager.lines[i];
if (line[0] == '\0' || isFilenameGreater(isfile, fn, line)) {
if (i > 0) memmove(reusableBuffer.sd.lines[0], reusableBuffer.sd.lines[1], sizeof(reusableBuffer.sd.lines[0]) * i);
memset(line, 0, sizeof(reusableBuffer.sd.lines[i]));
if (i > 0) memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], sizeof(reusableBuffer.sdmanager.lines[0]) * i);
memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[i]));
strcpy(line, fn);
line[SD_SCREEN_FILE_LENGTH+1] = isfile;
break;
}
}
}
else if (s_pgOfs > reusableBuffer.sd.offset) {
if (isFilenameGreater(isfile, fn, reusableBuffer.sd.lines[5]) && isFilenameLower(isfile, fn, reusableBuffer.sd.lines[6])) {
memset(reusableBuffer.sd.lines[6], 0, sizeof(reusableBuffer.sd.lines[0]));
strcpy(reusableBuffer.sd.lines[6], fn);
reusableBuffer.sd.lines[6][SD_SCREEN_FILE_LENGTH+1] = isfile;
else if (s_pgOfs > reusableBuffer.sdmanager.offset) {
if (isFilenameGreater(isfile, fn, reusableBuffer.sdmanager.lines[5]) && isFilenameLower(isfile, fn, reusableBuffer.sdmanager.lines[6])) {
memset(reusableBuffer.sdmanager.lines[6], 0, sizeof(reusableBuffer.sdmanager.lines[0]));
strcpy(reusableBuffer.sdmanager.lines[6], fn);
reusableBuffer.sdmanager.lines[6][SD_SCREEN_FILE_LENGTH+1] = isfile;
}
}
else {
if (isFilenameLower(isfile, fn, reusableBuffer.sd.lines[1]) && isFilenameGreater(isfile, fn, reusableBuffer.sd.lines[0])) {
memset(reusableBuffer.sd.lines[0], 0, sizeof(reusableBuffer.sd.lines[0]));
strcpy(reusableBuffer.sd.lines[0], fn);
reusableBuffer.sd.lines[0][SD_SCREEN_FILE_LENGTH+1] = isfile;
if (isFilenameLower(isfile, fn, reusableBuffer.sdmanager.lines[1]) && isFilenameGreater(isfile, fn, reusableBuffer.sdmanager.lines[0])) {
memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0]));
strcpy(reusableBuffer.sdmanager.lines[0], fn);
reusableBuffer.sdmanager.lines[0][SD_SCREEN_FILE_LENGTH+1] = isfile;
}
}
}
}
}
reusableBuffer.sd.offset = s_pgOfs;
reusableBuffer.sdmanager.offset = s_pgOfs;
for (uint8_t i=0; i<LCD_LINES-1; i++) {
uint8_t y = 1 + FH + i*FH;
uint8_t x = 0;
uint8_t attr = (m_posVert-1-s_pgOfs == i ? BSS|INVERS : BSS);
if (reusableBuffer.sd.lines[i][0]) {
if (!reusableBuffer.sd.lines[i][SD_SCREEN_FILE_LENGTH+1]) { lcd_putcAtt(0, y, '[', attr); x += FW; }
lcd_putsAtt(x, y, reusableBuffer.sd.lines[i], attr);
if (!reusableBuffer.sd.lines[i][SD_SCREEN_FILE_LENGTH+1]) { lcd_putcAtt(lcdLastPos, y, ']', attr); }
if (reusableBuffer.sdmanager.lines[i][0]) {
if (!reusableBuffer.sdmanager.lines[i][SD_SCREEN_FILE_LENGTH+1]) { lcd_putcAtt(0, y, '[', attr); x += FW; }
lcd_putsAtt(x, y, reusableBuffer.sdmanager.lines[i], attr);
if (!reusableBuffer.sdmanager.lines[i][SD_SCREEN_FILE_LENGTH+1]) { lcd_putcAtt(lcdLastPos, y, ']', attr); }
}
}
}
+66 -51
View File
@@ -128,12 +128,12 @@ bool listSdFiles(const char *path, const char *extension, const uint8_t maxlen,
if (selection) {
s_last_flags = flags;
memset(reusableBuffer.models.menu_bss, 0, sizeof(reusableBuffer.models.menu_bss));
strcpy(reusableBuffer.models.menu_bss[0], path);
strcat(reusableBuffer.models.menu_bss[0], "/");
strncat(reusableBuffer.models.menu_bss[0], selection, maxlen);
strcat(reusableBuffer.models.menu_bss[0], extension);
if (f_stat(reusableBuffer.models.menu_bss[0], &fno) != FR_OK) {
memset(reusableBuffer.modelsel.menu_bss, 0, sizeof(reusableBuffer.modelsel.menu_bss));
strcpy(reusableBuffer.modelsel.menu_bss[0], path);
strcat(reusableBuffer.modelsel.menu_bss[0], "/");
strncat(reusableBuffer.modelsel.menu_bss[0], selection, maxlen);
strcat(reusableBuffer.modelsel.menu_bss[0], extension);
if (f_stat(reusableBuffer.modelsel.menu_bss[0], &fno) != FR_OK) {
selection = NULL;
}
}
@@ -144,19 +144,19 @@ bool listSdFiles(const char *path, const char *extension, const uint8_t maxlen,
if (s_menu_offset == 0) {
s_last_menu_offset = 0;
memset(reusableBuffer.models.menu_bss, 0, sizeof(reusableBuffer.models.menu_bss));
memset(reusableBuffer.modelsel.menu_bss, 0, sizeof(reusableBuffer.modelsel.menu_bss));
}
else if (s_menu_offset == s_last_menu_offset) {
// should not happen, only there because of Murphy's law
return true;
}
else if (s_menu_offset > s_last_menu_offset) {
memmove(reusableBuffer.models.menu_bss[0], reusableBuffer.models.menu_bss[1], (MENU_MAX_LINES-1)*MENU_LINE_LENGTH);
memset(reusableBuffer.models.menu_bss[MENU_MAX_LINES-1], 0xff, MENU_LINE_LENGTH);
memmove(reusableBuffer.modelsel.menu_bss[0], reusableBuffer.modelsel.menu_bss[1], (MENU_MAX_LINES-1)*MENU_LINE_LENGTH);
memset(reusableBuffer.modelsel.menu_bss[MENU_MAX_LINES-1], 0xff, MENU_LINE_LENGTH);
}
else {
memmove(reusableBuffer.models.menu_bss[1], reusableBuffer.models.menu_bss[0], (MENU_MAX_LINES-1)*MENU_LINE_LENGTH);
memset(reusableBuffer.models.menu_bss[0], 0, MENU_LINE_LENGTH);
memmove(reusableBuffer.modelsel.menu_bss[1], reusableBuffer.modelsel.menu_bss[0], (MENU_MAX_LINES-1)*MENU_LINE_LENGTH);
memset(reusableBuffer.modelsel.menu_bss[0], 0, MENU_LINE_LENGTH);
}
s_menu_count = 0;
@@ -171,7 +171,7 @@ bool listSdFiles(const char *path, const char *extension, const uint8_t maxlen,
s_last_menu_offset++;
}
else if (s_menu_offset==0 || s_menu_offset < s_last_menu_offset) {
char *line = reusableBuffer.models.menu_bss[0];
char *line = reusableBuffer.modelsel.menu_bss[0];
memset(line, 0, MENU_LINE_LENGTH);
strcpy(line, "---");
s_menu[0] = line;
@@ -200,9 +200,9 @@ bool listSdFiles(const char *path, const char *extension, const uint8_t maxlen,
}
else {
for (uint8_t i=0; i<MENU_MAX_LINES; i++) {
char *line = reusableBuffer.models.menu_bss[i];
char *line = reusableBuffer.modelsel.menu_bss[i];
if (line[0] == '\0' || strcmp(fn, line) < 0) {
if (i < MENU_MAX_LINES-1) memmove(reusableBuffer.models.menu_bss[i+1], line, sizeof(reusableBuffer.models.menu_bss[i]) * (MENU_MAX_LINES-1-i));
if (i < MENU_MAX_LINES-1) memmove(reusableBuffer.modelsel.menu_bss[i+1], line, sizeof(reusableBuffer.modelsel.menu_bss[i]) * (MENU_MAX_LINES-1-i));
memset(line, 0, MENU_LINE_LENGTH);
strcpy(line, fn);
break;
@@ -210,18 +210,18 @@ bool listSdFiles(const char *path, const char *extension, const uint8_t maxlen,
}
}
for (uint8_t i=0; i<min(s_menu_count, (uint16_t)MENU_MAX_LINES); i++)
s_menu[i] = reusableBuffer.models.menu_bss[i];
s_menu[i] = reusableBuffer.modelsel.menu_bss[i];
}
else if (s_menu_offset > s_last_menu_offset) {
if (strcmp(fn, reusableBuffer.models.menu_bss[MENU_MAX_LINES-2]) > 0 && strcmp(fn, reusableBuffer.models.menu_bss[MENU_MAX_LINES-1]) < 0) {
memset(reusableBuffer.models.menu_bss[MENU_MAX_LINES-1], 0, MENU_LINE_LENGTH);
strcpy(reusableBuffer.models.menu_bss[MENU_MAX_LINES-1], fn);
if (strcmp(fn, reusableBuffer.modelsel.menu_bss[MENU_MAX_LINES-2]) > 0 && strcmp(fn, reusableBuffer.modelsel.menu_bss[MENU_MAX_LINES-1]) < 0) {
memset(reusableBuffer.modelsel.menu_bss[MENU_MAX_LINES-1], 0, MENU_LINE_LENGTH);
strcpy(reusableBuffer.modelsel.menu_bss[MENU_MAX_LINES-1], fn);
}
}
else {
if (strcmp(fn, reusableBuffer.models.menu_bss[1]) < 0 && strcmp(fn, reusableBuffer.models.menu_bss[0]) > 0) {
memset(reusableBuffer.models.menu_bss[0], 0, MENU_LINE_LENGTH);
strcpy(reusableBuffer.models.menu_bss[0], fn);
if (strcmp(fn, reusableBuffer.modelsel.menu_bss[1]) < 0 && strcmp(fn, reusableBuffer.modelsel.menu_bss[0]) > 0) {
memset(reusableBuffer.modelsel.menu_bss[0], 0, MENU_LINE_LENGTH);
strcpy(reusableBuffer.modelsel.menu_bss[0], fn);
}
}
}
@@ -267,7 +267,7 @@ void onModelSelectMenu(const char *result)
s_warning = eeBackupModel(sub);
}
else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) {
if (!listSdFiles(MODELS_PATH, MODELS_EXT, sizeof(g_model.name), NULL)) {
if (!listSdFiles(MODELS_PATH, MODELS_EXT, sizeof(g_model.header.name), NULL)) {
s_warning = STR_NO_MODELS_ON_SD;
s_menu_flags = 0;
}
@@ -277,13 +277,13 @@ void onModelSelectMenu(const char *result)
s_warning = STR_DELETEMODEL;
s_warning_type = WARNING_TYPE_CONFIRM;
#if defined(CPUARM)
s_warning_info = modelNames[sub];
s_warning_info = modelHeaders[sub].name;
#else
char * name = reusableBuffer.models.mainname;
char * name = reusableBuffer.modelsel.mainname;
eeLoadModelName(sub, name);
s_warning_info = name;
#endif
s_warning_info_len = sizeof(g_model.name);
s_warning_info_len = sizeof(g_model.header.name);
}
#if defined(SDCARD)
else {
@@ -333,6 +333,11 @@ void menuModelSelect(uint8_t event)
}
#endif
#if defined(PCBTARANIS)
static int8_t modelselBitmapIdx = -1;
static uint8_t modelselBitmap[MODEL_BITMAP_SIZE];
#endif
int8_t sub = m_posVert;
switch (event)
@@ -348,13 +353,13 @@ void menuModelSelect(uint8_t event)
s_warning = STR_DELETEMODEL;
s_warning_type = WARNING_TYPE_CONFIRM;
#if defined(CPUARM)
s_warning_info = modelNames[sub];
s_warning_info = modelHeaders[sub].name;
#else
char * name = reusableBuffer.models.mainname;
char * name = reusableBuffer.modelsel.mainname;
eeLoadModelName(sub, name);
s_warning_info = name;
#endif
s_warning_info_len = sizeof(g_model.name);
s_warning_info_len = sizeof(g_model.header.name);
killEvents(event);
break;
}
@@ -542,18 +547,17 @@ void menuModelSelect(uint8_t event)
s_copyTgtOfs = next_ofs;
}
break;
}
#if defined(PCBTARANIS)
lcd_puts(27*FW-(LEN_FREE-4)*FW, 0, STR_FREE);
if (event) reusableBuffer.models.eepromfree = EeFsGetFree();
lcd_outdezAtt(20*FW, 0, reusableBuffer.models.eepromfree, 0);
if (event) reusableBuffer.modelsel.eepromfree = EeFsGetFree();
lcd_outdezAtt(20*FW, 0, reusableBuffer.modelsel.eepromfree, 0);
lcd_puts(21*FW, 0, STR_BYTES);
#elif !defined(PCBSKY9X)
lcd_puts(9*FW-(LEN_FREE-4)*FW, 0, STR_FREE);
if (event) reusableBuffer.models.eepromfree = EeFsGetFree();
lcd_outdezAtt(17*FW, 0, reusableBuffer.models.eepromfree, 0);
if (event) reusableBuffer.modelsel.eepromfree = EeFsGetFree();
lcd_outdezAtt(17*FW, 0, reusableBuffer.modelsel.eepromfree, 0);
#endif
#if defined(ROTARY_ENCODER_NAVIGATION)
@@ -592,12 +596,12 @@ void menuModelSelect(uint8_t event)
if (eeModelExists(k)) {
#if defined(PCBSKY9X)
putsModelName(4*FW, y, modelNames[k], k, 0);
putsModelName(4*FW, y, modelHeaders[k].name, k, 0);
#elif defined(CPUARM)
putsModelName(4*FW, y, modelNames[k], k, 0);
putsModelName(4*FW, y, modelHeaders[k].name, k, 0);
lcd_outdezAtt(20*FW, y, eeModelSize(k), 0);
#else
char * name = reusableBuffer.models.listnames[i];
char * name = reusableBuffer.modelsel.listnames[i];
if (event) eeLoadModelName(k, name);
putsModelName(4*FW, y, name, k, 0);
lcd_outdezAtt(20*FW, y, eeModelSize(k), 0);
@@ -610,6 +614,17 @@ void menuModelSelect(uint8_t event)
lcd_rect(8, y-1, LCD_W-1-7, 9, s_copyMode == COPY_MODE ? SOLID : DOTTED);
}
}
#if defined(PCBTARANIS)
if (modelselBitmapIdx != m_posVert) {
modelselBitmapIdx = m_posVert;
if (modelselBitmapIdx == g_eeGeneral.currModel)
memcpy(modelselBitmap, modelBitmap, MODEL_BITMAP_SIZE);
else
loadModelBitmap(modelHeaders[sub].bitmap, modelselBitmap);
}
lcd_bmp(22*FW+2, 2*FH+FH/2, modelselBitmap);
#endif
}
#if defined(PCBTARANIS)
@@ -858,14 +873,14 @@ enum menuModelSetupItems {
void onModelSetupMenu(const char *result)
{
if (result == STR_UPDATE_LIST) {
if (!listSdFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.bitmap), NULL)) {
if (!listSdFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), NULL)) {
s_warning = STR_NO_BITMAPS_ON_SD;
s_menu_flags = 0;
}
}
else {
// The user choosed a bmp file in the list
memcpy(g_model.bitmap, result, sizeof(g_model.bitmap));
memcpy(g_model.header.bitmap, result, sizeof(g_model.header.bitmap));
LOAD_MODEL_BITMAP();
eeDirty(EE_MODEL);
}
@@ -927,22 +942,22 @@ void menuModelSetup(uint8_t event)
switch(k) {
case ITEM_MODEL_NAME:
editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_MODELNAME, g_model.name, sizeof(g_model.name), event, attr);
editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_MODELNAME, g_model.header.name, sizeof(g_model.header.name), event, attr);
#if defined(CPUARM)
memcpy(modelNames[g_eeGeneral.currModel], g_model.name, sizeof(g_model.name));
memcpy(modelHeaders[g_eeGeneral.currModel].name, g_model.header.name, sizeof(g_model.header.name));
#endif
break;
#if defined(PCBTARANIS) && defined(SDCARD)
case ITEM_MODEL_BITMAP:
lcd_putsLeft(y, STR_BITMAP);
if (ZLEN(g_model.bitmap) > 0)
lcd_putsnAtt(MODEL_SETUP_2ND_COLUMN, y, g_model.bitmap, sizeof(g_model.bitmap), attr);
if (ZLEN(g_model.header.bitmap) > 0)
lcd_putsnAtt(MODEL_SETUP_2ND_COLUMN, y, g_model.header.bitmap, sizeof(g_model.header.bitmap), attr);
else
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_VCSWFUNC, 0, attr);
if (attr && event==EVT_KEY_BREAK(KEY_ENTER)) {
s_editMode = 0;
if (listSdFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.bitmap), g_model.bitmap, LIST_NONE_SD_FILE)) {
if (listSdFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), g_model.header.bitmap, LIST_NONE_SD_FILE)) {
menuHandler = onModelSetupMenu;
}
else {
@@ -1222,12 +1237,12 @@ void menuModelSetup(uint8_t event)
else {
lcd_putsLeft(y, STR_RXNUM);
if (IS_MODULE_XJT(moduleIdx)) {
lcd_outdezNAtt(MODEL_SETUP_2ND_COLUMN, y, g_model.modelId, (m_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
lcd_outdezNAtt(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId, (m_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
if (attr && m_posHorz==0) {
if (editMode>0 || p1valdiff) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.modelId, 63);
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId, 63);
if (checkIncDec_Ret)
modelIds[g_eeGeneral.currModel] = g_model.modelId;
modelHeaders[g_eeGeneral.currModel].modelId = g_model.header.modelId;
}
if (editMode==0 && event==EVT_KEY_BREAK(KEY_ENTER))
checkModelIdUnique(g_eeGeneral.currModel);
@@ -1396,12 +1411,12 @@ void menuModelSetup(uint8_t event)
}
lcd_putsLeft(y, STR_RXNUM);
lcd_outdezNAtt(MODEL_SETUP_2ND_COLUMN-3*FW, y, g_model.modelId, (m_posHorz<=0 ? attr : 0) | LEADING0|LEFT, 2);
lcd_outdezNAtt(MODEL_SETUP_2ND_COLUMN-3*FW, y, g_model.header.modelId, (m_posHorz<=0 ? attr : 0) | LEADING0|LEFT, 2);
if (attr && (m_posHorz==0 && (editMode>0 || p1valdiff))) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.modelId, 99);
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId, 99);
#if defined(CPUARM)
if (checkIncDec_Ret)
modelIds[g_eeGeneral.currModel] = g_model.modelId;
modelHeaders[g_eeGeneral.currModel].modelId = g_model.header.modelId;
#endif
}
@@ -1990,7 +2005,7 @@ typedef int16_t (*FnFuncP) (int16_t x);
int16_t expoFn(int16_t x)
{
ExpoData *ed = expoaddress(s_currIdx);
int16_t anas[NUM_STICKS] = {0};
int16_t anas[NUM_INPUTS] = {0};
anas[ed->chn] = x;
applyExpos(anas);
return anas[ed->chn];
@@ -2981,7 +2996,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t event)
uint8_t cur = 1;
uint8_t i = 0;
for (uint8_t ch=1; ch<=(expo ? NUM_STICKS : NUM_CHNOUT); ch++) {
for (uint8_t ch=1; ch<=(expo ? NUM_INPUTS : NUM_CHNOUT); ch++) {
void *pointer = NULL; MixData * &md = (MixData * &)pointer; ExpoData * &ed = (ExpoData * &)pointer;
uint8_t y = 1+(cur-s_pgOfs)*FH;
if (expo ? (i<MAX_EXPOS && (ed=expoaddress(i))->chn+1 == ch && ed->mode) : (i<MAX_MIXERS && (md=mixaddress(i))->srcRaw && md->destCh+1 == ch)) {
+23 -14
View File
@@ -52,9 +52,9 @@
#define BEEP_VAL ( (g_eeGeneral.warnOpts & WARN_BVAL_BIT) >>3 )
#if defined(PCBTARANIS)
#define EEPROM_VER 214
#define EEPROM_VER 215
#elif defined(PCBSKY9X)
#define EEPROM_VER 214
#define EEPROM_VER 215
#elif defined(PCBGRUVIN9X)
#define EEPROM_VER 214
#elif defined(CPUM2561)
@@ -225,14 +225,17 @@ PACK(typedef struct t_ModuleData {
}) ModuleData;
#if defined(PCBTARANIS)
#define MODELDATA_EXTRA char bitmap[10]; uint8_t externalModule; ModuleData moduleData[NUM_MODULES]; uint8_t trainerMode; char curveNames[MAX_CURVES][6];
#define MODELDATA_BITMAP char bitmap[LEN_BITMAP_NAME];
#define MODELDATA_EXTRA uint8_t externalModule; ModuleData moduleData[NUM_MODULES]; uint8_t trainerMode; char curveNames[MAX_CURVES][6];
#define LIMITDATA_EXTRA char name[6];
#define swstate_t uint16_t
#elif defined(PCBSKY9X)
#define MODELDATA_BITMAP
#define MODELDATA_EXTRA uint8_t ppmSCH; int8_t ppm2SCH; int8_t ppm2NCH; ModuleData moduleData[NUM_MODULES];
#define LIMITDATA_EXTRA
#define swstate_t uint8_t
#else
#define MODELDATA_BITMAP
#define MODELDATA_EXTRA
#define LIMITDATA_EXTRA
#define swstate_t uint8_t
@@ -302,6 +305,7 @@ PACK(typedef struct t_EEGeneral {
#if defined(PCBTARANIS)
#define LEN_MODEL_NAME 12
#define LEN_BITMAP_NAME 10
#define LEN_EXPOMIX_NAME 10
#define LEN_FP_NAME 10
#elif defined(PCBSKY9X)
@@ -315,14 +319,14 @@ PACK(typedef struct t_EEGeneral {
#if defined(CPUARM)
PACK(typedef struct t_ExpoData {
uint8_t mode; // 0=end, 1=pos, 2=neg, 3=both
uint8_t chn;
int8_t swtch;
uint8_t mode; // 0=end, 1=pos, 2=neg, 3=both
uint8_t chn;
int8_t swtch;
uint16_t phases;
int8_t weight;
uint8_t curveMode;
char name[LEN_EXPOMIX_NAME];
int8_t curveParam;
int8_t weight;
uint8_t curveMode;
char name[LEN_EXPOMIX_NAME];
int8_t curveParam;
}) ExpoData;
#elif defined(PCBGRUVIN9X) || defined(CPUM2561)
PACK(typedef struct t_ExpoData {
@@ -509,8 +513,8 @@ PACK( union u_int8int16_t {
#define MAX_CSW_DELAY 120 /*60s*/
#define MAX_CSW_ANDSW MAX_SWITCH
PACK(typedef struct t_CustomSwData { // Custom Switches data
int8_t v1;
int8_t v2; // TODO EEPROM change
int16_t v1;
int16_t v2;
uint8_t func;
uint8_t delay;
uint8_t duration;
@@ -1198,13 +1202,18 @@ enum FailsafeModes {
#define BeepANACenter uint8_t
#endif
PACK(typedef struct t_ModelData {
PACK(typedef struct t_ModelHeader {
char name[LEN_MODEL_NAME]; // must be first for eeLoadModelName
uint8_t modelId;
MODELDATA_BITMAP
}) ModelHeader;
PACK(typedef struct t_ModelData {
ModelHeader header;
TimerData timers[MAX_TIMERS];
uint8_t protocol:3;
uint8_t thrTrim:1; // Enable Throttle Trim
int8_t ppmNCH:4; /* TODO EEPROM change */
int8_t ppmNCH:4;
uint8_t trimInc:3; // Trim Increments
uint8_t disableThrottleWarning:1;
uint8_t pulsePol:1;
+11 -10
View File
@@ -94,14 +94,15 @@ ModelData g_model;
#if defined(PCBTARANIS) && defined(SDCARD)
uint8_t modelBitmap[MODEL_BITMAP_SIZE];
pm_char * modelBitmapLoaded = NULL;
void loadModelBitmap()
void loadModelBitmap(char *name, uint8_t *bitmap)
{
char lfn[] = BITMAPS_PATH "/xxxxxxxxxx.bmp";
strncpy(lfn+sizeof(BITMAPS_PATH), g_model.bitmap, sizeof(g_model.bitmap));
lfn[sizeof(BITMAPS_PATH)+sizeof(g_model.bitmap)] = '\0';
strncpy(lfn+sizeof(BITMAPS_PATH), name, LEN_BITMAP_NAME);
lfn[sizeof(BITMAPS_PATH)+LEN_BITMAP_NAME] = '\0';
strcat(lfn+sizeof(BITMAPS_PATH), BITMAPS_EXT);
modelBitmapLoaded = bmpLoad(modelBitmap, lfn, MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT);
if (bmpLoad(bitmap, lfn, MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT)) {
memcpy(bitmap, logo_taranis, MODEL_BITMAP_SIZE);
}
}
#endif
@@ -405,7 +406,7 @@ inline void applyDefaultTemplate()
void checkModelIdUnique(uint8_t id)
{
for (uint8_t i=0; i<MAX_MODELS; i++) {
if (i != id && g_model.modelId!=0 && g_model.modelId == modelIds[i]) {
if (i!=id && g_model.header.modelId!=0 && g_model.header.modelId==modelHeaders[i].modelId) {
s_warning = PSTR("Model ID already used");
s_warning_type = WARNING_TYPE_ASTERISK;
}
@@ -419,7 +420,7 @@ void modelDefault(uint8_t id)
applyDefaultTemplate();
#if defined(PXX) && defined(CPUARM)
modelIds[id] = g_model.modelId = id+1;
modelHeaders[id].modelId = g_model.header.modelId = id+1;
checkModelIdUnique(id);
#endif
@@ -641,7 +642,7 @@ ACTIVE_EXPOS_TYPE activeExpos;
void applyExpos(int16_t *anas)
{
int16_t anas2[NUM_STICKS]; // values before expo, to ensure same expo base when multiple expo lines are used
int16_t anas2[NUM_INPUTS]; // values before expo, to ensure same expo base when multiple expo lines are used
memcpy(anas2, anas, sizeof(anas2));
int8_t cur_chn = -1;
@@ -2133,8 +2134,8 @@ uint16_t isqrt32(uint32_t n)
// static variables used in perOut - moved here so they don't interfere with the stack
// It's also easier to initialize them here.
int16_t rawAnas [NUM_STICKS] = {0};
int16_t anas [NUM_STICKS] = {0};
int16_t rawAnas [NUM_INPUTS] = {0};
int16_t anas [NUM_INPUTS] = {0};
int16_t trims[NUM_STICKS] = {0};
int32_t chans[NUM_CHNOUT] = {0};
uint8_t inacPrescale;
+19 -15
View File
@@ -419,9 +419,8 @@ enum EnumKeys {
#define MODEL_BITMAP_HEIGHT 32
#define MODEL_BITMAP_SIZE (2+4*(MODEL_BITMAP_WIDTH*MODEL_BITMAP_HEIGHT/8))
extern uint8_t modelBitmap[MODEL_BITMAP_SIZE];
extern pm_char * modelBitmapLoaded;
void loadModelBitmap();
#define LOAD_MODEL_BITMAP() loadModelBitmap()
void loadModelBitmap(char *name, uint8_t *bitmap);
#define LOAD_MODEL_BITMAP() loadModelBitmap(g_model.header.bitmap, modelBitmap)
#else
#define LOAD_MODEL_BITMAP()
#endif
@@ -1056,6 +1055,12 @@ extern int16_t ex_chans[NUM_CHNOUT]; // Outputs (before LIMITS) of th
extern int16_t channelOutputs[NUM_CHNOUT];
extern uint16_t BandGap;
#if defined(CPUARM)
#define NUM_INPUTS (NUM_STICKS)
#else
#define NUM_INPUTS (NUM_STICKS)
#endif
extern int16_t expo(int16_t x, int16_t k);
extern int16_t intpol(int16_t, uint8_t);
extern int16_t applyCurve(int16_t, int8_t);
@@ -1273,30 +1278,25 @@ extern uint8_t requiredSpeakerVolume;
#define SD_SCREEN_FILE_LENGTH (32)
union ReusableBuffer
{
/* 128 bytes on stock */
#if !defined(PCBSKY9X)
uint8_t eefs_buffer[BLOCKS]; // 128bytes used by EeFsck
#endif
struct
{
char mainname[42];
char listnames[LCD_LINES-1][LEN_MODEL_NAME];
uint16_t eepromfree;
#if defined(SDCARD)
char menu_bss[MENU_MAX_LINES][MENU_LINE_LENGTH];
char mainname[42]; // because reused for SD backup / restore
#else
char mainname[LEN_MODEL_NAME];
#endif
} models; // 128bytes used by menuModelSelect (mainname reused for SD card archive / restore)
} modelsel;
struct
{
int16_t midVals[NUM_STICKS+NUM_POTS];
int16_t loVals[NUM_STICKS+NUM_POTS];
int16_t hiVals[NUM_STICKS+NUM_POTS];
} calib; // 42 bytes used by menuGeneralCalib
} calib;
#if defined(SDCARD)
struct
@@ -1305,7 +1305,7 @@ union ReusableBuffer
uint32_t available;
uint16_t offset;
uint16_t count;
} sd;
} sdmanager;
#endif
};
@@ -1323,7 +1323,7 @@ void putsTelemetryValue(xcoord_t x, uint8_t y, lcdint_t val, uint8_t unit, uint8
#if defined(CPUARM)
uint8_t zlen(const char *str, uint8_t size);
char * strcat_zchar(char * dest, char * name, uint8_t size, const char *defaultName, uint8_t defaultNameSize, uint8_t defaultIdx);
#define strcat_modelname(dest, idx) strcat_zchar(dest, modelNames[idx], LEN_MODEL_NAME, STR_MODEL, PSIZE(TR_MODEL), idx+1)
#define strcat_modelname(dest, idx) strcat_zchar(dest, modelHeaders[idx].name, LEN_MODEL_NAME, STR_MODEL, PSIZE(TR_MODEL), idx+1)
#define strcat_phasename(dest, idx) strcat_zchar(dest, g_model.phaseData[idx].name, LEN_FP_NAME, NULL, 0, 0)
#define strcat_mixername(dest, idx) strcat_zchar(dest, g_model.mixData[idx].name, LEN_EXPOMIX_NAME, NULL, 0, 0)
#define ZLEN(s) zlen(s, sizeof(s))
@@ -1410,4 +1410,8 @@ void varioWakeup();
#define IS_USR_PROTO_WS_HOW_HIGH() (g_model.frsky.usrProto == USR_PROTO_WS_HOW_HIGH)
#endif
#if defined(PCBTARANIS)
extern const pm_uchar logo_taranis[];
#endif
#endif
+2 -2
View File
@@ -407,7 +407,7 @@ void setupPulsesPXX(MODULE_INDEX_PARAM)
putPcmHead(module_index);
/* Rx Number */
putPcmByte(g_model.modelId, module_index);
putPcmByte(g_model.header.modelId, module_index);
#else
PcmCrc = 0;
PcmOnesCount = 0;
@@ -416,7 +416,7 @@ void setupPulsesPXX(MODULE_INDEX_PARAM)
putPcmHead();
/* Rx Number */
putPcmByte(g_model.modelId);
putPcmByte(g_model.header.modelId);
#endif
/* FLAG1 */
+3 -3
View File
@@ -319,7 +319,7 @@ void setupPulsesPXX()
PcmBitCount = PcmByte = 0 ;
PcmOnesCount = 0 ;
putPcmHead() ;
putPcmByte( g_model.modelId ) ; // putPcmByte( g_model.rxnum ) ; //
putPcmByte( g_model.header.modelId ) ; // putPcmByte( g_model.rxnum ) ; //
putPcmByte( pxxFlag[0] ) ; // First byte of flags
putPcmByte( 0 ) ; // Second byte of flags
pxxFlag[0] = 0; // reset flag after send
@@ -403,7 +403,7 @@ FORCEINLINE void setupPulsesDsm2()
s_bind_mode = false;
++ptr;
*ptr++ = g_model.modelId;
*ptr++ = g_model.header.modelId;
for (uint8_t i=0; i<DSM2_CHANS; i++)
{
uint16_t pulse = limit(0, ((channelOutputs[i]*13)>>5)+512,1023);
@@ -531,7 +531,7 @@ void setupPulsesDsm2()
else
s_bind_mode = false;
dsmDat[1] = g_model.modelId; // DSM2 Header second byte for model match
dsmDat[1] = g_model.header.modelId; // DSM2 Header second byte for model match
for (uint8_t i=0; i<DSM2_CHANS; i++)
{
uint16_t pulse = limit(0, ((channelOutputs[i]*13)>>5)+512,1023);
+2
View File
@@ -385,6 +385,8 @@ int main(int argc,char **argv)
frskyStreaming = 1;
#endif
printf("Model size = %d\n", sizeof(g_model));
StartEepromThread(argc >= 2 ? argv[1] : "eeprom.bin");
StartMainThread();
+1 -1
View File
@@ -533,7 +533,7 @@ void boardInit()
{
register Pio *pioptr ;
ResetReason = RSTC->RSTC_MR ;
ResetReason = RSTC->RSTC_SR;
MATRIX->CCFG_SYSIO |= 0x000000F0L ; // Disable syspins, enable B4,5,6,7
+2 -5
View File
@@ -606,7 +606,7 @@ void menuMainView(uint8_t event)
lcd_putsnAtt(PHASE_X, PHASE_Y, g_model.phaseData[phase].name, sizeof(g_model.phaseData[phase].name), ZCHAR|PHASE_FLAGS);
// Model Name
putsModelName(MODELNAME_X, MODELNAME_Y, g_model.name, g_eeGeneral.currModel, BIGSIZE);
putsModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE);
#if !defined(PCBTARANIS)
// Main Voltage (or alarm if any)
@@ -627,10 +627,7 @@ void menuMainView(uint8_t event)
// Sliders (Pots / Sliders)
displaySliders();
if (modelBitmapLoaded == NULL)
lcd_bmp(BITMAP_X, BITMAP_Y, modelBitmap);
else
lcd_bmp(BITMAP_X, BITMAP_Y, logo_taranis);
lcd_bmp(BITMAP_X, BITMAP_Y, modelBitmap);
// Switches
for (uint8_t i=0; i<8; i++) {