void CreateJoyTask(void){ OS_TCID joyId; Init_Joy(); joyId=CoCreateTmr(TMR_TYPE_PERIODIC,1,50,JoyTimer); CoStartTmr(joyId); }
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