ir stuff working nicely. rx on interrupt. tx is blocking.

Fork of 4180_mP_WirelessPong_revB by Curtis Mulady

Committer:
cmulady
Date:
Fri Oct 05 22:13:55 2012 +0000
Revision:
12:9acca1dd0e8e
Parent:
10:4fcd5bdb9642
Child:
13:17fd813ef7c9
Cleaned. About to fork

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cmulady 0:c8ddcaa575ba 1 #include "mbed.h"
cmulady 0:c8ddcaa575ba 2 #include "rtos.h"
cmulady 0:c8ddcaa575ba 3 #include "NokiaLCD.h"
cmulady 1:9ba884d85ac6 4 #include "XMIT_IR.h"
cmulady 0:c8ddcaa575ba 5
cmulady 1:9ba884d85ac6 6 #define FPS 5
cmulady 1:9ba884d85ac6 7
cmulady 3:8e492eacd346 8 /****************************************
cmulady 3:8e492eacd346 9 |=======================================|
cmulady 3:8e492eacd346 10 |MBED Connections: |
cmulady 3:8e492eacd346 11 | -p5 : DIO on Sparkfun Nokia LCD |
cmulady 3:8e492eacd346 12 | -p7 : CLK on Sparkfun Nokia LCD |
cmulady 3:8e492eacd346 13 | -p8 : CS on Sparkfun Nokia LCD |
cmulady 3:8e492eacd346 14 | -p9 : RST on Sparkfun Nokia LCD |
cmulady 12:9acca1dd0e8e 15 | -p21: CTL on Sparkfun IR Xmitter |
cmulady 12:9acca1dd0e8e 16 | -p14: OUT on Sparkfun IR Rcvr |
cmulady 12:9acca1dd0e8e 17 | -p13: GND on Sparkfun IR Xmitter |
cmulady 3:8e492eacd346 18 |=======================================|
cmulady 3:8e492eacd346 19 ****************************************/
cmulady 1:9ba884d85ac6 20
cmulady 3:8e492eacd346 21 //Pin Setup
cmulady 1:9ba884d85ac6 22 DigitalOut led1(LED1);
cmulady 1:9ba884d85ac6 23 DigitalOut led2(LED2);
cmulady 3:8e492eacd346 24 DigitalOut led3(LED3);
cmulady 3:8e492eacd346 25 DigitalOut led4(LED4);
cmulady 0:c8ddcaa575ba 26 NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type
cmulady 5:2e08cc167fff 27 Serial device(p13, p14); // tx, rx
cmulady 6:5563f0026858 28 Serial pc(USBTX,USBRX);
cmulady 5:2e08cc167fff 29 PwmOut IRLED_mod(p21);
cmulady 1:9ba884d85ac6 30
cmulady 3:8e492eacd346 31 //Global Vars
cmulady 12:9acca1dd0e8e 32 char text_buffer[32];
cmulady 6:5563f0026858 33 char irdatOUT[10];
cmulady 6:5563f0026858 34 char irdatIN[10];
cmulady 12:9acca1dd0e8e 35 char irdata_out=0;
cmulady 6:5563f0026858 36 char error_code=0;
cmulady 8:54dd4a3d0de9 37 Thread* threadptr_irstuff;
cmulady 9:3e4e9d6a8ad8 38 char packet_buff[10];
cmulady 10:4fcd5bdb9642 39 Mail<char,64> rx_data_mailbox;
cmulady 1:9ba884d85ac6 40
cmulady 3:8e492eacd346 41 //Function Prototypes
cmulady 1:9ba884d85ac6 42 void BlinkAlive(void const* arguments);
cmulady 1:9ba884d85ac6 43 void UpdateLCD(void const* arguments);
cmulady 3:8e492eacd346 44 void IRStuff(void const* arguments);
cmulady 6:5563f0026858 45 void MakePacket(char* data,int len);
cmulady 7:c9ff6b5c8507 46 void ISR_UARTRX(void);
cmulady 12:9acca1dd0e8e 47 char CheckPacket(char new_data, char* packet_buffer, char* data, int data_len);
cmulady 1:9ba884d85ac6 48
cmulady 1:9ba884d85ac6 49
cmulady 1:9ba884d85ac6 50 int main()
cmulady 1:9ba884d85ac6 51 {
cmulady 0:c8ddcaa575ba 52
cmulady 3:8e492eacd346 53 //LCD init
cmulady 0:c8ddcaa575ba 54 lcd.background(0x000000);
cmulady 1:9ba884d85ac6 55
cmulady 3:8e492eacd346 56 //PWM init
cmulady 3:8e492eacd346 57 IRLED_mod.period(1.0/38000.0); //38kHz Modulation Freq
cmulady 3:8e492eacd346 58 IRLED_mod = 0.5; //pulse width = 50%
cmulady 3:8e492eacd346 59
cmulady 3:8e492eacd346 60 //Serial init
cmulady 3:8e492eacd346 61 device.baud(2400);
cmulady 10:4fcd5bdb9642 62 device.attach(&ISR_UARTRX,Serial::RxIrq);
cmulady 3:8e492eacd346 63
cmulady 6:5563f0026858 64 //PC serial init
cmulady 6:5563f0026858 65 pc.baud(19200);
cmulady 7:c9ff6b5c8507 66 pc.printf("Starting...\n\n");
cmulady 6:5563f0026858 67
cmulady 9:3e4e9d6a8ad8 68 //Variable Init
cmulady 9:3e4e9d6a8ad8 69 for(int i=0; i<10; i++) packet_buff[i]=0;
cmulady 9:3e4e9d6a8ad8 70
cmulady 12:9acca1dd0e8e 71 //Threads init
cmulady 1:9ba884d85ac6 72 Thread thread_blinkalive(BlinkAlive);
cmulady 1:9ba884d85ac6 73 Thread thread_updatelcd(UpdateLCD);
cmulady 3:8e492eacd346 74 Thread thread_irstuff(IRStuff);
cmulady 8:54dd4a3d0de9 75 threadptr_irstuff = &thread_irstuff;
cmulady 1:9ba884d85ac6 76
cmulady 1:9ba884d85ac6 77
cmulady 1:9ba884d85ac6 78
cmulady 0:c8ddcaa575ba 79 while(1) {
cmulady 12:9acca1dd0e8e 80
cmulady 12:9acca1dd0e8e 81 //Use main loop to set LCD framerate
cmulady 1:9ba884d85ac6 82 thread_updatelcd.signal_set(0x1);
cmulady 1:9ba884d85ac6 83 Thread::wait(1000/FPS);
cmulady 1:9ba884d85ac6 84
cmulady 0:c8ddcaa575ba 85 }
cmulady 0:c8ddcaa575ba 86 }
cmulady 1:9ba884d85ac6 87
cmulady 1:9ba884d85ac6 88 void UpdateLCD(void const* arguments)
cmulady 1:9ba884d85ac6 89 {
cmulady 7:c9ff6b5c8507 90 while(true) {
cmulady 12:9acca1dd0e8e 91
cmulady 12:9acca1dd0e8e 92 //Start flash LED
cmulady 1:9ba884d85ac6 93 led2 = 1;
cmulady 12:9acca1dd0e8e 94
cmulady 12:9acca1dd0e8e 95 //Write debug text to screen
cmulady 1:9ba884d85ac6 96 lcd.locate(0,1);
cmulady 1:9ba884d85ac6 97 lcd.printf("Debug:");
cmulady 1:9ba884d85ac6 98 lcd.locate(0,3);
cmulady 1:9ba884d85ac6 99 time_t seconds = time(NULL);
cmulady 12:9acca1dd0e8e 100 strftime(text_buffer, 32, "%I:%M:%S %p\n", localtime(&seconds));
cmulady 12:9acca1dd0e8e 101 lcd.printf("%s", text_buffer);
cmulady 3:8e492eacd346 102 lcd.locate(0,4);
cmulady 6:5563f0026858 103 lcd.printf("IR_OUT=0x%02X,0x%02X", irdatOUT[0],irdatOUT[1]);
cmulady 3:8e492eacd346 104 lcd.locate(0,5);
cmulady 6:5563f0026858 105 lcd.printf("IR_IN= 0x%02X,0x%02X", irdatIN[0],irdatIN[1]);
cmulady 6:5563f0026858 106 lcd.locate(0,6);
cmulady 6:5563f0026858 107 lcd.printf("Error= 0x%02X", error_code);
cmulady 3:8e492eacd346 108
cmulady 12:9acca1dd0e8e 109 //End - flash LED
cmulady 12:9acca1dd0e8e 110 led2 = 0;
cmulady 1:9ba884d85ac6 111 //End - Sleep thread
cmulady 1:9ba884d85ac6 112 Thread::signal_wait(0x1);
cmulady 7:c9ff6b5c8507 113 }
cmulady 1:9ba884d85ac6 114 }
cmulady 1:9ba884d85ac6 115
cmulady 3:8e492eacd346 116 void IRStuff(void const* arguments)
cmulady 3:8e492eacd346 117 {
cmulady 3:8e492eacd346 118 while(true) {
cmulady 7:c9ff6b5c8507 119
cmulady 12:9acca1dd0e8e 120 //If data available - Print data directly to USB port (for debug)
cmulady 10:4fcd5bdb9642 121 osEvent evt = rx_data_mailbox.get();
cmulady 10:4fcd5bdb9642 122 while(evt.status == osEventMail) {
cmulady 10:4fcd5bdb9642 123 char* mail = (char*)evt.value.p;
cmulady 10:4fcd5bdb9642 124 if((*mail)==0x02) pc.printf("\n");
cmulady 10:4fcd5bdb9642 125 pc.printf("0x%02X.",*mail);
cmulady 10:4fcd5bdb9642 126 rx_data_mailbox.free(mail);
cmulady 10:4fcd5bdb9642 127 evt = rx_data_mailbox.get();
cmulady 8:54dd4a3d0de9 128 }
cmulady 10:4fcd5bdb9642 129
cmulady 12:9acca1dd0e8e 130 //Do not return until we have more data
cmulady 12:9acca1dd0e8e 131 Thread::signal_wait(0x1);
cmulady 3:8e492eacd346 132 }
cmulady 4:8fdff78c13c8 133
cmulady 3:8e492eacd346 134 }
cmulady 3:8e492eacd346 135
cmulady 1:9ba884d85ac6 136 void BlinkAlive(void const* arguments)
cmulady 1:9ba884d85ac6 137 {
cmulady 1:9ba884d85ac6 138 while(true) {
cmulady 12:9acca1dd0e8e 139
cmulady 12:9acca1dd0e8e 140 //Change LED1 state (debug)
cmulady 1:9ba884d85ac6 141 led1 = !led1;
cmulady 6:5563f0026858 142
cmulady 12:9acca1dd0e8e 143 //Form a test packet and send it over IR transmitter
cmulady 6:5563f0026858 144 irdatOUT[0] = 0xA5;
cmulady 6:5563f0026858 145 irdatOUT[1] = ++irdata_out;
cmulady 6:5563f0026858 146 MakePacket(irdatOUT,2);
cmulady 6:5563f0026858 147
cmulady 12:9acca1dd0e8e 148 //Roughly use to set rate of data packets per second
cmulady 10:4fcd5bdb9642 149 Thread::wait(20);
cmulady 6:5563f0026858 150 }
cmulady 6:5563f0026858 151 }
cmulady 6:5563f0026858 152
cmulady 12:9acca1dd0e8e 153 //TURN THIS INTO CLASS FUNCTION
cmulady 6:5563f0026858 154 void MakePacket(char* data,int len)
cmulady 6:5563f0026858 155 {
cmulady 6:5563f0026858 156 //pc.printf("\nMaking Packet:\n\t");
cmulady 6:5563f0026858 157 char check =0x0;
cmulady 6:5563f0026858 158 device.putc(0x02);
cmulady 6:5563f0026858 159 //pc.printf("0x%02X.",0x02);
cmulady 6:5563f0026858 160 for(int i=0; i<len; i++) {
cmulady 9:3e4e9d6a8ad8 161 check^=data[i];
cmulady 6:5563f0026858 162 device.putc(data[i]);
cmulady 6:5563f0026858 163 //pc.printf("0x%02X.",data[i]);
cmulady 1:9ba884d85ac6 164 }
cmulady 6:5563f0026858 165 device.putc(check);
cmulady 6:5563f0026858 166 //pc.printf("0x%02X.",check);
cmulady 6:5563f0026858 167 //pc.printf("\nDone making packet.\n");
cmulady 6:5563f0026858 168 }
cmulady 6:5563f0026858 169
cmulady 12:9acca1dd0e8e 170 //TURN THIS INTO CLASS FUNCTION
cmulady 12:9acca1dd0e8e 171 char CheckPacket(char new_data, char* packet_buffer, char* data, int data_len)
cmulady 9:3e4e9d6a8ad8 172 //returns success(0) or failure(error code)
cmulady 9:3e4e9d6a8ad8 173 {
cmulady 9:3e4e9d6a8ad8 174 //Requires a packet buffer of length 'data_len'+2.
cmulady 9:3e4e9d6a8ad8 175 //Shifts data and checks each 'set' for a valid packet.
cmulady 9:3e4e9d6a8ad8 176 //Once a valid packet is receievd, the data buffer is updated with new values.
cmulady 9:3e4e9d6a8ad8 177
cmulady 9:3e4e9d6a8ad8 178 char check=0x0;
cmulady 9:3e4e9d6a8ad8 179 pc.printf("Shifting: ");
cmulady 9:3e4e9d6a8ad8 180 //Shift All data 1 cell over
cmulady 9:3e4e9d6a8ad8 181 for(int i=0; i<data_len+1; i++) {
cmulady 9:3e4e9d6a8ad8 182 packet_buffer[i] = packet_buffer[i+1];
cmulady 9:3e4e9d6a8ad8 183 }
cmulady 9:3e4e9d6a8ad8 184 packet_buffer[data_len+1] = new_data;
cmulady 9:3e4e9d6a8ad8 185 for(int i=0; i<data_len+2; i++) {
cmulady 9:3e4e9d6a8ad8 186 pc.printf("0x%02X.",packet_buffer[i]);
cmulady 9:3e4e9d6a8ad8 187 }
cmulady 9:3e4e9d6a8ad8 188
cmulady 9:3e4e9d6a8ad8 189 //check for valid packet
cmulady 9:3e4e9d6a8ad8 190 if(packet_buffer[0]!=0x02)
cmulady 9:3e4e9d6a8ad8 191 return 0x1; //bad start byte
cmulady 9:3e4e9d6a8ad8 192
cmulady 9:3e4e9d6a8ad8 193 for(int i=1; i<data_len+1; i++) {
cmulady 9:3e4e9d6a8ad8 194 check^=packet_buffer[i];
cmulady 9:3e4e9d6a8ad8 195 }
cmulady 9:3e4e9d6a8ad8 196 if(check==packet_buffer[data_len+1]) {
cmulady 9:3e4e9d6a8ad8 197 return 0;
cmulady 9:3e4e9d6a8ad8 198 }
cmulady 9:3e4e9d6a8ad8 199 return 0;
cmulady 9:3e4e9d6a8ad8 200 }
cmulady 9:3e4e9d6a8ad8 201
cmulady 12:9acca1dd0e8e 202 //Handle Reception of RX data (mail it to appropriate thread)
cmulady 7:c9ff6b5c8507 203 void ISR_UARTRX(void)
cmulady 7:c9ff6b5c8507 204 {
cmulady 12:9acca1dd0e8e 205 //get RX data (and prevent ISR from looping forever
cmulady 7:c9ff6b5c8507 206 uint32_t RBR = LPC_UART1->RBR;
cmulady 9:3e4e9d6a8ad8 207
cmulady 12:9acca1dd0e8e 208 //write letter and put in mailbox
cmulady 10:4fcd5bdb9642 209 char* mail = rx_data_mailbox.alloc();
cmulady 10:4fcd5bdb9642 210 mail[0] = (char)RBR;
cmulady 10:4fcd5bdb9642 211 rx_data_mailbox.put(mail);
cmulady 10:4fcd5bdb9642 212
cmulady 12:9acca1dd0e8e 213 //Let message handler run
cmulady 8:54dd4a3d0de9 214 (*threadptr_irstuff).signal_set(0x1);
cmulady 8:54dd4a3d0de9 215
cmulady 7:c9ff6b5c8507 216 }
cmulady 7:c9ff6b5c8507 217