//#include #include #include "../shared.h" /* possible states of the badge */ #define RECEIVING_REQUEST 1 #define SENDING_REPLY 2 /* reload value for 16-bit 10 ms counter assuming 22MHz clock */ #define RELOAD_HI 0xB8 #define RELOAD_LO 0x63 #define IN_BUFFER_SIZE 8 #define OUT_BUFFER_SIZE 8 /* buffers */ unsigned char in_buffer [IN_BUFFER_SIZE]; unsigned char out_buffer [OUT_BUFFER_SIZE]; /* total # of bytes received into in_buffer */ unsigned char bytes_received = 0; /* # of bytes sent from out_buffer */ unsigned char bytes_sent = 0; /* total # of bytes to send from out_buffer */ unsigned char bytes_to_send = 0; /* 50 ms time out flag */ unsigned char timed_out = 0; /* badge ID */ unsigned char badgeID = 'l'; /* create reply packet in out_buffer according to in_buffer */ void format_reply(char* in_buffer, char* out_buffer); /* set SFR values on startup */ void init(); /* send address byte of packet to test if RF board is busy */ void send_address_byte(); void main() { /* state of badge */ unsigned char state = RECEIVING_REQUEST; //P1 = 0x00; init(); /* loop forever to serve requests */ for(;;) { switch(state) { case RECEIVING_REQUEST: if(bytes_received >= HEADER_LENGTH + REQUEST_LENGTH) { state = SENDING_REPLY; } break; case SENDING_REPLY: /* for demo: read ID from port 1 */ badgeID = P1; bytes_received = 0; format_reply(in_buffer, out_buffer); //send address byte of packet to test if RF board is busy send_address_byte(); //wait till RF board is NOT busy while(1) { if (bytes_received > 0) { if(in_buffer[0] == out_buffer[0]) { //address byte echoed; send the rest of packet TR0 = 0; bytes_to_send = HEADER_LENGTH + RESPONSE_LENGTH; //assert(bytes_sent == 1); TI = 1; break; } bytes_received = 0; } else if (timed_out) { //test again send_address_byte(); } } //wait till whole packet's been sent while(bytes_sent < bytes_to_send) ; bytes_received = 0; state = RECEIVING_REQUEST; break; default: bytes_received = 0; state = RECEIVING_REQUEST; } } }/* end of main */ /* create the reply packet in out_buffer */ void format_reply(char* in_buffer, char* out_buffer) { //swap the upper 4 bits with the lower 4 char temp = in_buffer[0] << 4; out_buffer[0] = temp | in_buffer[0] >> 4; out_buffer[1] = 8; //telemetry out_buffer[2] = RESPONSE_LENGTH; out_buffer[3] = 2; out_buffer[4] = RESPONSE_CODE; out_buffer[5] = badgeID; out_buffer[6] = 3; } //send address byte of packet to test if RF board is busy void send_address_byte() { timed_out = 0; bytes_sent = 0; bytes_to_send = 1; TH0 = RELOAD_HI; TL0 = RELOAD_LO; TR0 = 1; //set time-out TI = 1; } void Timer0_ISR () interrupt 1 { static unsigned char count = 0; if(++count == 5) { TR0 = 0; count = 0; timed_out = 1; } TH0 = RELOAD_HI; TL0 = RELOAD_LO; } /* end of Timer0_ISR() */ void Serial_ISR() interrupt 4 { if(RI==1) { RI = 0; if(bytes_received < IN_BUFFER_SIZE) in_buffer[bytes_received++] = SBUF; } else { TI = 0; if(bytes_sent < bytes_to_send) SBUF = out_buffer[bytes_sent++]; } }/* end of Serial_ISR() */ void init() { /* interrupt settings */ EA = 1; ET0 = 1; ET1 = 0; ES = 1; /* set serial */ SM0 = 0; SM1 = 1; REN = 1; /* setup timer0 as a 50 ms counter, timer1 as 19.2 kbps baud rate generator, assuming a 22MHz clock */ TMOD = 0x21; PCON = PCON | 0x80; TH0 = RELOAD_HI; TL0 = RELOAD_LO; TH1 = 250; TR1 = 1; }/* end of init() */