#include "screen.h" #include "struct.h" #include "my.h" extern int reload_flag; extern char* kPrToDispl; extern UserData_TypeDef currentData; extern float kNormToDAC; extern uint16_t correctedKu[13]; extern int menuPointer; bool menuItemIsEditable=0; bool kprEditable=0; int kprPointer=0; extern uint8_t iobuf[256]; const char STRING_DATCHIK[] = "D[jl"; const char STRING_PKL[] = "gRk/"; const char STRING_VIHOD[] = "Ds[jl"; const char STRING_MV_MS2[] = "vD/vc2"; const char STRING_FVCH[] = "DX"; const char STRING_GC[] = "Uw"; const char STRING_FNCH[] = "YX"; const char STRING_KGC[] = "rUw"; const char STRING_PEREGRUZKA[] = "Gthtuheprf"; const char STRING_OBSHAJA_ZEMLJA[] = "JP"; const char STRING_PLAVAJUSHAJA_ZEMLA[] = "GP"; const char STRING_Ku0_1[] = "0~1"; const char STRING_Ku0_2[] = "0~2"; const char STRING_Ku0_5[] = "0~5"; const char STRING_Ku1[] = "1"; const char STRING_Ku2[] = "2"; const char STRING_Ku5[] = "5"; const char STRING_Ku10[] = "10"; const char STRING_Ku20[] = "20"; const char STRING_Ku50[] = "50"; const char STRING_Ku100[] = "100"; const char STRING_Ku200[] = "200"; const char STRING_Ku500[] = "500"; const char STRING_Ku1000[] = "1000"; const char *STRINGS_UNITS[]={"v/c2","vv/c","Gf","rGf","VGf","Y","rY","vD"}; const char *STRINGS_OUTUNITS[] = {"0~0001vD/", "0~0002vD/", "0~0005vD/", "0~001vD/", //3 "0~002vD/", "0~005vD/", "0~01vD/",//6 "0~02vD/", "0~05vD/", "0~1vD/",//9 "0~2vD/", "0~5vD/", "1vD/",//12 "2vD/", "5vD/", "10vD/",//15 "20vD/", "50vD/", "100vD/",//18 "200vD/", "500vD/", "1D/",//21 "2D/", "5D/", "10D/",//24 "20D/", "50D/", "100D/",//27 "200D/", "500D/", "1000D/", //30 }; const char STRING_Hp0_2[] = "0~2"; const char STRING_Hp1[] = "1"; const char STRING_Hp2[] = "2"; const char STRING_Hp10[] = "10"; /////Значения LP в Кгц const char STRING_Lp100[] = "0~1"; const char STRING_Lp300[] = "0~3"; const char STRING_Lp1000[] = "1"; const char STRING_Lp3000[] = "3"; const char STRING_Lp10000[] = "10"; const char STRING_Lp30000[] = "30"; const char STRING_Lp100000[] = "100"; ///специальные строки для заводского меню const char STRING_KORREKCIA_USILENIA[] = "Rjhhtrwbz ecbktybz"; const char STRING_KASKAD[] = "Rfcrfl"; const char STRING_ZNACHENIE_DAC[] = "=0.0001&¤tData.SENS<0.001) {OffsetKuDisplay=0; kNormToDAC=currentData.SENS*10000;} // такие значения не допустимы else if (currentData.SENS>=0.001&¤tData.SENS<0.01){OffsetKuDisplay=0; kNormToDAC=currentData.SENS*1000;} else if (currentData.SENS>=0.01&¤tData.SENS<0.1){OffsetKuDisplay=3; kNormToDAC=currentData.SENS*100;} else if (currentData.SENS>=0.1&¤tData.SENS<1){OffsetKuDisplay=6; kNormToDAC=currentData.SENS*10;} else if (currentData.SENS>=1&¤tData.SENS<10){OffsetKuDisplay=9; kNormToDAC=currentData.SENS/1;} else if (currentData.SENS>=10&¤tData.SENS<100){OffsetKuDisplay=12; kNormToDAC=currentData.SENS/10;} else if (currentData.SENS>=100&¤tData.SENS<1000){OffsetKuDisplay=15; kNormToDAC=currentData.SENS/100;} else if (currentData.SENS<=1000){OffsetKuDisplay=18; kNormToDAC=currentData.SENS/1000;} } void screenDraw(void) { ///////проверяем КУ/значение выхода. присваеваем указателю соответсвующее значение switch(currentData.IKU){ ///сделать инлайн функцию case Ku0_1: kuToDispl=STRING_Ku0_1; break; case Ku0_2: kuToDispl=STRING_Ku0_2; break; case Ku0_5: kuToDispl=STRING_Ku0_5; break; case Ku1: kuToDispl=STRING_Ku1; break; case Ku2: kuToDispl=STRING_Ku2; break; case Ku5: kuToDispl=STRING_Ku5; break; case Ku10: kuToDispl=STRING_Ku10; break; case Ku20: kuToDispl=STRING_Ku20; break; case Ku50: kuToDispl=STRING_Ku50; break; case Ku100: kuToDispl=STRING_Ku100; break; case Ku200: kuToDispl=STRING_Ku200; break; case Ku500: kuToDispl=STRING_Ku500; break; case Ku1000: kuToDispl=STRING_Ku1000; break; } ///////проверяем ФВЧ выхода. присваеваем указателю соответсвующее значение switch(currentData.IFV){ case Hp0_2: fvchTODisp=STRING_Hp0_2; break; case Hp1: fvchTODisp=STRING_Hp1; break; case Hp2: fvchTODisp=STRING_Hp2; break; case Hp10: fvchTODisp=STRING_Hp10; break; } switch(currentData.IFN){ case Lp100: fnchTODisp=STRING_Lp100; break; case Lp300: fnchTODisp=STRING_Lp300; break; case Lp1000: fnchTODisp=STRING_Lp1000; break; case Lp3000: fnchTODisp=STRING_Lp3000; break; case Lp10000: fnchTODisp=STRING_Lp10000; break; case Lp30000: fnchTODisp=STRING_Lp30000; break; case Lp100000: fnchTODisp=STRING_Lp100000; break; } switch(currentData.IPZ){ case 0: plavZemlToDisp=STRING_OBSHAJA_ZEMLJA; break; case 1: plavZemlToDisp=STRING_PLAVAJUSHAJA_ZEMLA; break; } ////расставляем на дисплее надписи FontSet(Segoe_UI_Rus_10); OLED_DrawStr(STRING_DATCHIK, 1, 10, TEXT); //привет!!!! я велосипед и костыли что бы расставить цифры КПР без пробелов int ik0posX, ik1posX, ik2posX, ik3posX, ik4posX, ik5posX; ik0posX=30; if (currentData.IK0==0){ik1posX=ik0posX+7;} else if (currentData.IK0=='~'){ik1posX=ik0posX+2;} else{ik1posX=ik0posX+6;} if (currentData.IK1==0){ik2posX=ik1posX+7;} else if (currentData.IK1=='~'){ik2posX=ik1posX+2;} else{ik2posX=ik1posX+6;} if (currentData.IK2==0){ik3posX=ik2posX+7;} else if (currentData.IK2=='~'){ik3posX=ik2posX+2;} else{ik3posX=ik2posX+6;} if (currentData.IK3==0){ik4posX=ik3posX+7;} else if (currentData.IK3=='~'){ik4posX=ik3posX+2;} else{ik4posX=ik3posX+6;} if (currentData.IK4==0){ik5posX=ik4posX+7;} else if (currentData.IK4=='~'){ik5posX=ik4posX+2;} else{ik5posX=ik4posX+6;} if(menuPointer==KPR){ if(!kprEditable){ DrawSome(currentData.IK0, ik0posX, 10, CURSOR); DrawSome(currentData.IK1, ik1posX, 10, CURSOR); DrawSome(currentData.IK2, ik2posX, 10, CURSOR); DrawSome(currentData.IK3, ik3posX, 10, CURSOR); DrawSome(currentData.IK4, ik4posX, 10, CURSOR); DrawSome(currentData.IK5, ik5posX, 10, CURSOR); } if(kprEditable){ switch (kprPointer){ case KPR0: PulseDrawSome(currentData.IK0, ik0posX, 10, CURSOR); PulseDrawSome(currentData.IK1, ik1posX, 10, TEXT); PulseDrawSome(currentData.IK2, ik2posX, 10, TEXT); PulseDrawSome(currentData.IK3, ik3posX, 10, TEXT); PulseDrawSome(currentData.IK4, ik4posX, 10, TEXT); PulseDrawSome(currentData.IK5, ik5posX, 10,TEXT); break; case KPR1: PulseDrawSome(currentData.IK0, ik0posX, 10, TEXT); PulseDrawSome(currentData.IK1, ik1posX, 10, CURSOR); PulseDrawSome(currentData.IK2, ik2posX, 10, TEXT); PulseDrawSome(currentData.IK3, ik3posX, 10, TEXT); PulseDrawSome(currentData.IK4, ik4posX, 10, TEXT); PulseDrawSome(currentData.IK5, ik5posX, 10,TEXT); break; case KPR2: PulseDrawSome(currentData.IK0, ik0posX, 10, TEXT); PulseDrawSome(currentData.IK1, ik1posX, 10, TEXT); PulseDrawSome(currentData.IK2, ik2posX, 10, CURSOR); PulseDrawSome(currentData.IK3, ik3posX, 10, TEXT); PulseDrawSome(currentData.IK4, ik4posX, 10, TEXT); PulseDrawSome(currentData.IK5, ik5posX, 10,TEXT); break; case KPR3: PulseDrawSome(currentData.IK0, ik0posX, 10, TEXT); PulseDrawSome(currentData.IK1, ik1posX, 10, TEXT); PulseDrawSome(currentData.IK2, ik2posX, 10, TEXT); PulseDrawSome(currentData.IK3, ik3posX, 10, CURSOR); PulseDrawSome(currentData.IK4, ik4posX, 10, TEXT); PulseDrawSome(currentData.IK5, ik5posX, 10,TEXT); break; case KPR4: PulseDrawSome(currentData.IK0, ik0posX, 10, TEXT); PulseDrawSome(currentData.IK1, ik1posX, 10, TEXT); PulseDrawSome(currentData.IK2, ik2posX, 10, TEXT); PulseDrawSome(currentData.IK3, ik3posX, 10, TEXT); PulseDrawSome(currentData.IK4, ik4posX, 10, CURSOR); PulseDrawSome(currentData.IK5, ik5posX, 10,TEXT); break; case KPR5: PulseDrawSome(currentData.IK0, ik0posX, 10, TEXT); PulseDrawSome(currentData.IK1, ik1posX, 10, TEXT); PulseDrawSome(currentData.IK2, ik2posX, 10, TEXT); PulseDrawSome(currentData.IK3, ik3posX, 10, TEXT); PulseDrawSome(currentData.IK4, ik4posX, 10, TEXT); PulseDrawSome(currentData.IK5, ik5posX, 10,CURSOR); break; default: break; } } } else { DrawSome(currentData.IK0, ik0posX, 10, TEXT); DrawSome(currentData.IK1, ik1posX, 10, TEXT); DrawSome(currentData.IK2, ik2posX, 10, TEXT); DrawSome(currentData.IK3, ik3posX, 10, TEXT); DrawSome(currentData.IK4, ik4posX, 10, TEXT); DrawSome(currentData.IK5, ik5posX, 10,TEXT); } if(menuPointer==UNITSELECT){ if(!menuItemIsEditable){OLED_DrawStr(STRING_PKL, 75, 10, CURSOR);OLED_DrawStr(STRINGS_UNITS[currentData.UNIT], 99, 10, CURSOR);} if(menuItemIsEditable){PulseDrawStr(STRING_PKL, 75, 10, CURSOR);PulseDrawStr(STRINGS_UNITS[currentData.UNIT], 99, 10, CURSOR);} } else { OLED_DrawStr(STRING_PKL, 75, 10, TEXT); OLED_DrawStr(STRINGS_UNITS[currentData.UNIT], 99, 10, TEXT); } //////////////////////////// /* Статичная строка выхода OLED_DrawStr(STRING_VIHOD, 1, 24, TEXT); if(menuPointer==OUT)OLED_DrawStr(kuToDispl, 40, 24, CURSOR); else OLED_DrawStr(kuToDispl, 40, 24, TEXT); OLED_DrawStr(STRING_MV_MS2, 67, 24, TEXT); //////////////////////////// */ setOffsetKuDisplay(); //определяем устанавливаем единицы выхода //todo: считать часто флоаты вредно OLED_DrawStr(STRING_VIHOD, 1, 24, TEXT); /// делаем новую строку из STRINGS_OUTUNITS + units char *result = malloc(strlen(STRINGS_OUTUNITS[currentData.IKU+OffsetKuDisplay]) + strlen(STRINGS_UNITS[currentData.UNIT]) + 1); // +1 for the null-terminator // in real code you would check for errors in malloc here strcpy(result, STRINGS_OUTUNITS[currentData.IKU+OffsetKuDisplay]); strcat(result, STRINGS_UNITS[currentData.UNIT]); if(menuPointer==OUT) { if(!menuItemIsEditable)OLED_DrawStr((char *)result, 40, 24, CURSOR); if(menuItemIsEditable)PulseDrawStr((char *)result, 40, 24, CURSOR); } else OLED_DrawStr((char *)result, 40, 24, TEXT);//todo: STRINGS_OUTUNITS и units получается мутно free(result); /// освободил память OLED_DrawStr(STRING_FVCH, 2, 36, TEXT); if(menuPointer==FVCH) { if(!menuItemIsEditable) OLED_DrawStr(fvchTODisp, 19, 36, CURSOR); if(menuItemIsEditable) PulseDrawStr(fvchTODisp, 19, 36, CURSOR); } else OLED_DrawStr(fvchTODisp, 19, 36, TEXT); OLED_DrawStr(STRING_GC, 35, 36, TEXT); ////////////// OLED_DrawStr((char *)STRING_FNCH, 63, 36, TEXT); if(menuPointer==FNCH){ if(!menuItemIsEditable) OLED_DrawStr(fnchTODisp, 83, 36, CURSOR); if(menuItemIsEditable) PulseDrawStr(fnchTODisp, 83, 36, CURSOR); } else OLED_DrawStr(fnchTODisp, 83, 36, TEXT); OLED_DrawStr((char *)STRING_KGC, 103, 36, TEXT); ////////////// if(menuPointer==GROUND) { if(!menuItemIsEditable) OLED_DrawStr(plavZemlToDisp, 20, 48, CURSOR); if(menuItemIsEditable) PulseDrawStr(plavZemlToDisp, 20, 48, CURSOR);} else OLED_DrawStr(plavZemlToDisp, 20, 48, TEXT); if(currentData.OVERLOAD){OLED_DrawStr(STRING_PEREGRUZKA, 50, 48, CURSOR);} /* uncomment to debug RS-232 OLED_DrawNum(iobuf[0], 6, 48, TEXT); OLED_DrawNum(iobuf[1], 20, 48, TEXT); OLED_DrawNum(iobuf[2], 34, 48, TEXT); OLED_DrawNum(iobuf[3], 48, 48, TEXT); OLED_DrawNum(iobuf[4], 62, 48, TEXT); OLED_DrawNum(iobuf[5], 76, 48, TEXT); OLED_DrawNum(iobuf[6], 90, 48, TEXT); OLED_DrawNum(iobuf[7], 104, 48, TEXT); */ /* if((menuPointer==GROUND)&&(set.plavZeml==0)) OLED_DrawStr(STRING_OBSHAJA_ZEMLJA, CENTER, 48, CURSOR); else if(set.plavZeml==0) OLED_DrawStr(STRING_OBSHAJA_ZEMLJA, CENTER, 48, TEXT); if((menuPointer==GROUND)&&(set.plavZeml==1)) OLED_DrawStr(STRING_PLAVAJUSHAJA_ZEMLA, CENTER, 48, CURSOR); else if(set.plavZeml==1) OLED_DrawStr(STRING_PLAVAJUSHAJA_ZEMLA, CENTER, 48, TEXT); */ } // end screenDraw void screenDrawCallibration(void) { ///////проверяем КУ/значение выхода. присваеваем указателю соответсвующее значение switch(currentData.IKU){ ///сделать инлайн функцию case Ku0_1: kuToDispl=STRING_Ku0_1; break; case Ku0_2: kuToDispl=STRING_Ku0_2; break; case Ku0_5: kuToDispl=STRING_Ku0_5; break; case Ku1: kuToDispl=STRING_Ku1; break; case Ku2: kuToDispl=STRING_Ku2; break; case Ku5: kuToDispl=STRING_Ku5; break; case Ku10: kuToDispl=STRING_Ku10; break; case Ku20: kuToDispl=STRING_Ku20; break; case Ku50: kuToDispl=STRING_Ku50; break; case Ku100: kuToDispl=STRING_Ku100; break; case Ku200: kuToDispl=STRING_Ku200; break; case Ku500: kuToDispl=STRING_Ku500; break; case Ku1000: kuToDispl=STRING_Ku1000; break; } ///////проверяем ФВЧ выхода. присваеваем указателю соответсвующее значение switch(currentData.IFV){ case Hp0_2: fvchTODisp=STRING_Hp0_2; break; case Hp1: fvchTODisp=STRING_Hp1; break; case Hp2: fvchTODisp=STRING_Hp2; break; case Hp10: fvchTODisp=STRING_Hp10; break; } switch(currentData.IFN){ case Lp100: fnchTODisp=STRING_Lp100; break; case Lp300: fnchTODisp=STRING_Lp300; break; case Lp1000: fnchTODisp=STRING_Lp1000; break; case Lp3000: fnchTODisp=STRING_Lp3000; break; case Lp10000: fnchTODisp=STRING_Lp10000; break; case Lp30000: fnchTODisp=STRING_Lp30000; break; case Lp100000: fnchTODisp=STRING_Lp100000; break; } switch(currentData.IPZ){ case 0: plavZemlToDisp=STRING_OBSHAJA_ZEMLJA; break; case 1: plavZemlToDisp=STRING_PLAVAJUSHAJA_ZEMLA; break; } ////расставляем на дисплее надписи FontSet(Segoe_UI_Rus_10); OLED_DrawStr(STRING_KORREKCIA_USILENIA, CENTER, 10, TEXT); //Заголовок OLED_DrawStr(STRING_KASKAD, 1, 24, TEXT); //каскад if(menuPointer==KUSET) OLED_DrawStr(STRINGS_KU[currentData.IKU], 45, 24, CURSOR);// отображаем коэфициент усиления else OLED_DrawStr(STRINGS_KU[currentData.IKU], 45, 24, TEXT); OLED_DrawStr(STRING_ZNACHENIE_DAC, 1, 36, TEXT); //поцифрам выводим соответсвующий усилению значение ЦАП // делаем побитовый & с маской // if(menuPointer==DAC0SET) DrawSome((correctedKu[currentData.IKU]/1000), 85, 36, CURSOR); else DrawSome((correctedKu[currentData.IKU]/1000), 85, 36, TEXT); if(menuPointer==DAC1SET) DrawSome(((correctedKu[currentData.IKU]%1000)/100), 92, 36, CURSOR); else DrawSome(((correctedKu[currentData.IKU]%1000)/100), 92, 36, TEXT); if(menuPointer==DAC2SET) DrawSome(((correctedKu[currentData.IKU]%100)/10), 99, 36, CURSOR); else DrawSome(((correctedKu[currentData.IKU]%100)/10), 99, 36, TEXT); if(menuPointer==DAC3SET) DrawSome(((correctedKu[currentData.IKU]%10)/1), 106, 36, CURSOR); else DrawSome(((correctedKu[currentData.IKU]%10)/1), 106, 36, TEXT); if(menuPointer==SAVE){ OLED_DrawStr(STRING_SOHRANIT_IZMENENIYA, 1, 48, CURSOR); //todo:отображать сохранения } } // end screenDraw