Example #1
0
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;
}
Example #2
0
/********************************************************************
函数功能:在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(); //刷新
}
Example #3
0
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////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////
}