static void updateOurKartStatus(void){
	uint8_t gameStatusByte = getDataByte(GAME_STATUS_COM_INDEX,our_kart.game_status_byte);
	
	//Update Number of Laps
		uint8_t numLapsLeft = maskAndShiftByte (gameStatusByte, NUM_LAPS_LEFT_MASK, NUM_LAPS_LEFT_SHIFT);
		if(our_kart.numLaps != numLapsLeft){
				ES_Event ThisEvent;
				ThisEvent.EventType = LapUpdate;
				ThisEvent.EventParam = numLapsLeft;
				PostStrategySM(ThisEvent);
				our_kart.numLaps = numLapsLeft;
			}
		//Update Obstacle Status only do this until the obstacle has been made
		 if(our_kart.obstacleStatus == 0){
				uint8_t obstacleStatus = maskAndShiftByte(gameStatusByte, OBSTACLE_STATUS_STATUS_MASK, OBSTACLE_STATUS_STATUS_SHIFT);
				if(obstacleStatus!=our_kart.obstacleStatus){
					ES_Event ThisEvent;
					ThisEvent.EventType = ObstacleComplete;
					PostStrategySM(ThisEvent);
					our_kart.obstacleStatus = 1;
				}
			}
		//Update TargetStatus
		if(our_kart.targetStatus ==0){
			uint8_t targetStatus = maskAndShiftByte (gameStatusByte, TARGET_STATUS_MASK, TARGET_STATUS_SHIFT);	
			//printf("\r0x%#08x = Game_Status_Byte,  0x%#08x = targetStatus\n", gameStatusByte, targetStatus);
			if(targetStatus!=our_kart.targetStatus){
				ES_Event ThisEvent;
				ThisEvent.EventType = TargetComplete;
				PostStrategySM(ThisEvent);
				our_kart.targetStatus = 1;
			}
		} 
		//Update Run Status
			ES_Event ThisEvent;
			uint8_t status = maskAndShiftByte (gameStatusByte, RUN_STATUS_MASK, RUN_STATUS_SHIFT);
			if(status!= RunStatus){
				RunStatus = status;
				if(status == 0x01){
					ThisEvent.EventType = FlagDropped;
			    PostStrategySM(ThisEvent);	
					HWREG(GPIO_PORTB_BASE +(GPIO_O_DATA + ALL_BITS))|= (BIT3HI);
				}
				else if(status ==0x02){
					ThisEvent.EventType = CautionFlag;
				
				 	PostStrategySM(ThisEvent);
					PostTurningFSM(ThisEvent);
					HWREG(GPIO_PORTB_BASE +(GPIO_O_DATA + ALL_BITS))&= ~(BIT3HI);
				}
				else if(status == 0x03){
					ThisEvent.EventType = RaceOver;
			
					PostStrategySM(ThisEvent);
					PostTurningFSM(ThisEvent);
					HWREG(GPIO_PORTB_BASE +(GPIO_O_DATA + ALL_BITS))&= ~(BIT3HI);
				}
			}
			
}
static void posDataUpdate(Kart* thisKart){
	thisKart->currentXPosition = 0;
	thisKart->currentYPosition = 0;
	thisKart->currentOrientation = 0;
	uint16_t zoneNumber = 0;
	uint16_t XPosition = 0x0000;
	uint16_t YPosition = 0x0000;
	int16_t orientation = 0x0000;
	XPosition|= getDataByte(thisKart->position_command_index, POS_X_M_INDEX)<<8;
	XPosition|= getDataByte(thisKart->position_command_index, POS_X_L_INDEX);
	
	YPosition|= getDataByte(thisKart->position_command_index, POS_Y_M_INDEX)<<8;
	YPosition|= getDataByte(thisKart->position_command_index, POS_Y_L_INDEX);
	orientation|= getDataByte(thisKart->position_command_index, ORIENT_M_INDEX)<<8;
	orientation|= getDataByte(thisKart->position_command_index, ORIENT_L_INDEX);
	
	thisKart->currentXPosition = XPosition;
	thisKart->currentYPosition = YPosition;
	thisKart->currentOrientation = orientation;
	
	zoneNumber = determineZone(XPosition,YPosition, thisKart);
	
	if(thisKart->kartNumber == our_kart.kartNumber){
		if(zoneNumber != thisKart->zone){
			ES_Event Event;
			Event.EventType = ZoneUpdate;
			Event.EventParam = zoneNumber;
			PostStrategySM(Event);
			PostTurningFSM(Event);
			thisKart->zone = zoneNumber;
		}
	}
}
static void updateOurKartStatus(){
	currentByte = getDataByte(GAME_STATUS_COMMAND_INDEX,(our_kart.kartNumber+GAME_STATUS_BYTE_INDEX));
	
	//Update Number of Laps
		uint8_t numLapsLeft = maskAndShiftByte (currentByte, NUM_LAPS_LEFT_MASK, NUM_LAPS_LEFT_SHIFT);
		if(our_kart.numLaps != numLapsLeft){
				ES_Event ThisEvent;
				ThisEvent.EventType = LAP_UPDATE;
				ThisEvent.EventParam = numToTranslate;
				PostStrategySM(ThisEvent);
				our_kart.numLaps = numLapsLeft;
			}
		//Update Obstacle Status only do this until the obstacle has been made
		 if(our_kart.obstacleStatus == 0){
				uint8_t obstacleStatus = maskAndShiftByte(currentByte, OBSTACLE_STATUS_STATUS_MASK, OBSTACLE_STATUS_STATUS_SHIFT);
				if(obstacleStatus!=our_kart.obstacleStatus){
					ES_Event ThisEvent;
					ThisEvent.EventType = OBSTACLE_COMPLETE;
					PostStrategySM(ThisEvent);
					our_kart.obstacleStatus = 1;
				}
			}
		//Update TargetStatus
		if(our_kart.targetStatus ==0){
			uint8_t targetStatus = maskAndShiftByte (currentByte, TARGET_STATUS_MASK, TARGET_STATUS_SHIFT);	
			if(targetStatus!=our_kart.targetStatus){
				ES_Event ThisEvent;
				ThisEvent.EventType = TARGET_COMPLETE;
				PostStrategySM(ThisEvent);
				our_kart.targetStatus = 1;
			}
		} 
		
		//Update Run Status
			ES_Event ThisEvent;
			uint8_t runStatus = maskAndShiftByte (currentByte, RUN_STATUS_MASK, RUN_STATUS_SHIFT);
			if(runStatus == 0x01){
				ThisEvent.EventType = FLAG_DROPPED;
				PostStrategySM(ThisEvent);
			}
			else if(runStatus ==0x02){
				ThisEvent.EventType = CAUTION_FLAG;
				PostStrategySM(ThisEvent);
			}
			else if(runStatus == 0x03){
				ThisEvent.EventType = RACE_OVER;
				PostStrategySM(ThisEvent);
			}
			
}
Exemple #4
0
void Video::tick()
{
	const unsigned char data = getDataByte();
	const unsigned char rowToPlot = getRowToPlot(data);

	this->picgen.tick(this->t,rowToPlot);

	updateFlash();

	++this->t;

	if (this->t >= E2Const::BYTES_PER_FIELD)
	{
		this->t = 0;
	}
}