Skip to content

Instantly share code, notes, and snippets.

@amolok
Created October 15, 2014 08:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amolok/889b49debcfb49f7844e to your computer and use it in GitHub Desktop.
Save amolok/889b49debcfb49f7844e to your computer and use it in GitHub Desktop.
Столбоскоп
// чтение шрифтов с флэшки
void mem_fnt_p_inc(void){
if( (++nand_fnt_p.shift) >= (NAND_PAGE_SIZE + NAND_SPARE_SIZE)){
nand_fnt_p.shift=0;
if( (++nand_fnt_p.page) >= NAND_BLOCK_SIZE){
nand_fnt_p.page=0;
if( (++nand_fnt_p.block) >= NAND_MEMORY_SIZE){
nand_fnt_p.block=0;
}
}
nand_finish_reading();
nand_start_reading(&nand_fnt_p);
}
}
#define fnt_get_char(X) nand_read_char(X); mem_fnt_p_inc()
/*
* поиск шрифта в памяти, на входе номер шрифта (0, 1 -- шрифты в пограммной памяти, >1 -- шрифты на флэшке)
* ставит указатель nand_fnt_p на высоту шрифта
*/
void fontSeek(unsigned char fnumber){
unsigned long p;
if(fnumber > 1)
{
unsigned char h,l;
nand_fnt_p.block = MEM_FONT_ADDR;
nand_fnt_p.page = 0;
nand_fnt_p.shift = 0;
// ищем шрифт в памяти
while(fnumber-- >2){
nand_start_reading(&nand_fnt_p);
fnt_get_char(l);
fnt_get_char(h);
p = ((h)<<8) + l;
fnt_get_char(l);
fnt_get_char(h);
p = ((((h)<<8) + l)<<16)+p;
nand_finish_reading();
mem_inc_shift(&nand_fnt_p, p-sizeof(unsigned long));
// nand_fnt_p.shift += p-sizeof(unsigned long);
}
// пропускаем размер найденного шрифта
mem_inc_shift( &nand_fnt_p, sizeof(unsigned long));
// nand_fnt_p.shift += sizeof(unsigned long);
}
}
/* считывает высоту шрифта в глобальную curent_h, ставит указатель nand_fnt_p на таблицу символов */
void fontFillHeight(unsigned char fnumber){
fontSeek(fnumber);
// читаем высоту шрифта
nand_start_reading(&nand_fnt_p);
fnt_get_char(curent_h);
nand_finish_reading();
}
union TempUnion
{
struct
{
unsigned FIRST_TIME:1;
unsigned REFRESH:1;
unsigned ARC:1;
} ARC;
unsigned char TMP;
struct
{
unsigned char TMP;
unsigned char INPUT[INPUT_CNT];
unsigned char POS;
unsigned char FLG;
unsigned long V;
}STR;
struct
{
unsigned char TMP;
unsigned char STR[INPUT_CNT];
unsigned char POS;
unsigned char FLG;
unsigned long V;
signed char KEY;
unsigned char SCR;
}KBD;
unsigned char RES;
unsigned char NAKOP;
unsigned char CHUV;
unsigned char POROG;
signed char SBEG;
signed char MATERIAL;
unsigned short SPECIE;
unsigned char SPECIE_TYPE;
unsigned char Z_TIME;
unsigned long CRIT;
unsigned char RFID_ENABLED;
unsigned char USB_MODE;
struct
{
struct
{
unsigned char DD[3];
unsigned char MM[3];
unsigned char YY[3];
} STR;
struct
{
unsigned char DD;
unsigned char MM;
unsigned char YY;
} TMP;
unsigned char SELECTED;
} Date;
unsigned char DATE_STRING[9];
struct
{
struct
{
unsigned char HH[3];
unsigned char MM[3];
unsigned char SS[3];
} STR;
struct
{
unsigned char HH;
unsigned char MM;
} TMP;
unsigned char SELECTED;
} Time;
unsigned char TIME_STRING[9];
struct
{
unsigned char POS;
unsigned char STR[5];
unsigned char ALIGN;
unsigned char POS_X;
} POLOSA;
unsigned char DEV_SERIAL_STR[16];
char VERSION_INFO[16];
char MAT_CODE[16];
char LicenseExpirationDate[11];
struct
{
signed char NUM;
T_PROFILE DATA;
unsigned char NAME[5];
unsigned char LIST[PROFILES_CNT];
} PROFILE;
unsigned char STRING[16];
struct
{
unsigned FIRST_TIME:1;
unsigned REFRESH:1;
unsigned MOVE:1;
unsigned CHANGE:1;
signed char POS;
unsigned char CUR;
unsigned char INPUT[6];
unsigned char PREVI[6];
} BM;
struct
{
unsigned FIRST_TIME:1;
unsigned REFRESH:1;
unsigned MOVE:1;
unsigned CHANGE:1;
signed char POS;
unsigned char CUR;
unsigned long NUM;
unsigned char INPUT[21];
union TmpTime{
struct
{
unsigned char HH[3];
unsigned char MM[3];
unsigned char SS[3];
} Time;
unsigned char STR[9];
};
t_nand_pointers mp;
} PoleID;
struct
{
unsigned FIRST_TIME:1;
unsigned REFRESH:1;
// unsigned MOVE:1;
// unsigned CHANGE:1;
// signed char POS;
T_MODE FLAGS;
} MODE;
};
extern union TempUnion TMP;
// вызов отвечающей за экран функции происходит каждый цикл прибора
void screen_func(void)
{
char c;
c=buttons_get_char();
refreshScreen();
if(!BATTERY_LEVEL_PRC)enterLowBattery();
/*
#ifdef WINDOWS_EMULIATOR
mem_load_adjust_params(); // load initial setting from file
#endif
bgSetActiveCriteriaMask(OPTIONS.CR_MASK);
*/
// if(c!=0)
switch(CURRENT_SCREEN)
{
case SCR_START:
processMainScreen(c);
break;
case SCR_NUMBER:
enterNumber(c);
break;
case SCR_HEIGHT:
enterHeight(c);
break;
case SCR_POLE_LENGTH:
enterHeight(c);
break;
}
}
// упрощённая Т9
unsigned char getKitSymbol(unsigned char cur) // возвращает валидный символ из кассы символов по символу (проверка)
{
// касса символов
// unsigned char kit[_kit_len] = {' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
if(cur< ' ') return 'Z';
if(cur> 'Z') return ' ';
if(cur=='@') return ' ';
if(cur=='!') return 'A';
return cur;
}
unsigned char getKitSymbolFilter(unsigned char c) // возвращает валидный символ из кассы символов по символу (проверка)
{
unsigned char cur = getKitSymbol(c);
return (cur == ' ') ? '-' : cur;
}
void processEnterBM(char key) // ввод текстового префикса для Бермуд
{
if(TMP.BM.FIRST_TIME){
TMP.BM.FIRST_TIME=0;
TMP.BM.CHANGE=0;
TMP.BM.POS=0;
fillBMCode(TMP.BM.INPUT);
// TMP.BM.PREVI=TMP.BM.INPUT; // TODO: заполнить из вообще предыдущего столба! бэкапить в .PREVI
TMP.BM.REFRESH=1;
}
if(TMP.BM.REFRESH){
drawSetFont(FNT__B20);
// FillRect1(1,126,1,62);
// FillRect0(2,125,2,61);
// FillRect0(0,127,24,52);
FillRect0(0,127,0,52);
{ // [XX_XXX] <- POS
unsigned char i;
// FillRect1(_pos_w*TMP.BM.POS + _pos_x-1,_pos_w*TMP.BM.POS + _pos_x+_pos_w-2,_pos_y-1,_pos_y+_pos_h-1); // курсор
// FillRect1(10,120,24,48);
// FillRect1(_pos_x,_pos_x+_pos_w*6,_pos_y,_pos_y+_pos_h);
for(i=0;i<6;i++){
if(i!=TMP.BM.POS) drawChar( (((TMP.BM.INPUT[i]==0) || (TMP.BM.INPUT[i]==' ')) ? '_' : TMP.BM.INPUT[i]), _pos_x + i*_pos_w -_pos_w/2, _pos_y );
// if(i==TMP.BM.POS){
// drawCharAlign( (TMP.BM.INPUT[i] ? TMP.BM.INPUT[i] : '_'), _pos_x + i*_pos_w, _pos_y ,1);
// }else{
// drawCharAlign( (TMP.BM.INPUT[i] ? TMP.BM.INPUT[i] : '_'), _pos_x + i*_pos_w, _pos_y ,1);
// }
}
}
{ // A/[B]/C
TMP.BM.CUR=TMP.BM.INPUT[TMP.BM.POS];
if(TMP.BM.CUR==0) TMP.BM.CUR='B';
FillRect1(_pos_x + TMP.BM.POS*_pos_w -_pos_w/2 -2, _pos_x + TMP.BM.POS*_pos_w +_pos_w/2 -5, _pos_y -1 , _pos_y + _pos_h-7);
// drawCharAlign(0x1E, _pos_x + TMP.BM.POS*_pos_w-1, _pos_y-_pos_h*2 ,1); // ^
// drawChar('^', _pos_x + TMP.BM.POS*_pos_w-1, _pos_y-_pos_h*2 ); // ^
drawChar(getKitSymbolFilter(TMP.BM.CUR-1), _pos_x + TMP.BM.POS*_pos_w -_pos_w/2, 0 ); // ^
drawCharInvert( (((TMP.BM.CUR==0) || (TMP.BM.CUR==' ')) ? '_' : TMP.BM.CUR), _pos_x + TMP.BM.POS*_pos_w -_pos_w/2, _pos_y );
drawChar(getKitSymbolFilter(TMP.BM.CUR+1), _pos_x + TMP.BM.POS*_pos_w -_pos_w/2, _pos_y+_pos_h -5 ); // v
// drawCharAlign('v', _pos_x + TMP.BM.POS*_pos_w-1, _pos_y+_pos_h*2 ,1); // v
// drawCharAlign(0x1F, _pos_x + TMP.BM.POS*_pos_w-1, _pos_y+_pos_h*2 ,1); // v
}
TMP.BM.REFRESH=0;
lcdRefresh();
return;
}
if((key == '{')||(key=='<')){
TMP.BM.POS--;
TMP.BM.MOVE=1;
}
if((key == '}')||(key=='>')){
TMP.BM.POS++;
TMP.BM.MOVE=1;
}
if(TMP.BM.MOVE){
TMP.BM.MOVE=0;
TMP.BM.POS=(TMP.BM.POS% 6 + 6)%6;
TMP.BM.CUR=TMP.BM.INPUT[TMP.BM.POS];
TMP.BM.CHANGE=0;
TMP.BM.REFRESH=1;
return;
}
if(key == '^'){
TMP.BM.CUR--;
TMP.BM.CHANGE=1;
}
if(key == 'v'){
TMP.BM.CUR++;
TMP.BM.CHANGE=1;
}
if((key >= '0')&&(key <= '9')){
switch(key){
case '7':
TMP.BM.CUR=' '; break;
case '8':
TMP.BM.CUR='A'; break;
case '9':
TMP.BM.CUR='D'; break;
case '4':
TMP.BM.CUR='G'; break;
case '5':
TMP.BM.CUR='J'; break;
case '6':
TMP.BM.CUR='M'; break;
case '1':
TMP.BM.CUR='P'; break;
case '2':
TMP.BM.CUR='T'; break;
case '3':
TMP.BM.CUR='W'; break;
case '0':
TMP.BM.CUR=' '; break;
}
TMP.BM.CHANGE=1;
}
if(TMP.BM.CHANGE){
TMP.BM.CHANGE=0;
TMP.BM.CUR=getKitSymbol(TMP.BM.CUR);
TMP.BM.INPUT[TMP.BM.POS]=TMP.BM.CUR;
TMP.BM.REFRESH=1;
}
if(key == 'C'){
setGlobalScreen(Z_SCR_NUMBER);
initInputString();
// restoreValue(DOP_INFO.LongNumber);
return;
}
if(key=='E'){
saveBMCode();
/* fillBMCode(); // !!!DEBUG!!!
TMP.BM.REFRESH=1;
return;
*/ setGlobalScreen(Z_SCR_NUMBER);
initInputString();
// restoreValue(DOP_INFO.LongNumber);
return;
}
if(key == '*'){
/* unsigned char str[8];
str[0]='B';
str[1]='E';
str[2]='R';
str[3]='M';
str[4]='U';
str[5]='D';
str[6]='ь';
str[7]=0;
TMP.BM.REFRESH=1;
FillRect0(0,127,0,52);
drawSetFont(FNT__A23);
drawStringAlign(str,0,0,0);
*/
return;
}
if(key)TMP.BM.REFRESH=1;
}
unsigned char enterT9key(unsigned char key, char cur){
switch(key){
case '7':
switch(cur){
case '7': return '-';
case ' ': return '-';
case '-': return ' ';
default : return '-';
};
break;
case '8':
switch(cur){
case '8': return 'A';
case 'A': return 'B';
case 'B': return 'C';
case 'C': return 'A';
default : return 'A';
};
break;
case '9':
switch(cur){
case '9': return 'D';
case 'D': return 'E';
case 'E': return 'F';
case 'F': return 'D';
default : return 'D';
};
break;
case '4':
switch(cur){
case '4': return 'G';
case 'G': return 'H';
case 'H': return 'I';
case 'I': return 'G';
default : return 'G';
};
break;
case '5':
switch(cur){
case '5': return 'J';
case 'J': return 'K';
case 'K': return 'L';
case 'L': return 'J';
default : return 'J';
};
break;
case '6':
switch(cur){
case '6': return 'M';
case 'M': return 'N';
case 'N': return 'O';
case 'O': return 'M';
default : return 'M';
};
break;
case '1':
switch(cur){
case '1': return 'P';
case 'P': return 'Q';
case 'Q': return 'R';
case 'R': return 'S';
case 'S': return 'P';
default : return 'P';
};
break;
case '2':
switch(cur){
case '2': return 'T';
case 'T': return 'U';
case 'U': return 'V';
case 'V': return 'T';
default : return 'T';
};
break;
case '3':
switch(cur){
case '3': return 'W';
case 'W': return 'X';
case 'X': return 'Y';
case 'Y': return 'Z';
case 'Z': return 'W';
default : return 'W';
};
break;
case '0':
switch(cur){
case '0': return ' ';
default : return ' ';
};
break;
default: return key;
}
}
unsigned char enterT9one(unsigned char key, unsigned char cur){
switch(key){
case '0': return '0';
case '7': return ' ';
case '8': return 'A';
case '9': return 'D';
case '4': return 'G';
case '5': return 'J';
case '6': return 'M';
case '1': return 'P';
case '2': return 'T';
case '3': return 'W';
default: return key;
}
}
// окультурил код, хотя бы переместив определения функций рядом с соответствующим номерами экранов
#define SCR_TEST 22 //тестирование, начальный экран
void processTest(char key);
void processZTest(char key);
#define SCR_START 0 //экран начала(измерить - настроить) // ACCESS - SETTINGS
void processMainScreen(char key);
#define SCR_NUMBER 1 //экран ввода номера опоры *KBD !ZIPMODE
void enterNumber(char key);
#define Z_SCR_NUMBER 90 // *KBD
void enterNumberZ(char key);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment