コード例 #1
0
ファイル: MHZ14.cpp プロジェクト: lissettecarlr/RFID-_MAIN
bool MHZ14::Updata()
{	
	//向模块发送获取数据
	   CO2.SendData(Command_getvalue,9);
	
	//判断是否有数据返回
	  if(CO2.ReceiveBufferSize()<9)
	  {
		  CO2.ClearReceiveBuffer(); //清空接收缓存
		  return false;
	  }
	  else
	  {
		  CO2.GetReceivedData(rev_buffer,9); //取出一帧数据
		   CO2.ClearReceiveBuffer(); //清空接收缓存
		  
		  if(SumCheck(rev_buffer)==false)  //校验和
			  return false;
		  else
		  {
			  DATA_H=rev_buffer[2];
			  DATA_L=rev_buffer[3];
			  CO2_Concentration=rev_buffer[2]*256+rev_buffer[3];  //计算浓度
			  return true;
		  }
	  }
}
コード例 #2
0
ファイル: usarttest.cpp プロジェクト: matthewbot/Quadcopter
int main(int argc, char **argv) {	
	while (true) {
		out.print("Enter some text: ");
		char buf[20];
		out.getline(buf, sizeof(buf));
		out.printf("You typed: %s\n", buf);
		Task::sleep(1000);
	}
}
コード例 #3
0
static void docalibrate(const char *type, PID::Config *conf) {
	out.printf("Old %s: %f %f %f\n", type, conf->p, conf->i, conf->d);
	out.printf("New %s PID values:\n", type);
	
	static char buf[100];
	out.getline(buf, sizeof(buf));
	
	sscanf(buf, "%f %f %f", &conf->p, &conf->i, &conf->d);
	out.printf("Got: %f %f %f\n", conf->p, conf->i, conf->d);
}
コード例 #4
0
ファイル: tasks.cpp プロジェクト: bonzehan/stm32-projects
void AppInit(void) {
	TouchPanelTask.Run();
	GUITask.Run();
	BlinkTask.Run();
	
	printf("Gib was ein:\r\n");
	Serial.ReadLn(buf, 10);
	printf("Du hast eingegeben: %s", buf);
}	
コード例 #5
0
/* ----------------------------------------------------------------------------
 * メイン処理
 * ---------------------------------------------------------------------------- */
int main(void)
{
	setup();
	while(1)
	{
		loop();
		Serial1.getrxd();
	}
}
コード例 #6
0
ファイル: loggertest.cpp プロジェクト: matthewbot/Quadcopter
int main(int argc, char **argv) {	
	out.print("Begin log test!\n");
	
	const uint8_t writedata[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	unsigned int i;
	for (i=0;i<20;i++)
		logger.write(writedata, sizeof(writedata));
		
	logger.flush();
	out.print("Done!\n");
	
	uint8_t data[128];
	eeprom.read(EEPROM::pageAddress(0), data, sizeof(data));
	out.printf("EEPROM page 0:\n", data);
	for (i=0; i<sizeof(data); i++) {
		out.printf("%u ", (unsigned int)data[i]);
	}
	out.print("\n");
}
コード例 #7
0
ファイル: vexrctest.cpp プロジェクト: matthewbot/Quadcopter
int main(int argc, char **argv) {
	bool prevsynced=true;
		
	while (true) {
		Task::sleep(5);
		
		if (vex.getSynced()) {
			VexRC::Channels chans = vex.getChannels();
		
			out.printf("%d %d %d %d ", chans.analogs[0], chans.analogs[1], chans.analogs[2], chans.analogs[3]);
			out.printf("%s %s\n", digitalToString(chans.left), digitalToString(chans.right));
			prevsynced = true;
		} else {
			if (prevsynced) {
				buzzer.buzz(100);
				out.print("Not synced\n");
			}
			prevsynced = false;
		}
	}
}
コード例 #8
0
ファイル: main.cpp プロジェクト: dnivanthaka/avr-demos
int main(void)
{
  char buffer[15];
  setup();
  
  
  
  for(;;){
     ADCSRA |= 1 << ADSC;
     loop_until_bit_is_clear(ADCSRA, ADSC);
     adch = ADC;
     
     //uart.printstr(str);
     itoa(adch, buffer, 10);
     uart.printstr( (const char *)buffer );
     uart.printstr( "\n" );
     _delay_ms(100);
  }

  return 0;
}
コード例 #9
0
//监听一个端口,返回一个命令
u8 Transmission::GetStateOrder(USART &ListeningCOM)
{
		u8 comand[8]={0};
		u8 ch=0;
		u8 num = ListeningCOM.ReceiveBufferSize();
		if(num>7)   //一帧命令包含8个字节
		{
				ListeningCOM.GetReceivedData(&ch,1);
			if(ch == 0xFF)
			{
				ListeningCOM.GetReceivedData(&ch,1);
				if(ch == 0xDD)
				{
					while(ListeningCOM.ReceiveBufferSize()<6);//等待数据
					comand[0]=0xff;
					comand[1]=0xDD;
					ListeningCOM.GetReceivedData(comand+2,6);
					ListeningCOM.ClearReceiveBuffer();
					return CommandParsing(comand);  //解包
				}
				else return 0;
			}
			else
				return 0;
		}
		else 
			return 0;
}
コード例 #10
0
bool Transmission::GetWifiNameAndPassword(char *name,char *password,USART &ListeningCOM)
{
	u8 ch=0;
	u8 i =0;
	ListeningCOM.GetReceivedData(&ch,1);
		if(ch == 0xFF)
		{
			tskmgr.DelayMs(100);
			ListeningCOM.GetReceivedData(&ch,1);
			if(ch == 0x03)
			{
				ListeningCOM.GetReceivedData(&ch,1);
				while(ch!=0xff){
					*(name+i)=ch;
					i++;
					ListeningCOM.GetReceivedData(&ch,1);
				}
					*(name+i)='\0';
					ListeningCOM.GetReceivedData(&ch,1);
					i=0;
				while(ch!=0xff){
					*(password+i)=ch;
					i++;
					ListeningCOM.GetReceivedData(&ch,1);
				}
					*(password+i)='\0';	
				return 1;
			}
			else return 0;
		}
		else
			return 0;
}
コード例 #11
0
/* ----------------------------------------------------------------------------
 * メインループ
 * ---------------------------------------------------------------------------- */
void loop() {
	int i;
	int j;
	
	// 1秒毎の処理
	if(interruptCount > 999) {
		// 時計モード
		if(userDataTimerCount == 0) {
			rtc.get();
			// 年月日表示か時刻表示かの判定
			if(displayDateIntervalCount <= displayDateIntervalValue) {
				// 時分秒表示
				// カンマをクリア
				for(int i = 0; i < 8; i++) {
					IN12Com[i] = 0;
				}
				// 6桁フォーマット 999999
				if(dispTimeFormat == 0) {
					IN12Num[0] = 0x0F;
					if(hour12_24format == 1) {
						IN12Num[1] = rtc.hourHigh;
						IN12Num[2] = rtc.hourLow;
					} else {
						IN12Num[1] = rtc.hourHigh12;
						IN12Num[2] = rtc.hourLow12;
					}
					IN12Num[3] = rtc.minutesHigh;
					IN12Num[4] = rtc.minutesLow;
					IN12Num[5] = rtc.secondsHigh;
					IN12Num[6] = rtc.secondsLow;
					IN12Num[7] = 0x0F;
				}
				// 8桁フォーマット 99, 99, 99
				if(dispTimeFormat == 1) {
					if(hour12_24format == 1) {
						IN12Num[0] = rtc.hourHigh;
						IN12Num[1] = rtc.hourLow;
					} else {
						IN12Num[0] = rtc.hourHigh12;
						IN12Num[1] = rtc.hourLow12;
					}
					IN12Num[2] = 0x0F;
					IN12Num[3] = rtc.minutesHigh;
					IN12Num[4] = rtc.minutesLow;
					IN12Num[5] = 0x0F;
					IN12Num[6] = rtc.secondsHigh;
					IN12Num[7] = rtc.secondsLow;
					IN12Com[2] = 1;
					IN12Com[5] = 1;
				}
			} else {
				// 年月日表示
				// カンマクリア
				for(int i = 0; i < 8; i++) {
					IN12Com[i] = 0;
				}
				IN12Num[0] = 2;
				IN12Num[1] = 0;
				IN12Num[2] = rtc.yearHigh;
				IN12Num[3] = rtc.yearLow;
				IN12Num[4] = rtc.monthHigh;
				IN12Num[5] = rtc.monthLow;
				IN12Num[6] = rtc.dayHigh;
				IN12Num[7] = rtc.dayLow;
				if(displayDateIntervalCount >= ( displayDateIntervalValue + displayDateSecondsValue)) {
					displayDateIntervalCount = 0;
				}
			}
			displayDateIntervalCount++;
		}
		// ユーザーデータ表示中
		if(userDataTimerCount > 0) {
			userDataTimerCount--;
		}
		// LED 点滅
		if(led == false) {
			led = true;
			PORTC |= (1<<LED);
		} else {
			led = false;
			PORTC &= ~(1<<LED);
		}
		interruptCount = 0;
	}
	
	// シリアル1 受信処理
	while(Serial1.available()) {
		char ch = Serial1.getch();
		serial0String[serial0StringIdx] = ch;
		Serial1.putch(ch);
		if(serial0String[serial0StringIdx] == '\r') {
			Serial1.putch('\n');
			serial0String[serial0StringIdx] = 0;
			serial0StringComplete = true;
		}
		serial0StringIdx++;
		if(serial0StringIdx >= SERIALBUF_LEN) {
			serial0StringIdx = SERIALBUF_LEN - 1;
		}
		// CR コードだけの入力は無視
		if(serial0StringComplete == true && serial0StringIdx == 1) {
			serial0StringIdx = 0;
			serial0StringComplete = false;
		}
	}
	
	// 受信データ処理
	if(serial0StringComplete == true) {
		// ニキシー表示データチェック
		int isUserData = true;
		for(i = 0; i < (serial0StringIdx - 1); i++) {
			if(serial0String[i] == ' ') continue;
			if(serial0String[i] == '.') continue;
			if((serial0String[i] >= '0') && (serial0String[i] <= '9')) continue;
			isUserData = false;
		}
		// ユーザーデータを表示
		if(isUserData == true) {
			for(i = 0; i < 8; i++) {
				IN12Num[i] = 0x0F;
				IN12Com[i] = 0;
			}
			j = 7;
			for(i = (serial0StringIdx - 1); i >= 0; i--) {
				if(serial0String[i] >= '0' && serial0String[i] <= '9') {
					if(j >= 0) {
						IN12Num[j--] = serial0String[i] - 0x30;
					}
				} else if(serial0String[i] == ' ') {
					if(j >= 0) {
						IN12Num[j--] = 0x0F;
					}
				}
			}
			j = 8;
			int previusCharValid = false;
			for(i = (serial0StringIdx - 1); i >= 0; i--) {
				if((serial0String[i] >= '0' && serial0String[i] <= '9') || serial0String[i] == ' ') {
					previusCharValid = true;
					if(j > 0) {
						j--;
					}
					continue;
				}
				if(serial0String[i] == '.' && previusCharValid == true) {
					IN12Com[j] = 1;
					previusCharValid = false;
				}
			}
			userDataTimerCount = userDataTimerValue;
		}
		if(isUserData == false) {
			// コマンド処理
			if(strncmp(serial0String, "help", 4) == 0) {
				Serial1.putstr("set time YYMMDD hhmmss\r\n");
				Serial1.putstr("set timeformat [0 or 1]\r\n");
				Serial1.putstr("set dateinterval 99999\r\n");
				Serial1.putstr("set datesec 99999\r\n");
				Serial1.putstr("set udatasec 99999\r\n");
				Serial1.putstr("set bright daytime [1 to 9]\r\n");
				Serial1.putstr("set bright night [1 to 9]\r\n");
				Serial1.putstr("set hour daytime [0 to 23]\r\n");
				Serial1.putstr("set hour night [0 to 23]\r\n");
				Serial1.putstr("set 12/24 format [0 or 1]\r\n");
				Serial1.putstr("cathod -> Cathod poisoning\r\n");
				Serial1.putstr("sekai  -> STEINS;GATE like effect\r\n");
				Serial1.putstr("save   -> write EEPROM\r\n");
				Serial1.putstr("show   -> show all setting\r\n");
				Serial1.putstr("time   -> change to clock mode\r\n");
				Serial1.putstr("\r\n");
				Serial1.putstr("99999: numeric number 0 to 65535\r\n");
				Serial1.putstr("---\r\n");
			}
			if(strncmp(serial0String, "set timeformat ", 15) == 0) {
				unsigned int i = atoi(&serial0String[15]);
				if(i == 0 || i == 1) {
					dispTimeFormat = i;
					sprintf(msg, "value = %d\r\n", dispTimeFormat);
					Serial1.putstr(msg);
				}
			}
			if(strncmp(serial0String, "set time ", 9) == 0) {
				unsigned char year = ((serial0String[9] & 0x0F)<<4);
				year |= serial0String[10] & 0x0F;
				unsigned char month = ((serial0String[11] & 0x0F)<<4);
				month |= serial0String[12] & 0x0F;
				unsigned char days = ((serial0String[13] & 0x0F)<<4);
				days |= serial0String[14] & 0x0F;
				unsigned char hour = ((serial0String[16] & 0x0F)<<4);
				hour |= serial0String[17] & 0x0F;
				unsigned char minutes = ((serial0String[18] & 0x0F)<<4);
				minutes |= serial0String[19] & 0x0F;
				unsigned char seconds = ((serial0String[20] & 0x0F)<<4);
				seconds |= serial0String[21] & 0x0F;
				rtc.set(year, month, 1, days, hour, minutes, seconds);
			}
			if(strncmp(serial0String, "set dateinterval ", 17) == 0) {
				displayDateIntervalValue = atoi(&serial0String[17]);
				sprintf(msg, "value = %d\r\n", displayDateIntervalValue);
				Serial1.putstr(msg);
			}
			if(strncmp(serial0String, "set datesec ", 12) == 0) {
				displayDateSecondsValue = atoi(&serial0String[12]);
				sprintf(msg, "value = %d\r\n", displayDateSecondsValue);
				Serial1.putstr(msg);
			}
			if(strncmp(serial0String, "set udatasec ", 13) == 0) {
				userDataTimerValue = atoi(&serial0String[13]);
				sprintf(msg, "value = %d\r\n", userDataTimerValue);
				Serial1.putstr(msg);
			}
			if(strncmp(serial0String, "cathod", 6) == 0) {
				cathodePoisoning();
				Serial1.putstr("Done.");
			}
			if(strncmp(serial0String, "sekai", 5) == 0) {
				steins();
				//serialPrintln("Done.");
			}
			if(strncmp(serial0String, "set bright daytime ", 19) == 0) {
				unsigned int i = atoi(&serial0String[19]);
				if(i > 0 && i < 10) {
					IN12BrightDaytime = i;
					sprintf(msg, "value = %d\r\n", IN12BrightDaytime);
					Serial1.putstr(msg);
				}
			}
			if(strncmp(serial0String, "set bright night ", 17) == 0) {
				unsigned int i = atoi(&serial0String[17]);
				if(i > 0 && i < 10) {
					IN12BrightNight = i;
					sprintf(msg, "value = %d\r\n",IN12BrightNight);
					Serial1.putstr(msg);
				}
			}
			if(strncmp(serial0String, "set hour daytime ", 17) == 0) {
				unsigned int i = atoi(&serial0String[17]);
				if(i >= 0 && i < 24) {
					hourDaytime = i;
					sprintf(msg, "value = %d\r\n", hourDaytime);
					Serial1.putstr(msg);
				}
			}
			if(strncmp(serial0String, "set hour night ", 15) == 0) {
				unsigned int i = atoi(&serial0String[15]);
				if(i >= 0 && i < 24) {
					hourNight = i;
					sprintf(msg, "value = %d\r\n", hourNight);
					Serial1.putstr(msg);
				}
			}
			if(strncmp(serial0String, "set 12/24 format ", 17) == 0) {
				unsigned int i = atoi(&serial0String[17]);
				if(i == 0 || i == 1) {
					hour12_24format = i;
					sprintf(msg, "value = %d\r\n", hour12_24format);
					Serial1.putstr(msg);
				}
			}
			if(strncmp(serial0String, "save", 4) == 0) {
				// EEPROM 書き込み
				eeprom_busy_wait();
				eeprom_write_word(&E_displayDateIntervalValue, displayDateIntervalValue);
				eeprom_busy_wait();
				eeprom_write_word(&E_displayDateSecondsValue, displayDateSecondsValue);
				eeprom_busy_wait();
				eeprom_write_word(&E_userDataTimerValue, userDataTimerValue);
				eeprom_busy_wait();
				eeprom_write_byte(&E_dispTimeFormat, dispTimeFormat);
				eeprom_busy_wait();
				eeprom_write_byte(&E_IN12BrightDaytime, IN12BrightDaytime);
				eeprom_busy_wait();
				eeprom_write_byte(&E_IN12BrightNight, IN12BrightNight);
				eeprom_busy_wait();
				eeprom_write_byte(&E_hourDaytime, hourDaytime);
				eeprom_busy_wait();
				eeprom_write_byte(&E_hourNight, hourNight);
				eeprom_busy_wait();
				eeprom_write_byte(&E_hour12_24format, hour12_24format);
				Serial1.putstr("EEPROM write complete\r\n");
			}
			if(strncmp(serial0String, "time", 4) == 0) {
				userDataTimerCount = 0;
			}
			if(strncmp(serial0String, "show", 4) == 0) {
				sprintf(msg, "set timeformat %d\r\n",dispTimeFormat);
				Serial1.putstr(msg);
				sprintf(msg, "set dateinterval: %d\r\n",displayDateIntervalValue);
				Serial1.putstr(msg);
				sprintf(msg, "set datesec: %d\r\n", displayDateSecondsValue);
				Serial1.putstr(msg);
				sprintf(msg, "set udatasec: %d\r\n", userDataTimerValue);
				Serial1.putstr(msg);
				sprintf(msg, "set bright daytime: %d\r\n", IN12BrightDaytime);
				Serial1.putstr(msg);
				sprintf(msg, "set bright night: %d\r\n", IN12BrightNight);
				Serial1.putstr(msg);
				sprintf(msg, "set hour daytime: %d\r\n", hourDaytime);
				Serial1.putstr(msg);
				sprintf(msg, "set hour night: %d\r\n", hourNight);
				Serial1.putstr(msg);
				sprintf(msg, "set 12/24 format: %d\r\n", hour12_24format);
				Serial1.putstr(msg);
				Serial1.putstr("Release 2013/11/03 Ver 1.0\r\n");
				Serial1.putstr("---\r\n");
			}
		}
		serial0StringIdx = 0;
		serial0StringComplete = false;
	}
	wdt_reset();
}
コード例 #12
0
ファイル: main.cpp プロジェクト: lissettecarlr/RFID-_MAIN
int main()
{
	u8 command[6];
	u8 datatemp[18];//数据暂存
	u8 tagInfo[18];
	u8 sensor[16];//保存传感器型号
	u8 basic_information[6];//基础信息
	u8 version[16];//版本
	
	tskmgr.DelayMs(1000);
	tskmgr.DelayMs(1000);
	
	
	//设置模式
	//设置名字密码
	//设置IP地址
	//复位
	WIFI.SendData(CLOSS,6);  //关闭回显
	tskmgr.DelayMs(1000);
	WIFI.SendData(Command1,13);  //开启多路连接
	tskmgr.DelayMs(1000);
	WIFI.SendData(Command2,21); //开启服务器模式
	tskmgr.DelayMs(1000);
	
	
	  equipment[0]=2;//测试用 将设备二加入
//	  DATA_COM.SendData(c,8);  //连续发送命令
	
	
    while(1)
	{
	  //接收从模块数据
	 if(DATA_COM.ReceiveBufferSize()>=40) //如果接收到了一帧数据
	 {
		 u32 check=10,moduleNo;
		 u8 sum=0;
		 u8 FFAA=0;
		 DATA_COM.GetReceivedData(&FFAA,1); //找包头
		 if(FFAA==0xff)
		{
		  DATA_COM.GetReceivedData(&FFAA,1); //找包头
		  if(FFAA==0xcc)
		{
		 DATA_COM.GetReceivedData(datatemp,18);
		 moduleNo=datatemp[0]+datatemp[1]+datatemp[2]+datatemp[3];
		 for(u8 i=0;i<10;i++) //查询是否有这个设备
		  {
			if(moduleNo==equipment[i])
				check=0;//有这个设备
		  }
		  for(u8 i=0;i<16;i++)
		  {
			sum+=datatemp[i];  //j校验和
		  }
		  sum=sum+0XCB;  //加上包头
		  if(sum==datatemp[17])
			  check=check+1;
		  
		  //使用WIFI发送数据给上位机
		  if(check==1)
		  {
		    WIFI.SendData(Command3,17);
	        tskmgr.DelayMs(100);
			WIFI.ClearSendBuffer();
			WIFI.SendData(packgroup.MAINToUser(datatemp[5],datatemp[6],datatemp[7],moduleNo,datatemp[4]),20);
			tskmgr.DelayMs(100); 
			  
			WIFI.ClearReceiveBuffer();//清除接收缓存
			WIFI.ClearSendBuffer();  //清除发送缓存
		  }
	  }
	  }
	 }
	
//从上位机得到命令()
		if(WIFI.ReceiveBufferSize()>40)
		{
			u8 ch=0;
			u8 temp_cmd;
			 u32 temp;
			//test
		
			while(WIFI.ReceiveBufferSize()>8)
			{
				WIFI.GetReceivedData(&ch,1);
				if(ch==0xff)//判断包头
				{
					WIFI.GetReceivedData(&ch,1);
					if(ch==0xdd)//判断包头
					{
					  //得到指令
					   WIFI.GetReceivedData(command,6);
					   WIFI.ClearReceiveBuffer();
						
					   temp_cmd=command[4];  //得到命令位				
					   temp=command[0]+command[1]+command[2]+command[3];//得到设备号
						//命令处理
						if(temp_cmd==0XAA)//如果命令是注册
						{
							//读取RFID 将结果给上位机*********************************************
							double in_time;
							in_time=tskmgr.Time();
							rfid.PCDInit();
							while(1)
							{							
								tskmgr.DelayMs(500);
								if(tskmgr.Time()-in_time>=20)  //60秒读取等待
								{
									//返回结束
									break;
								}
								if(rfid.FindCard(MFRC522_PICC_REQALL,tagInfo))//寻到卡
								{
									if(rfid.PcdAntiColl(tagInfo))
									{																																
										if(rfid.PcdSelect(tagInfo))//选卡,卡号为前一步找到的卡号
										{																											
											if(rfid.PcdAuthState(MFRC522_PICC_AUTHENT1A,5,(unsigned char*)DefaultKey,tagInfo))//校验A密匙
											{
												rfid.PcdRead(5,basic_information);//第五块																		
												rfid.PcdRead(6,sensor);//第六块
													
											}
											
											if(rfid.PcdAuthState(MFRC522_PICC_AUTHENT1A,9,(unsigned char*)DefaultKey,tagInfo))//校验A密匙
											{
												rfid.PcdRead(9,version);//第9块
											}
								    		equipment_confirm(basic_information);//设备号存在判断,没有就存入
										    WIFI.SendData(Command3,17);
											tskmgr.DelayMs(100);
											WIFI.ClearSendBuffer();
											WIFI.SendData(packgroup.registered(basic_information,sensor,version),20);//打包发送	WIFI.SendData(a,6);												
											tskmgr.DelayMs(500);//这里必须保证充足的延时才能发送下一半
											
										}
											
									}
									
								}
								
							}
						}
						else if(temp_cmd==0XDD)//如果命令是删除
						{
							for(int n=0;n<10;n++)
							{
								if(temp==equipment[n])
									equipment[n]=0;  //删除这个设备
							}
						}
						else
						{
							DATA_COM.SendData(packgroup.CmmandTomodule(temp_cmd,temp),8); 	
						}

						
					}
				}
			}
			WIFI.ClearReceiveBuffer();
		}

	}
	
}
コード例 #13
0
ファイル: main.cpp プロジェクト: nihuyaka/libarmpit-cortex
    void Run(uint32_t i2cClockSpeed)
    {
        bool dmpReady = false; // set true if DMP init was successful
        uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
        uint8_t devStatus; // return status after each device operation (0 = success, !0 = error)
        uint16_t packetSize; // expected DMP packet size (default is 42 bytes)
        uint16_t fifoCount; // count of all bytes currently in FIFO
        uint8_t fifoBuffer[64]; // FIFO storage buffer

        Quaternion q; // [w, x, y, z] quaternion container
        VectorInt16 aa; // [x, y, z] accel sensor measurements
        VectorInt16 aaReal; // [x, y, z] gravity-free accel sensor measurements
        VectorInt16 aaWorld; // [x, y, z] world-frame accel sensor measurements
        VectorFloat gravity; // [x, y, z] gravity vector
        float eu[3]; // [psi, theta, phi] Euler angle container
        float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector
        uint16_t y, p, r;
        float yaw_offset;

        I2C1* i2c = GPIO_Helper::SetupI2C1_PB_6_9(i2cClockSpeed);
        i2c->SetErrorHandler(this);
        MPU6050 mpu(i2c);

        //Initialized with highest sensitivities
        mpu.reset();
        RCC_Delay_ms(50);
        mpu.initialize();

#ifdef USE_USART
        uint32_t clockSpeed = 1200000;
        USART* usart = GPIO_Helper::SetupUSART2_PA_2_3(clockSpeed);
#endif        

        devStatus = mpu.dmpInitialize();

        if (devStatus != 0)
        {
            while (1)
                ;
        }

        mpu.setDMPEnabled(true);
        packetSize = mpu.dmpGetFIFOPacketSize();

        while (1)
        {
            // wait for MPU interrupt or extra packet(s) available
            //while (!mpuInterrupt && fifoCount < packetSize) {
            //}

            // reset interrupt flag and get INT_STATUS byte
            mpuIntStatus = mpu.getIntStatus();
            // get current FIFO count
            fifoCount = mpu.getFIFOCount();
            // check for overflow (this should never happen unless our code is too inefficient)
            if (mpuIntStatus & 0x02)
            {
                // wait for correct available data length, should be a VERY short wait
                while (fifoCount < packetSize)
                    fifoCount = mpu.getFIFOCount();
                // read a packet from FIFO
                mpu.getFIFOBytes(fifoBuffer, packetSize);
                // track FIFO count here in case there is > 1 packet available
                // (this lets us immediately read more without waiting for an interrupt)
                fifoCount -= packetSize;

                // display quaternion values in easy matrix form: w x y z
                mpu.dmpGetQuaternion(&q, fifoBuffer);

                mpu.dmpGetEuler(eu, &q);
                eu[0] *= 180. / M_PI;
                eu[1] *= 180. / M_PI;
                eu[2] *= 180. / M_PI;
                mpu.dmpGetGravity(&gravity, &q);

                mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);

                //rad to degrees
                ypr[0] *= 180. / M_PI;
                ypr[1] *= 180. / M_PI;
                ypr[2] *= 180. / M_PI;

                // display real acceleration, adjusted to remove gravity
                mpu.dmpGetAccel(&aa, fifoBuffer);
                mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);

                // display initial world-frame acceleration, adjusted to remove gravity
                // and rotated based on known orientation from quaternion
                mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q);

#ifdef USE_USART
                if (usart->IsRXNE())
                {
                    if (usart->Receive() == 23)
                    {
                        usart->SendWord((int16_t)(ypr[0]));
                        usart->SendWord((int16_t) ypr[1]);
                        usart->SendWord((int16_t) ypr[2]);
                    }
                }

#endif                
            }
            else if ((mpuIntStatus & 0x10) || fifoCount == 1024)
            {
                // reset so we can continue cleanly
                mpu.resetFIFO();
            }
        }
    }
コード例 #14
0
int main(int argc, char **argv) {
	imu.start();

	out.printf("Battery: %f cell\n", batmon.getCellVoltage());
	out.print("Waiting for remote signal\n");
	while (!vex.getSynced()) { Task::sleep(100); }

	out.print("Arming\n");
	motors.arm();

	float heading = imu.getYaw();
	buzzer.buzz(300);

	while (true) {
		control.start();
		Logger logger(eeprom, 0);
		bool logging = false;
		
		while (true) {
			bool up = false;
			if (!vex.getSynced()) {
				control.stop();
				motors.off();
				while (!vex.getSynced()) { Task::sleep(100); }
				control.start();
				sensors.centerGyros();
				heading = imu.getYaw();
				buzzer.buzz(300);
			}
		
			VexRC::Channels chans = vex.getChannels();
	
			if (chans.right != VexRC::NONE)
				break;
			if (chans.left == VexRC::UP)
				logging = true;
			else if (chans.left == VexRC::DOWN)
				logging = false;
	
			float throttle = chans.analogs[1] / 50.0;
			if (throttle < 0)
				throttle = 0;
			float rollsetpoint = (-chans.analogs[3] / 50.0) * 0.3;
			float pitchsetpoint = (-chans.analogs[2] / 50.0) * 0.3;
			heading += (chans.analogs[0] / 50.0) * (M_PI / 4) * .005;
			
			control.setControlPoints(throttle, rollsetpoint, pitchsetpoint, heading);
			if (!up) {
				if (throttle > 0.4)
					up = true;
				else
					control.clearIntegrals();
			}
			
			if (logging) {
				LogEntry entry = { sensors.getReadings(), imu.getState(), throttle };
				logger.write((uint8_t *)&entry, sizeof(entry));
			}
			
			IMU::State state = imu.getState();
			IMU::State velstate = imu.getVelocityState();
			out.printf("%f %f\n", control.getRollCorrection(), control.getPitchCorrection());
			Task::sleep(25);
		}
		
		control.stop();
		motors.off();
		out.print("Push enter\n");
		while (out.getch() != '\r') { }
		
		out.print("Press y to dump log");
		if (out.getch() == 'y') {
			out.print("\nLog dump:");
			LogReader reader(eeprom, 0);
			struct LogEntry entry;
			while (reader.read((uint8_t *)&entry, sizeof(entry)) == sizeof(entry)) {
				int i;
				for (i=0;i<6;i++) {
					out.printf("%.3f ", entry.analogs.array[i]);
				}
				out.printf("%.3f %.3f %.3f ", entry.state.roll, entry.state.pitch, entry.state.yaw);
				out.printf("%.3f\n", entry.throttle);
			}
		}
		docalibrate("Roll", &controlconfig.roll_config);
		docalibrate("Pitch", &controlconfig.pitch_config);
		docalibrate("Yaw", &controlconfig.yaw_config);
		
		out.printf("Current stick values: %f %f\n", controlconfig.rollpitch_stickfactor, controlconfig.yaw_stickfactor);
		out.printf("Stick: ");
		static char buf[50];
		out.getline(buf, sizeof(buf));
		sscanf(buf, "%f %f", &controlconfig.rollpitch_stickfactor, &controlconfig.yaw_stickfactor);
	}
}
コード例 #15
0
ファイル: helloworld.cpp プロジェクト: matthewbot/Quadcopter
int main(int argc, char **argv) {	
	out.print("Hello World!\n");
}
コード例 #16
0
ファイル: USART.cpp プロジェクト: cybercircuits/qsimkit
		void spiMaster() {
			// TXEPT is 1 after reset
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getU0TCTL(), 1));

			m->setByte(v->getP1SEL(), 0x31);
			m->setByte(v->getU0CTL(), 0); // UCSWRST
			// UCTL0 = CHAR + SYNC + MM + SWRST;
			m->setByte(v->getU0CTL(), 23);
			// UTCTL0 = SSEL1 + SSEL0 + STC;
			m->setByte(v->getU0TCTL(), 51);
			m->setByte(v->getUC0IE(), 255);
 			// ME1 |= USPIE0;                            // Enable USART0 SPI mode
 			// UCTL0 &= ~SWRST;                          // Initialize USART state machine
			m->setByte(v->getU0ME(), 255);
			m->setByte(v->getU0CTL(), 22);
			// Set BR
			m->setByte(v->getU0BR0(), 2);

			// nothing should happen until we send character
			CPPUNIT_ASSERT_EQUAL(-1.0, watcher->sclk);
			usart->tickRising(); usart->tickFalling();
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(-1.0, watcher->sclk);
			// No transmission, TXEPT is 1
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getU0TCTL(), 1));

			// Set TX IFG just to test it gets cleared by write to TXBUF later
			m->setBit(v->getU0IFG(), 128, true);
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getU0IFG(), 128));

			// start transmitting - we will transfer 8 bits
			m->setByte(v->getU0TXBUF(), 55); // 00110111
			CPPUNIT_ASSERT_EQUAL(-1.0, watcher->sclk);

			// Write to TXBUF should clear TX IFG
			CPPUNIT_ASSERT_EQUAL(false, m->isBitSet(v->getU0IFG(), 128));
			// We are transmitting now, so TXEPT should be 0
			CPPUNIT_ASSERT_EQUAL(false, m->isBitSet(v->getU0TCTL(), 1));

			// Disable SWRST
			m->setBit(v->getU0CTL(), 1, false);

		/// BIT 1
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sdo);

			// prepare '1' to be captured
			pinManager->handlePinInput(0, 3.0);

			//  bit captured from SOMI
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 2
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 0.0);

			// cnt--, bit captured from SDI
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 3
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 3.0);

			// cnt--, bit captured from SDI
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 4
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 0.0);

			// cnt--, bit captured from SDI
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 5
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 3.0);

			// cnt--, bit captured from SDI
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 6
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 0.0);

			// cnt--, bit captured from SDI
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 7
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 3.0);

			// cnt--, bit captured from SDI
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(false, intManager->hasQueuedInterrupts());

		/// BIT 8
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 0.0);

			CPPUNIT_ASSERT_EQUAL(true, intManager->hasQueuedInterrupts());
			CPPUNIT_ASSERT_EQUAL(false, m->isBitSet(v->getU0IFG(), 1 << 6));
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getU0IFG(), 1 << 7));

			// cnt--, bit captured from SDI
			usart->tickRising(); usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

			// Transmission stopped, UCBUSY is 0 again
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getU0TCTL(), 1));

			// Check RX IFG flag now, because after reading the value, it should be cleared
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getU0IFG(), 1 << 6));
			CPPUNIT_ASSERT_EQUAL(170, (int) m->getByte(v->getU0RXBUF()));

		/// INTERRUPT
			// RX IFG is cleared by reading RX BUF
			CPPUNIT_ASSERT_EQUAL(false, m->isBitSet(v->getU0IFG(), 1 << 6));
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getU0IFG(), 1 << 7));
			CPPUNIT_ASSERT_EQUAL(true, intManager->hasQueuedInterrupts());
		}
コード例 #17
0
ファイル: USART.cpp プロジェクト: cybercircuits/qsimkit
		void spiSlave() {
			m->setByte(v->getP1SEL(), 0x31);
			m->setByte(v->getUCA0CTL1(), 0); // UCSWRST
			// UCA0CTL0 |= UCSYNC+UCMSB;
			m->setByte(v->getUCA0CTL0(), 33);
			// UCA0CTL1 &= ~UCSWRST;
			m->setByte(v->getUCA0CTL1(), 0);
			// UCA0IE |= UCRXIE | UCTXIE;
			m->setByte(v->getUC0IE(), 255);

			m->setByte(v->getUCA0TXBUF(), 55); // 00110111

			// nothing should happen, because we are slave
			CPPUNIT_ASSERT_EQUAL(-1.0, watcher->sclk);
			usart->tickRising();
			usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(-1.0, watcher->sclk);

			// Transfer byte
			for (int i = 0; i < 8; ++i) {
				pinManager->handlePinInput(1, 3.0);
				pinManager->handlePinInput(2, 3.0);
				pinManager->handlePinInput(2, 0.0);
				CPPUNIT_ASSERT_EQUAL((bool)(55 & (1 << (7 - i))), (bool)watcher->sdo); break;
			}

/*
		/// BIT 2
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 0.0);

			// cnt--, bit captured from SDI
			usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 3
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 3.0);

			// cnt--, bit captured from SDI
			usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 4
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 0.0);

			// cnt--, bit captured from SDI
			usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 5
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 3.0);

			// cnt--, bit captured from SDI
			usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 6
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 0.0);

			// cnt--, bit captured from SDI
			usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

		/// BIT 7
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 3.0);

			// cnt--, bit captured from SDI
			usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(false, intManager->hasQueuedInterrupts());

		/// BIT 8
			// First (MSB) bit should be sent and rising clock generated
			usart->tickRising();
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sclk);
			CPPUNIT_ASSERT_EQUAL(3.0, watcher->sdo);

			// prepare '0' to be captured
			pinManager->handlePinInput(0, 0.0);

			CPPUNIT_ASSERT_EQUAL(true, intManager->hasQueuedInterrupts());
			CPPUNIT_ASSERT_EQUAL(false, m->isBitSet(v->getUC0IFG(), 1));
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getUC0IFG(), 2));

			// cnt--, bit captured from SDI
			usart->tickFalling();
			CPPUNIT_ASSERT_EQUAL(0.0, watcher->sclk);

			// Transmission stopped, UCBUSY is 0 again
			CPPUNIT_ASSERT_EQUAL(false, m->isBitSet(v->getUCA0STAT(), 1));

			// Check RX IFG flag now, because after reading the value, it should be cleared
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getUC0IFG(), 1));
			CPPUNIT_ASSERT_EQUAL(170, (int) m->getByte(v->getUCA0RXBUF()));

		/// INTERRUPT
			// RX IFG is cleared by reading RX BUF
			CPPUNIT_ASSERT_EQUAL(false, m->isBitSet(v->getUC0IFG(), 1));
			CPPUNIT_ASSERT_EQUAL(true, m->isBitSet(v->getUC0IFG(), 2));
			CPPUNIT_ASSERT_EQUAL(true, intManager->hasQueuedInterrupts());*/
		}
コード例 #18
0
/* ----------------------------------------------------------------------------
 * セットアップ処理
 * ---------------------------------------------------------------------------- */
void setup() {
	
	// Watchdog タイマ停止
	MCUSR = 0;
	wdt_disable();
	
	// SPI 設定
	DDRB |= (1<<PORTB1);
	DDRB |= (1<<PORTB2);
	// Master 設定
	SPCR |= (1<<MSTR);
	// ClockDivide 000 = 1/4
	SPCR &= ~(1<<SPR1);
	SPCR &= ~(1<<SPR0);
	SPSR &= ~(1<<SPI2X);
	// MODE 0
	SPCR &= ~(1<<CPOL);
	SPCR &= ~(1<<CPHA);
	// MSB First
	SPCR &= ~(1<<DORD);
	// SPI Enable
	SPCR |= (1<<SPE);

	// LED ポート出力
	DDRC |= (1<<LED);
	
	PORTD = 0;
	
	Serial1.begin();
	i2c.begin();

	// リセット直後の時間待ち(1秒)
	for(int i = 0; i < 100; i++) {
		_delay_ms(10);
	}
	rtc.begin();
	
	// 74HC595
	DDRB |= (1<<HC595RCLK);
	PORTB &= ~(1<<HC595RCLK);

	// K155ID1
	DDRB |= (1<<K155ID1_A);
	DDRB |= (1<<K155ID1_B);
	DDRB |= (1<<K155ID1_C);
	DDRB |= (1<<K155ID1_D);

	// IN12 カンマ
	DDRE |= (1<<COMMA);

	// EEPROM 読み出し
	eeprom_busy_wait();
	displayDateIntervalValue = eeprom_read_word(&E_displayDateIntervalValue);
	eeprom_busy_wait();
	displayDateSecondsValue = eeprom_read_word(&E_displayDateSecondsValue);
	eeprom_busy_wait();
	userDataTimerValue = eeprom_read_word(&E_userDataTimerValue);
	eeprom_busy_wait();
	dispTimeFormat = eeprom_read_byte(&E_dispTimeFormat);
	eeprom_busy_wait();
	IN12BrightDaytime = eeprom_read_byte(&E_IN12BrightDaytime);
	eeprom_busy_wait();
	IN12BrightNight = eeprom_read_byte(&E_IN12BrightNight);
	eeprom_busy_wait();
	hourDaytime = eeprom_read_byte(&E_hourDaytime);
	eeprom_busy_wait();
	hourNight = eeprom_read_byte(&E_hourNight);
	eeprom_busy_wait();
	hour12_24format = eeprom_read_byte(&E_hour12_24format);

	// タイマー、カウンタ 0 初期化
	// Disbale interrupt
	TIMSK0 &= ~(1<<OCIE0B);
	TIMSK0 &= ~(1<<OCIE0A);
	TIMSK0 &= ~(1<<TOIE0);
	// 比較一致タイマ/カウンタ解除(CTC)動作
	TCCR0B &= ~(1<<WGM02);
	TCCR0A |= (1<<WGM01);
	TCCR0A &= ~(1<<WGM00);
	// clkI/O/64 (64分周)
	TCCR0B &= ~(1<<CS02);
	TCCR0B |= (1<<CS01);
	TCCR0B |= (1<<CS00);
	TCNT0 = 0;
	// 16MHz / 64 = 4us. 4us * 250 = 1.0ms
	OCR0A =  249;
	// set interrupt mask
	TIFR0 |= (1<<OCF0A);
	// Enable interrupt
	TIMSK0 |= (1<<OCIE0A);

	// Watchdog タイマ設定
	wdt_enable(WDTO_1S);
	
	// 割り込み処理を有効にする
	sei();
}
コード例 #19
0
ファイル: main.cpp プロジェクト: lissettecarlr/CO2_Module
int main(){
	u8 order=0;
	double record_updataSensor=0;
	double record_alive=0;
	double record_getwifi=0;
	bool network=false ; //网络连接标识位 
	char *ip = (char*)calloc(15, sizeof(char*) ); 
	char *WifiName = (char*)calloc(20, sizeof(char*) ); 
	char *WifiPassword = (char*)calloc(20, sizeof(char*) ); 
	
/*开机WIFI模式选择*****************************************************************/
	if(wifimemory.getWifiSum()!=0)//判断表中是否已经保存wifi信息
	{
		while( wifimemory.Load(WifiName,WifiPassword) )
		 {
			  if(wifi.ConnectNetwork_client(WifiName,WifiPassword,SERVER_IP,1111)) //每次连接历时20秒
				{network=true;   break;}
		 }
		 if(network ==false) {
			  wifi.ConnectNetwork_server(MODULE_COM,0);
			 	WIFI.ClearReceiveBuffer();
		 }
	}
  else
	{
		 wifi.ConnectNetwork_server(MODULE_COM,0);
			WIFI.ClearReceiveBuffer();
	}
	
	Led.SetLevel(1);//将指示灯熄灭(模式切换结束)
/*END*********************************************************************************/	

while(1)
	{		
		order=CMCT_Tool.GetStateOrder(WIFI);
		switch(order)
		{
			case DELAY:{}break;
	/*启动********************************************************************************************/
			case START:{//启动
				while(1){
							if(tskmgr.ClockTool(record_updataSensor,3)) //每三秒执行一次更新
							{
								co2.Updata();
								if(network)
									wifi.Send(20,CMCT_Tool.ToServerPack(CO2Number,co2.DATA_H,co2.DATA_L,0));	
								else
									wifi.Send(0,20,CMCT_Tool.ToClientPack(CO2Number,co2.DATA_H,co2.DATA_L,0));	
							}
							if(CMCT_Tool.GetStateOrder(WIFI)==DELAY)
							break;					
				}
			}break;
	/*END********************************************************************************************/			
			
	/*复位******************************************************************************************/
			case RESET:{//复位
					wifimemory.ClearAllData(); //清空所有保存信息
					*((u32 *)0xE000ED0C) = 0x05fa0004;
			}break;
	/*END******************************************************************************************/
			
	/*获取WIFI信息*********************************************************************************/		
			case GETWIFI:{//得到wifi账号密码
				record_getwifi=tskmgr.Time();
					while(1)
					{
						if(CMCT_Tool.GetWifiNameAndPassword(WifiName,WifiPassword,WIFI) )
						{
								//保存WIFI账号密码
								com<<WifiName<<"\t"<<WifiPassword<<"\n";
								break;
						}
						if(tskmgr.ClockTool(record_getwifi,30)) //超时10秒退出
						   break;
					}
			}break;
	/*END******************************************************************************************/
			
	/*模式切换*************************************************************************************/
			case MODEL:{//模式切换
					wifi.ConnectNetwork_server(MODULE_COM,0);
					WIFI.ClearReceiveBuffer();
					network=false;
			}break;
	/*END******************************************************************************************/

	/*存活确认*************************************************************************************/			
			case ALIVE:{//存活确认
				if(network)
					CMCT_Tool.SendAlive(wifi,CO2Number,1); //存活确认,数据位全为0xff
				else
					CMCT_Tool.SendAlive(wifi,CO2Number,0);
			}break;			
	/*END******************************************************************************************/		
			
	/*常态******************************************************************************************/		
			default:		
			{  
					if(tskmgr.ClockTool(record_updataSensor,3)) //每三秒执行一次更新
						 co2.Updata();//当没有命令时更新传感器
						if(tskmgr.ClockTool(record_alive,60)) //每60秒发送一次存活确认
					{
						if(network)
							CMCT_Tool.SendAlive(wifi,CO2Number,1);
						else
							CMCT_Tool.SendAlive(wifi,CO2Number,0);
					}
			}
		}		
	}
}