int ModeHandler(int mode, char *textIn, int argc, char **argv) { LcdSpi *lcd; Spi *spiBus0; ScreenData *screenBg; int result = 0; Fonts font; iconv_t ic; size_t res; char text[MAX_ISO8859_LEN] = ""; memset(&font, 0, sizeof(Fonts)); spiBus0 = SpiCreate(0); if (spiBus0 == NULL) { printf("SPI-Error\n"); exit(EXITCODE_ERROR); } lcd = LcdOpen(spiBus0); if (!lcd) { printf("LCD-Error\n"); exit(EXITCODE_ERROR); } if (gConfig.mIsInit == 1) { LcdInit(lcd); } else if (gConfig.mIsInit == 2) { LcdUninit(lcd); exit(EXITCODE_OK); } if (gConfig.mIsBgLight) { LcdSetBgLight(lcd, gConfig.mBgLight & 1, gConfig.mBgLight & 2, gConfig.mBgLight & 4); } screenBg = ScreenInit(LCD_X, LCD_Y); if (!screenBg) { printf("Screen-Error\n"); exit(EXITCODE_ERROR); } ScreenClear(screenBg); if (gConfig.mBgFilename) { if (ScreenLoadImage(screenBg, gConfig.mBgFilename, gConfig.mBgOffX, gConfig.mBgOffY) != 0) { ScreenClear(screenBg); } } if (textIn) { int testInLen = strlen(textIn); char **inPtr = &textIn; char *outPtr = &text[0]; ic = iconv_open("ISO-8859-1", "UTF-8"); if (ic != (iconv_t)(-1)) { size_t inBytesLeft = testInLen; size_t outBytesLeft = sizeof(text) - 1; res = iconv(ic, inPtr, &inBytesLeft, &outPtr, &outBytesLeft); if ((int)res != -1 && outBytesLeft) { outPtr[0] = 0; } else { strncpy(text, textIn, sizeof(text) - 1); text[sizeof(text) - 1] = 0; } iconv_close(ic); } } //printf("Mode: %i\n", mode); switch (mode) { case OPT_YESNO: LoadFonts(&font); result = YesNo(lcd, &font, text, screenBg); break; case OPT_OK: LoadFonts(&font); result = Ok(lcd, &font, text, screenBg); break; case OPT_MENU: LoadFonts(&font); result = Menu(lcd, &font, screenBg, optind, argc, argv); break; case OPT_IPV4: LoadFonts(&font); result = Ipv4(lcd, &font, text, screenBg, optind, argc, argv); break; case OPT_SUBNETMASK: LoadFonts(&font); result = Subnetmask(lcd, &font, text, screenBg, optind, argc, argv); break; case OPT_INFO: LoadFonts(&font); result = Info(lcd, &font, text, screenBg); break; case OPT_BUTTONWAIT: result = ButtonWait(); break; case OPT_INTINPUT: LoadFonts(&font); result = IntInput(lcd, &font, text, screenBg, optind, argc, argv); break; case OPT_PROGRESS: LoadFonts(&font); result = Progress(lcd, &font, text, screenBg, optind, argc, argv); break; case OPT_PERCENT: LoadFonts(&font); result = Percent(lcd, &font, text, screenBg, optind, argc, argv); break; default: break; } if (font.mSystem) { //FontDestroy(font.mSystem); } if (font.mInternal) { //FontDestroy(font.mInternal); } if (gConfig.mIsClear) { LcdCls(lcd); } ScreenDestroy(screenBg); LcdCleanup(lcd); SpiDestroy(spiBus0); return result; }
/******************************************************************** 函数功能:在LCD上显示频谱。 入口参数:无。 返 回:无。 备 注:无。 ********************************************************************/ void ShowSpectrum(void) { int i,x,y,j,p; //对输入信号进行缩小 for(i=0;i<LENGTH;i++) { AudioOutBuf[i]/=32; } FftInput(AudioOutBuf); //位倒序 FftExe(AudioOutBuf,Re,Im); //做FFT运算 LcdCls(); //清屏 //显示X、Y轴坐标 LcdSetPoint(0,35); LcdPrints("0V"); LcdDrawLine(13,39,15,39); LcdSetPoint(0,23); LcdPrints("1V"); LcdDrawLine(13,27,15,27); LcdSetPoint(0,11); LcdPrints("2V"); LcdDrawLine(13,15,15,15); LcdSetPoint(0,0); LcdPrints("3V"); LcdDrawLine(13,3,15,3); LcdSetPoint(14,40); LcdPrints("0"); LcdSetPoint(13+26,40); LcdPrints("3K"); LcdSetPoint(84-20,40); LcdPrints("16K"); //直流分量直接显示 x=17; y=MAX_HEIGHT-(Re[0]*MAX_HEIGHT/LENGTH)/1024; LcdDrawLine(x,y,x,MAX_HEIGHT); ProcPeak(0,y); //处理峰值 //每1点显示 for(i=1;i<14;i++) { x++; y=sqrt(Re[i]*Re[i]+Im[i]*Im[i]); //计算模值 y/=10; y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每2点显示 p=14; for(i=14;i<24;i++) { x++; y=0; for(j=0;j<2;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=20; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每3点显示 for(i=24;i<34;i++) { x++; y=0; for(j=0;j<3;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=30; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每4点显示 for(i=34;i<44;i++) { x++; y=0; for(j=0;j<4;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=40; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每6点显示 for(i=44;i<54;i++) { x++; y=0; for(j=0;j<6;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=60; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } //每9点显示 for(i=54;i<64;i++) { x++; y=0; for(j=0;j<9;j++) { y+=sqrt(Re[p]*Re[p]+Im[p]*Im[p]); //计算模值 p++; } y/=90; //取平均值 y=Compress(y); //压缩 y=MAX_HEIGHT-y; //换算为屏幕y轴位置 ProcPeak(i,y); //处理峰值 LcdDrawLine(x,y,x,MAX_HEIGHT); //画线 } for(i=0;i<64;i++) { LcdDrawPoint(i+17,Peak[i]); } LcdRefresh(); //刷新 }
void main() { #if 0 extern void DebugAdc(); DebugAdc(); #endif ////////////////////////////////////////////////////////////////////////// // 局部变量或结构体 // ////////////////////////////////////////////////////////////////////////// SpeedForline = FreecaleConfig.Config.Motor.Speed.LineSpeed; ////////////////////////////////////////////////////////////////////////// // 位置提示 // ////////////////////////////////////////////////////////////////////////// /************************************************************************/ /* 开中断 */ /************************************************************************/ set_vector_handler(UART0_VECTORn, UartHandler); // 设置中断服务函数到中断向量表里 uart_rx_irq_en(UART0);//串口中断 FLKeyIrqEnable(); //wdog_init (1000);//初始化看门狗 //wdog_enable (); ////////////////////////////////////////////////////////////////////////// // 用户操作 // ////////////////////////////////////////////////////////////////////////// #if UseEndLine switch (FreecaleConfig.Config.CarState) { case CarStandby: #endif//UseEndLine printf("start"); #if UseAdcNormalizingInit AdcNormalizingInit();//初始化归一化变量 #else//UseAdcNormalizingInit LCDPrint(0, 0, "Car Ready!"); AdcInit(); if (FreecaleConfig.Config.Mode.NrfStartCar == On) { if (FreecaleConfig.Config.CarThis == MyCar1) { uint8 exitfunc = false; LCDPrint(0, LcdLine2, "Press the"); LCDPrint(LcdLocal2, LcdLine3, "start!"); LCDPrint(LcdLocal1, LcdLine4, "Nrf Mode"); while (!exitfunc) { switch (KeyScanWithoutIrq())//按键检测 { case FLKeyAdcNorExit: LcdCls(); LCDPrint(LcdLocal1, LcdLine1, "Findind Car2!"); while (NrfSendStr("$", 1) != Nrf_AllGreen) { led(LED1, LED_ON); DELAY_MS(1); }; led(LED1, LED_OFF); exitfunc = TRUE;//退出 break; default: break; } } } else { LCDPrint(0, LcdLine2, "Wait Command!"); uint8 strTemp[10]; while (true) { if (NrfRecStrCheck(strTemp, 5) != 0) { if (strTemp) { break; } } led(LED1, LED_ON); DELAY_MS(1); } led(LED1, LED_OFF); } #endif//UseAdcNormalizingInit } else { uint8 exitfunc = false; LCDPrint(0, LcdLine2, "Press the"); LCDPrint(LcdLocal2, LcdLine3, "start!"); LCDPrint(LcdLocal1, LcdLine4, "Manual Mode"); while (!exitfunc) { switch (KeyScanWithoutIrq())//按键检测 { case FLKeyAdcNorExit: exitfunc = TRUE;//退出 break; default: break; } } } #if UsePowerOnDelay DELAY_MS(2000); #else if (FreecaleConfig.Config.CarDelay > 0) { LcdCls(); LCDPrint(0, 0, "wait TimeOut!"); DELAY_MS(FreecaleConfig.Config.CarDelay * 10); } LcdCls(); #endif//UsePowerOnDelay ////////////////////////////////////////////////////////////////////////// //终点线 #if UseEndLine break; case CarRunning: break; case CarFinish: LCDPrint(0, 0, "Finish!"); break; default: break; } #endif//UseEndLine //uint16 spwm = SteerCenterDuty; Speed.Expect = SpeedForline; enable_irq(PIT_IRQn); //使能PIT0中断 //程序循环 while (1) { ////////////////////////////////////////////////////////////////////////// //舵机控制 SteerCtrl(); #if 1 #else ///lcd show NumShow16(Speed.Expect, LcdLocal1, LcdLine1); NumShow16(Speed.Acturally, LcdLocal1, LcdLine2); NumShow3(MotorPid.P, LcdLocal1, LcdLine3); NumShow3(MotorPid.I, LcdLocal2, LcdLine3); NumShow3(MotorPid.D, LcdLocal3, LcdLine3); #endif if (FreecaleConfig.Config.Mode.Ultrasonic == On) { NumShow4(CarDistance, LcdLocal1, LcdLine2); } SpeedCtrl(); ////////////////////////////////////////////////////////////////////////// //nrf if (FreecaleConfig.Config.Mode.NrfSendDistance) { //NrfErrorType_e nrfErr; if (FreecaleConfig.Config.CarThis) { if (NrfRecStrCheck(NrfBuff, 3)) { if (FreecaleConfig.Config.Mode.NrfSendDistance) { if (NrfBuff[0] == '$')//超声波识别符 { uint8 i = 0; while (NrfBuff[i + 1] != '#')//求字符串长度 { if (NrfBuff[i + 1] == '\0')//error { goto exitthismainloop;//没辙了,我真不想这么写,实在不能再循环了,变量太多了 //break; } i++; } uint32 dis = 0; for (uint8 j = 0; j < i; j++)//求数值 { dis += POW((uint32)(NrfBuff[j + 1] - '0'), i - j); } } } } } else { if (FreecaleConfig.Config.Mode.NrfSendDistance) { sprintf(NrfBuff, "$%d#", CarDistance); NrfSendStrCheck(NrfBuff, sizeof(NrfBuff) / sizeof(uint8), 3); } } } ////////////////////////////////////////////////////////////////////////// exitthismainloop: //延迟,控制周期 DELAY_MS(20); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //Don't leave main//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// }