Ejemplo n.º 1
0
void CreateJoyTask(void){
	OS_TCID joyId;
	Init_Joy();

	joyId=CoCreateTmr(TMR_TYPE_PERIODIC,1,50,JoyTimer);
	CoStartTmr(joyId);


}
Ejemplo n.º 2
0
void taskGD(void *pdata){





	//создаем таймер таймаута получени¤ 2 секунды хватит
	sftmr = CoCreateTmr(TMR_TYPE_ONE_SHOT, 200,	0, PacketTimeOut);
	int i=0;


	//GD_WriteEnable();
	//GD_EraseSector(0);
	//CoTickDelay(2);
/*
	for (i=0;i<256;i++){
		Env.rxBuf[8+i]=i;
	}
	GD_WriteEnable();
	GD_WritePage(0, &(Env.rxBuf[8]));
	CoTickDelay(1);
	GD_ReadPage(0, &Env.GDPage[0]);
	//check
	bool badWrite1=FALSE;
	for (i=0;i<256;i++){
		if (Env.GDPage[i]!=Env.rxBuf[8+i]){
			badWrite1=TRUE;
		}
	}
*/


	  //GD_WriteEnable();
	  u8 GD_StateLow = GD_GetStatusLow();

	  Env.State=WaitingStart;


	while(1){
		Env.canListen=TRUE;
		//ждем новый пакет while(Env.rxIndex==0);
		CoSuspendTask(Env.gdTaskID);

		if (Env.rxBuf[0]==PACKET_START){
			//good
			Env.State=ReceivingPacket;
			//стартуем таймер
			StatusType result = CoStartTmr(sftmr);
		}else{
			Env.rxIndex=0;
			Env.State=WaitingStart;
			continue;
		}
		u16 packetSizeWithStart=0;
		while(Env.State==ReceivingPacket){//статус может изменить таймер таймаута
			//0xB1 0x01 0x09
			if (Env.rxIndex>3 && packetSizeWithStart==0){
				packetSizeWithStart=Env.rxBuf[1]+
						(Env.rxBuf[2]*256)+1;
				if (packetSizeWithStart>RX_BUF_SIZE-6){
					Env.rxIndex=0;
					Env.State=WaitingStart;
					continue;
				}
			}
			else if(Env.rxIndex==packetSizeWithStart
					&& Env.rxIndex>3){
				//ѕакет пришел. останавливаем таймер и провер¤ем его
				StatusType result = CoStopTmr(sftmr);
				Env.canListen=FALSE;
				Env.State=Processing;
				//check CRC
				u8 crc=0;
				//265-2=263
				for (i=0;i<packetSizeWithStart-2;i++){
					crc+=Env.rxBuf[i];
				}
				if (crc==Env.rxBuf[packetSizeWithStart-2]&&
						crc^0xAA==Env.rxBuf[packetSizeWithStart-1]){

				//processPacket();
					if (Env.rxBuf[3]==0x03){//write page
						u32 address=Env.rxBuf[4]|
								Env.rxBuf[5]<<8 | Env.rxBuf[6]<<16 |
								Env.rxBuf[7]<<24;

						//очищаем сектор
						/*
						if (address%4096==0){
							GD_WriteEnable();
							GD_EraseSector(address);
							while(GD_GetStatusLow()&1 == 1)
							{
								CoTickDelay(2);
							}
						}*/

						GD_WriteEnable();
						//CoSchedLock();
						GD_WritePage(address, &(Env.rxBuf[8]));
						u8 cnt=200;
						while(GD_GetStatusLow()&1 == 1//wait WIP flag
								&& --cnt>0)
						{
							CoTickDelay(1);
						}
						GD_ReadPage(address, &Env.GDPage[0]);
						//CoSchedUnlock();
						//check
						bool badWrite=FALSE;
						for (i=0;i<256;i++){
							if (Env.GDPage[i]!=Env.rxBuf[8+i]){
								badWrite=TRUE;
								break;
							}
						}
						Env.State=SendingAnswer;
						Env.txBuf[0]=0xB1;
						Env.txBuf[1]=0x09;
						Env.txBuf[2]=0x00;
						Env.txBuf[3]=0x04;
						Env.txBuf[4]=address;
						Env.txBuf[5]=address>>8;
						Env.txBuf[6]=address>>16;
						Env.txBuf[7]=address>>24;
						if (badWrite){
							Env.txBuf[3]=0x06;
						}
						Env.txBuf[8]=0;
						for (i=0;i<8;i++){
							Env.txBuf[8]+=Env.txBuf[i];
						}
						Env.txBuf[9]=Env.txBuf[8]^0xAA;
						Env.txIndex=0;
						Env.State=SendingAnswer;
					}
					//processPacket();
				}else{//crc error
					Env.rxIndex=0;
					Env.State=WaitingStart;
					continue;
				}

			}//Env.rxIndex==packetSizeWithStart