APP4 - S5 H16

Dependencies:   mbed-rtos mbed

Committer:
SonSenpai
Date:
Wed Feb 24 06:32:59 2016 +0000
Revision:
5:6315ad5e8686
Parent:
4:d773812f9f7b
last I guess

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SonSenpai 0:6b5926b50a71 1 #include "mbed.h"
SonSenpai 0:6b5926b50a71 2 #include "rtos.h"
SonSenpai 0:6b5926b50a71 3 #include "trame.h"
SonSenpai 4:d773812f9f7b 4 #include "LPC17xx.h"
SonSenpai 0:6b5926b50a71 5
SonSenpai 0:6b5926b50a71 6 #define SIGNAL_READ 0x23
SonSenpai 0:6b5926b50a71 7
SonSenpai 0:6b5926b50a71 8 DigitalOut led1(LED1);
SonSenpai 0:6b5926b50a71 9 DigitalOut led2(LED2);
SonSenpai 0:6b5926b50a71 10 DigitalOut led3(LED3);
SonSenpai 0:6b5926b50a71 11 DigitalOut led4(LED4);
SonSenpai 0:6b5926b50a71 12
SonSenpai 0:6b5926b50a71 13 DigitalOut d_out(p9);
SonSenpai 4:d773812f9f7b 14 DigitalIn d_in(p30);
SonSenpai 3:cd69f04a084e 15 Thread* debugTH;
SonSenpai 0:6b5926b50a71 16
SonSenpai 0:6b5926b50a71 17 Serial pc(USBTX, USBRX);
SonSenpai 0:6b5926b50a71 18
SonSenpai 4:d773812f9f7b 19 const int PERIODE = 9600000;
SonSenpai 0:6b5926b50a71 20
SonSenpai 0:6b5926b50a71 21 //Variables for MEF
SonSenpai 0:6b5926b50a71 22 enum states
SonSenpai 0:6b5926b50a71 23 {
SonSenpai 0:6b5926b50a71 24 START = 0,
SonSenpai 0:6b5926b50a71 25 ENTETE = 1,
SonSenpai 0:6b5926b50a71 26 CHARGE_UTILE = 2,
SonSenpai 0:6b5926b50a71 27 CONTROLE = 3,
SonSenpai 0:6b5926b50a71 28 END = 4
SonSenpai 0:6b5926b50a71 29 };
SonSenpai 0:6b5926b50a71 30
SonSenpai 0:6b5926b50a71 31 int state;
SonSenpai 0:6b5926b50a71 32 int cntState = 0;
SonSenpai 0:6b5926b50a71 33 bool nextBit;
SonSenpai 0:6b5926b50a71 34 bitset<16> buffer;
SonSenpai 0:6b5926b50a71 35 bitset<640> chargeUtile;
SonSenpai 0:6b5926b50a71 36 int LENGTH_CHARGE_UTILE_BIT;
SonSenpai 0:6b5926b50a71 37 int LENGTH_CHARGE_UTILE_BYTE;
SonSenpai 0:6b5926b50a71 38 char c_chargeUtile[80];
SonSenpai 0:6b5926b50a71 39 unsigned short CRC_Calculated;
SonSenpai 0:6b5926b50a71 40 unsigned short CRC_Received;
SonSenpai 0:6b5926b50a71 41 bool messageReady;
SonSenpai 0:6b5926b50a71 42
SonSenpai 0:6b5926b50a71 43 //Variables for send
SonSenpai 4:d773812f9f7b 44 Thread* frame_sender_Th;
SonSenpai 0:6b5926b50a71 45 Mail<trame, 8> OutGoingMail;
SonSenpai 0:6b5926b50a71 46 bool increment_c = false;
SonSenpai 4:d773812f9f7b 47 bool sending = false;
SonSenpai 4:d773812f9f7b 48 bool tclock;
SonSenpai 0:6b5926b50a71 49 bitset<696> *outGoingTrame;
SonSenpai 0:6b5926b50a71 50 int outGoingLength = 0;
SonSenpai 0:6b5926b50a71 51 int count = 0;
SonSenpai 0:6b5926b50a71 52
SonSenpai 0:6b5926b50a71 53 //Variables for receive
SonSenpai 0:6b5926b50a71 54 struct inboundChargeMail
SonSenpai 0:6b5926b50a71 55 {
SonSenpai 0:6b5926b50a71 56 char* charge;
SonSenpai 0:6b5926b50a71 57 int length;
SonSenpai 0:6b5926b50a71 58 };
SonSenpai 0:6b5926b50a71 59 Mail<inboundChargeMail, 8> inboundChargeUtile;
SonSenpai 0:6b5926b50a71 60 int sync = 0;
SonSenpai 4:d773812f9f7b 61 bool gbitValueOk = 1;
SonSenpai 5:6315ad5e8686 62 bool in_val;
SonSenpai 0:6b5926b50a71 63 int rcv_count = 0;
SonSenpai 0:6b5926b50a71 64 unsigned long tick_count_read;
SonSenpai 0:6b5926b50a71 65 bool state_adjust = true;
SonSenpai 0:6b5926b50a71 66 unsigned long period = 0;
SonSenpai 0:6b5926b50a71 67 unsigned long tc_periods[8] = {0};
SonSenpai 0:6b5926b50a71 68 bool rcv_buff[696];
SonSenpai 0:6b5926b50a71 69
SonSenpai 0:6b5926b50a71 70 void inputReceiver( void const *args )
SonSenpai 0:6b5926b50a71 71 {
SonSenpai 0:6b5926b50a71 72 int c_count;
SonSenpai 0:6b5926b50a71 73 char temp_c;
SonSenpai 0:6b5926b50a71 74 string message = "";
SonSenpai 0:6b5926b50a71 75
SonSenpai 0:6b5926b50a71 76 while( true )
SonSenpai 0:6b5926b50a71 77 {
SonSenpai 0:6b5926b50a71 78 temp_c = pc.getc();
SonSenpai 0:6b5926b50a71 79
SonSenpai 0:6b5926b50a71 80 if( temp_c == 0xD )
SonSenpai 0:6b5926b50a71 81 {
SonSenpai 0:6b5926b50a71 82 if( !message.empty() )
SonSenpai 0:6b5926b50a71 83 {
SonSenpai 0:6b5926b50a71 84 pc.putc( 0xA );
SonSenpai 0:6b5926b50a71 85 pc.putc( 0xD );
SonSenpai 4:d773812f9f7b 86 std::printf("debug : message sent to mailbox : %s\r\n", message.c_str() );
SonSenpai 0:6b5926b50a71 87 OutGoingMail.put( new trame( message ) );
SonSenpai 0:6b5926b50a71 88 message = "";
SonSenpai 0:6b5926b50a71 89 c_count = 0;
SonSenpai 0:6b5926b50a71 90 }
SonSenpai 0:6b5926b50a71 91 }
SonSenpai 0:6b5926b50a71 92 else if( temp_c == 0x8 )
SonSenpai 0:6b5926b50a71 93 {
SonSenpai 0:6b5926b50a71 94 pc.putc( temp_c );
SonSenpai 0:6b5926b50a71 95 pc.putc( 0x20 );
SonSenpai 0:6b5926b50a71 96 pc.putc( temp_c );
SonSenpai 0:6b5926b50a71 97 message = message.substr(0, message.length() - 1);
SonSenpai 0:6b5926b50a71 98 c_count--;
SonSenpai 0:6b5926b50a71 99 }
SonSenpai 0:6b5926b50a71 100 else
SonSenpai 0:6b5926b50a71 101 {
SonSenpai 0:6b5926b50a71 102 if( c_count < 80 )
SonSenpai 0:6b5926b50a71 103 {
SonSenpai 0:6b5926b50a71 104 pc.putc( temp_c );
SonSenpai 0:6b5926b50a71 105 message += temp_c;
SonSenpai 0:6b5926b50a71 106 c_count++;
SonSenpai 0:6b5926b50a71 107 }
SonSenpai 0:6b5926b50a71 108 }
SonSenpai 0:6b5926b50a71 109 }
SonSenpai 0:6b5926b50a71 110 }
SonSenpai 0:6b5926b50a71 111
SonSenpai 0:6b5926b50a71 112 bool analyze_state(bool bit)
SonSenpai 0:6b5926b50a71 113 {
SonSenpai 0:6b5926b50a71 114 switch(state)
SonSenpai 0:6b5926b50a71 115 {
SonSenpai 0:6b5926b50a71 116 case START:
SonSenpai 0:6b5926b50a71 117
SonSenpai 4:d773812f9f7b 118 std::printf("START\t");
SonSenpai 0:6b5926b50a71 119
SonSenpai 0:6b5926b50a71 120 if(cntState == 0 && bit == 0)
SonSenpai 0:6b5926b50a71 121 {
SonSenpai 0:6b5926b50a71 122 nextBit = 1;
SonSenpai 0:6b5926b50a71 123 cntState++;
SonSenpai 0:6b5926b50a71 124 }
SonSenpai 0:6b5926b50a71 125 else if (cntState < 6 && bit == nextBit)
SonSenpai 0:6b5926b50a71 126 {
SonSenpai 0:6b5926b50a71 127 cntState++;
SonSenpai 0:6b5926b50a71 128 }
SonSenpai 0:6b5926b50a71 129 else if (cntState == 6 && bit == nextBit)
SonSenpai 0:6b5926b50a71 130 {
SonSenpai 0:6b5926b50a71 131 nextBit = 0;
SonSenpai 0:6b5926b50a71 132 cntState++;
SonSenpai 0:6b5926b50a71 133 }
SonSenpai 0:6b5926b50a71 134 else if (cntState == 7 && bit == nextBit)
SonSenpai 0:6b5926b50a71 135 {
SonSenpai 0:6b5926b50a71 136 state = ENTETE;
SonSenpai 0:6b5926b50a71 137 cntState = 0;
SonSenpai 0:6b5926b50a71 138 nextBit = 0;
SonSenpai 0:6b5926b50a71 139 }
SonSenpai 0:6b5926b50a71 140 else
SonSenpai 0:6b5926b50a71 141 {
SonSenpai 0:6b5926b50a71 142 state = START;
SonSenpai 0:6b5926b50a71 143 return 0;
SonSenpai 0:6b5926b50a71 144 }
SonSenpai 0:6b5926b50a71 145
SonSenpai 0:6b5926b50a71 146 break;
SonSenpai 0:6b5926b50a71 147
SonSenpai 0:6b5926b50a71 148 case ENTETE:
SonSenpai 0:6b5926b50a71 149
SonSenpai 0:6b5926b50a71 150 if(cntState < 7 && nextBit == 0)
SonSenpai 0:6b5926b50a71 151 {
SonSenpai 4:d773812f9f7b 152 std::printf("TEST1: %i \t", cntState);
SonSenpai 0:6b5926b50a71 153 cntState++;
SonSenpai 0:6b5926b50a71 154
SonSenpai 0:6b5926b50a71 155 }
SonSenpai 0:6b5926b50a71 156 else if (cntState == 7 && nextBit == 0)
SonSenpai 0:6b5926b50a71 157 {
SonSenpai 4:d773812f9f7b 158 std::printf("TEST2: %i \t", cntState);
SonSenpai 0:6b5926b50a71 159 nextBit = 1;
SonSenpai 0:6b5926b50a71 160 }
SonSenpai 0:6b5926b50a71 161 else if (nextBit == 1 && cntState > 0)
SonSenpai 0:6b5926b50a71 162 {
SonSenpai 4:d773812f9f7b 163 std::printf("TEST3: %i \t", cntState);
SonSenpai 0:6b5926b50a71 164 buffer.set(cntState, bit);
SonSenpai 0:6b5926b50a71 165 cntState--;
SonSenpai 0:6b5926b50a71 166 }
SonSenpai 0:6b5926b50a71 167 else if (nextBit == 1 && cntState == 0)
SonSenpai 0:6b5926b50a71 168 {
SonSenpai 0:6b5926b50a71 169 buffer.set(cntState, bit);
SonSenpai 0:6b5926b50a71 170 state = CHARGE_UTILE;
SonSenpai 0:6b5926b50a71 171 LENGTH_CHARGE_UTILE_BIT = (int)(buffer.to_ulong());
SonSenpai 0:6b5926b50a71 172
SonSenpai 0:6b5926b50a71 173 cntState = LENGTH_CHARGE_UTILE_BIT - 1;
SonSenpai 0:6b5926b50a71 174 }
SonSenpai 0:6b5926b50a71 175 else
SonSenpai 0:6b5926b50a71 176 {
SonSenpai 0:6b5926b50a71 177 state = START;
SonSenpai 0:6b5926b50a71 178 return 0;
SonSenpai 0:6b5926b50a71 179 }
SonSenpai 0:6b5926b50a71 180
SonSenpai 0:6b5926b50a71 181 break;
SonSenpai 0:6b5926b50a71 182
SonSenpai 0:6b5926b50a71 183 case CHARGE_UTILE:
SonSenpai 0:6b5926b50a71 184
SonSenpai 4:d773812f9f7b 185 std::printf("CHARGE UTILE\t");
SonSenpai 0:6b5926b50a71 186
SonSenpai 0:6b5926b50a71 187 if (cntState > 0)
SonSenpai 0:6b5926b50a71 188 {
SonSenpai 0:6b5926b50a71 189 chargeUtile.set(cntState, bit);
SonSenpai 0:6b5926b50a71 190 cntState--;
SonSenpai 0:6b5926b50a71 191 }
SonSenpai 0:6b5926b50a71 192 else if (cntState == 0)
SonSenpai 0:6b5926b50a71 193 {
SonSenpai 0:6b5926b50a71 194 chargeUtile.set(cntState, bit);
SonSenpai 0:6b5926b50a71 195 cntState = 0;
SonSenpai 0:6b5926b50a71 196 state = CONTROLE;
SonSenpai 0:6b5926b50a71 197 nextBit = 0;
SonSenpai 0:6b5926b50a71 198 }
SonSenpai 0:6b5926b50a71 199 else
SonSenpai 0:6b5926b50a71 200 {
SonSenpai 0:6b5926b50a71 201 state = START;
SonSenpai 0:6b5926b50a71 202 return 0;
SonSenpai 0:6b5926b50a71 203 }
SonSenpai 0:6b5926b50a71 204
SonSenpai 0:6b5926b50a71 205 break;
SonSenpai 0:6b5926b50a71 206
SonSenpai 0:6b5926b50a71 207 case CONTROLE:
SonSenpai 0:6b5926b50a71 208
SonSenpai 0:6b5926b50a71 209 if(nextBit == 0)
SonSenpai 0:6b5926b50a71 210 {
SonSenpai 0:6b5926b50a71 211 LENGTH_CHARGE_UTILE_BYTE = LENGTH_CHARGE_UTILE_BIT / 8;
SonSenpai 0:6b5926b50a71 212
SonSenpai 0:6b5926b50a71 213 for (int i = LENGTH_CHARGE_UTILE_BIT-1; i >= 0; i--)
SonSenpai 0:6b5926b50a71 214 {
SonSenpai 4:d773812f9f7b 215 std::printf("%i", (chargeUtile[i] & 0x1));
SonSenpai 0:6b5926b50a71 216 if (i % 8 == 0)
SonSenpai 0:6b5926b50a71 217 c_chargeUtile[ ( ( LENGTH_CHARGE_UTILE_BIT - 1 ) - i ) / 8] = (chargeUtile[i] << 7) | (chargeUtile[i + 1] << 6) | (chargeUtile[i + 2] << 5) | (chargeUtile[i + 3] << 4) | (chargeUtile[i + 4] << 3) | (chargeUtile[i + 5] << 2) | (chargeUtile[i + 6] << 1) | (chargeUtile[i + 7] << 0);
SonSenpai 0:6b5926b50a71 218 }
SonSenpai 0:6b5926b50a71 219
SonSenpai 0:6b5926b50a71 220 CRC_Calculated = CRC16::calculateCRC16(c_chargeUtile, LENGTH_CHARGE_UTILE_BYTE);
SonSenpai 0:6b5926b50a71 221
SonSenpai 4:d773812f9f7b 222 std::printf("CRC Calculated: %hu\t", CRC_Calculated);
SonSenpai 0:6b5926b50a71 223
SonSenpai 0:6b5926b50a71 224 nextBit = 1;
SonSenpai 0:6b5926b50a71 225 cntState = 14;
SonSenpai 0:6b5926b50a71 226 buffer.reset();
SonSenpai 0:6b5926b50a71 227 buffer.set(15, bit);
SonSenpai 0:6b5926b50a71 228 }
SonSenpai 0:6b5926b50a71 229 else if (nextBit == 1 && cntState > 0)
SonSenpai 0:6b5926b50a71 230 {
SonSenpai 0:6b5926b50a71 231 buffer.set(cntState, bit);
SonSenpai 0:6b5926b50a71 232 cntState--;
SonSenpai 0:6b5926b50a71 233 }
SonSenpai 0:6b5926b50a71 234 else if (nextBit == 1 && cntState == 0)
SonSenpai 0:6b5926b50a71 235 {
SonSenpai 0:6b5926b50a71 236 buffer.set(cntState, bit);
SonSenpai 0:6b5926b50a71 237 CRC_Received = (unsigned short)buffer.to_ulong();
SonSenpai 0:6b5926b50a71 238
SonSenpai 4:d773812f9f7b 239 std::printf("CRC Received: %hu\t", CRC_Received);
SonSenpai 0:6b5926b50a71 240
SonSenpai 2:f57df1b4a7a4 241 if (CRC_Received == CRC_Calculated)
SonSenpai 0:6b5926b50a71 242 {
SonSenpai 0:6b5926b50a71 243 state = END;
SonSenpai 0:6b5926b50a71 244 nextBit = 0;
SonSenpai 0:6b5926b50a71 245 cntState = 0;
SonSenpai 0:6b5926b50a71 246 }
SonSenpai 0:6b5926b50a71 247 else
SonSenpai 0:6b5926b50a71 248 {
SonSenpai 0:6b5926b50a71 249 state = START;
SonSenpai 0:6b5926b50a71 250 return 0;
SonSenpai 0:6b5926b50a71 251 }
SonSenpai 0:6b5926b50a71 252 }
SonSenpai 0:6b5926b50a71 253 else
SonSenpai 0:6b5926b50a71 254 {
SonSenpai 0:6b5926b50a71 255 state = START;
SonSenpai 0:6b5926b50a71 256 return 0;
SonSenpai 0:6b5926b50a71 257 }
SonSenpai 0:6b5926b50a71 258
SonSenpai 0:6b5926b50a71 259 break;
SonSenpai 0:6b5926b50a71 260
SonSenpai 0:6b5926b50a71 261 case END:
SonSenpai 0:6b5926b50a71 262
SonSenpai 0:6b5926b50a71 263 if (nextBit == 0 && nextBit == bit && cntState == 0)
SonSenpai 0:6b5926b50a71 264 {
SonSenpai 0:6b5926b50a71 265 nextBit = 1;
SonSenpai 0:6b5926b50a71 266 cntState++;
SonSenpai 0:6b5926b50a71 267 }
SonSenpai 0:6b5926b50a71 268 else if (nextBit == 1 && nextBit == bit && cntState < 6)
SonSenpai 0:6b5926b50a71 269 {
SonSenpai 0:6b5926b50a71 270 cntState++;
SonSenpai 0:6b5926b50a71 271 }
SonSenpai 0:6b5926b50a71 272 else if (nextBit == 1 && nextBit == bit && cntState == 6)
SonSenpai 0:6b5926b50a71 273 {
SonSenpai 0:6b5926b50a71 274 nextBit = 0;
SonSenpai 0:6b5926b50a71 275 cntState++;
SonSenpai 0:6b5926b50a71 276 }
SonSenpai 0:6b5926b50a71 277 else if (nextBit == 0 && nextBit == bit && cntState == 7)
SonSenpai 0:6b5926b50a71 278 {
SonSenpai 0:6b5926b50a71 279 messageReady = true;
SonSenpai 0:6b5926b50a71 280 state = START;
SonSenpai 0:6b5926b50a71 281 }
SonSenpai 0:6b5926b50a71 282 else
SonSenpai 0:6b5926b50a71 283 {
SonSenpai 0:6b5926b50a71 284 state = START;
SonSenpai 0:6b5926b50a71 285 messageReady = false;
SonSenpai 0:6b5926b50a71 286 return 0;
SonSenpai 0:6b5926b50a71 287 }
SonSenpai 0:6b5926b50a71 288
SonSenpai 0:6b5926b50a71 289 break;
SonSenpai 0:6b5926b50a71 290 }
SonSenpai 0:6b5926b50a71 291
SonSenpai 0:6b5926b50a71 292 return 1;
SonSenpai 0:6b5926b50a71 293 }
SonSenpai 0:6b5926b50a71 294
SonSenpai 4:d773812f9f7b 295 void read()
SonSenpai 0:6b5926b50a71 296 {
SonSenpai 5:6315ad5e8686 297 in_val = d_in.read();
SonSenpai 4:d773812f9f7b 298 if( sync < 8 )
SonSenpai 4:d773812f9f7b 299 {
SonSenpai 5:6315ad5e8686 300 if( in_val || sync > 0 )
SonSenpai 5:6315ad5e8686 301 {
SonSenpai 4:d773812f9f7b 302 tc_periods[sync] = tick_count_read;
SonSenpai 4:d773812f9f7b 303 sync++;
SonSenpai 4:d773812f9f7b 304
SonSenpai 4:d773812f9f7b 305 if (sync == 8)
SonSenpai 4:d773812f9f7b 306 {
SonSenpai 5:6315ad5e8686 307 for (int i = 1; i < sync; i++)
SonSenpai 4:d773812f9f7b 308 {
SonSenpai 4:d773812f9f7b 309 period += tc_periods[i];
SonSenpai 4:d773812f9f7b 310 }
SonSenpai 5:6315ad5e8686 311 period = (period/7)/2;
SonSenpai 4:d773812f9f7b 312 }
SonSenpai 5:6315ad5e8686 313 debugTH->signal_set(0x1);
SonSenpai 4:d773812f9f7b 314 }
SonSenpai 4:d773812f9f7b 315 }
SonSenpai 4:d773812f9f7b 316 else
SonSenpai 0:6b5926b50a71 317 {
SonSenpai 5:6315ad5e8686 318 debugTH->signal_set(0x1);
SonSenpai 5:6315ad5e8686 319 if( tick_count_read > period * 1.5 )
SonSenpai 4:d773812f9f7b 320 {
SonSenpai 4:d773812f9f7b 321 rcv_buff[ rcv_count ] = !in_val;
SonSenpai 4:d773812f9f7b 322 gbitValueOk = analyze_state( !in_val );
SonSenpai 4:d773812f9f7b 323 rcv_count++;
SonSenpai 4:d773812f9f7b 324 }
SonSenpai 4:d773812f9f7b 325 else
SonSenpai 4:d773812f9f7b 326 {
SonSenpai 4:d773812f9f7b 327 if( state_adjust )
SonSenpai 4:d773812f9f7b 328 {
SonSenpai 4:d773812f9f7b 329 state_adjust = !state_adjust;
SonSenpai 4:d773812f9f7b 330 }
SonSenpai 4:d773812f9f7b 331 else
SonSenpai 4:d773812f9f7b 332 {
SonSenpai 4:d773812f9f7b 333 state_adjust = !state_adjust;
SonSenpai 4:d773812f9f7b 334 rcv_buff[ rcv_count ] = !in_val;
SonSenpai 4:d773812f9f7b 335 gbitValueOk = analyze_state( !in_val );
SonSenpai 4:d773812f9f7b 336 rcv_count++;
SonSenpai 4:d773812f9f7b 337 }
SonSenpai 4:d773812f9f7b 338 }
SonSenpai 4:d773812f9f7b 339
SonSenpai 0:6b5926b50a71 340 }
SonSenpai 4:d773812f9f7b 341 if( messageReady )
SonSenpai 4:d773812f9f7b 342 {
SonSenpai 4:d773812f9f7b 343 inboundChargeMail *mail_t = new inboundChargeMail;
SonSenpai 4:d773812f9f7b 344 char ctemp[ 80 ];
SonSenpai 4:d773812f9f7b 345 strcpy( ctemp, c_chargeUtile );
SonSenpai 4:d773812f9f7b 346 mail_t->charge = ctemp;
SonSenpai 4:d773812f9f7b 347 mail_t->length = LENGTH_CHARGE_UTILE_BYTE;
SonSenpai 4:d773812f9f7b 348 inboundChargeUtile.put( mail_t );
SonSenpai 4:d773812f9f7b 349
SonSenpai 4:d773812f9f7b 350 rcv_count = 0;
SonSenpai 4:d773812f9f7b 351 state_adjust = true;
SonSenpai 4:d773812f9f7b 352 sync = 0;
SonSenpai 4:d773812f9f7b 353 messageReady = false;
SonSenpai 4:d773812f9f7b 354 cntState = 0;
SonSenpai 4:d773812f9f7b 355 }
SonSenpai 4:d773812f9f7b 356 if( !gbitValueOk )
SonSenpai 4:d773812f9f7b 357 {
SonSenpai 4:d773812f9f7b 358 rcv_count = 0;
SonSenpai 4:d773812f9f7b 359 state_adjust = true;
SonSenpai 4:d773812f9f7b 360 sync = 0;
SonSenpai 4:d773812f9f7b 361 cntState = 0;
SonSenpai 4:d773812f9f7b 362 }
SonSenpai 4:d773812f9f7b 363 LPC_TIM2->TC = 0;
SonSenpai 4:d773812f9f7b 364 LPC_TIM2->IR |= 0xFFFFFFFF;
SonSenpai 4:d773812f9f7b 365 }
SonSenpai 4:d773812f9f7b 366
SonSenpai 4:d773812f9f7b 367 extern "C" void TIMER2_IRQHandler()
SonSenpai 4:d773812f9f7b 368 {
SonSenpai 4:d773812f9f7b 369 tick_count_read = LPC_TIM2->CR0;
SonSenpai 5:6315ad5e8686 370 //read();
SonSenpai 5:6315ad5e8686 371 LPC_TIM2->TC = 0;
SonSenpai 5:6315ad5e8686 372 LPC_TIM2->IR |= 0xFFFFFFFF;
SonSenpai 4:d773812f9f7b 373 }
SonSenpai 4:d773812f9f7b 374
SonSenpai 4:d773812f9f7b 375 extern "C" void TIMER1_IRQHandler( void )
SonSenpai 4:d773812f9f7b 376 {
SonSenpai 4:d773812f9f7b 377 if ((LPC_TIM1->IR & 0x01) == 0x01)
SonSenpai 4:d773812f9f7b 378 {
SonSenpai 4:d773812f9f7b 379 if( sending )
SonSenpai 4:d773812f9f7b 380 {
SonSenpai 4:d773812f9f7b 381 tclock = !tclock;
SonSenpai 4:d773812f9f7b 382 if( count < outGoingLength )
SonSenpai 4:d773812f9f7b 383 {
SonSenpai 4:d773812f9f7b 384 d_out = ( ( *outGoingTrame )[ count ] == tclock );
SonSenpai 4:d773812f9f7b 385 if(tclock)
SonSenpai 4:d773812f9f7b 386 {
SonSenpai 4:d773812f9f7b 387 count++;
SonSenpai 4:d773812f9f7b 388 }
SonSenpai 4:d773812f9f7b 389 LPC_TIM1->IR |= 1;
SonSenpai 4:d773812f9f7b 390 }
SonSenpai 4:d773812f9f7b 391
SonSenpai 4:d773812f9f7b 392 if( count == outGoingLength ){
SonSenpai 4:d773812f9f7b 393 frame_sender_Th->signal_set(0x3);
SonSenpai 4:d773812f9f7b 394 count = 0;
SonSenpai 4:d773812f9f7b 395 sending = false;
SonSenpai 4:d773812f9f7b 396 }
SonSenpai 4:d773812f9f7b 397 debugTH->signal_set(0x1);
SonSenpai 4:d773812f9f7b 398 }
SonSenpai 4:d773812f9f7b 399 LPC_TIM1->IR |= 1 << 0;
SonSenpai 4:d773812f9f7b 400 }
SonSenpai 4:d773812f9f7b 401 }
SonSenpai 4:d773812f9f7b 402
SonSenpai 4:d773812f9f7b 403 void debug( void const *args )
SonSenpai 4:d773812f9f7b 404 {
SonSenpai 4:d773812f9f7b 405 while( true )
SonSenpai 4:d773812f9f7b 406 {
SonSenpai 4:d773812f9f7b 407 Thread::signal_wait(0x1);
SonSenpai 4:d773812f9f7b 408 int tempi1;
SonSenpai 4:d773812f9f7b 409 if(tclock)
SonSenpai 4:d773812f9f7b 410 {
SonSenpai 4:d773812f9f7b 411 tempi1 = d_out;
SonSenpai 4:d773812f9f7b 412 std::printf( "%d", tempi1 & 0x1 );
SonSenpai 5:6315ad5e8686 413 std::printf( "%d", in_val & 0x1 );
SonSenpai 5:6315ad5e8686 414 std::printf( " %d", count );
SonSenpai 5:6315ad5e8686 415 std::printf( " %d", period );
SonSenpai 5:6315ad5e8686 416 std::printf( " %d\r\n", tick_count_read );
SonSenpai 4:d773812f9f7b 417 }
SonSenpai 0:6b5926b50a71 418 }
SonSenpai 0:6b5926b50a71 419 }
SonSenpai 0:6b5926b50a71 420
SonSenpai 0:6b5926b50a71 421 void send( trame *trm )
SonSenpai 0:6b5926b50a71 422 {
SonSenpai 0:6b5926b50a71 423 outGoingTrame = trm->getBitset();
SonSenpai 0:6b5926b50a71 424 outGoingLength = trm->length;
SonSenpai 4:d773812f9f7b 425 std::printf("debug : Sending \r\n");
SonSenpai 0:6b5926b50a71 426 }
SonSenpai 0:6b5926b50a71 427
SonSenpai 0:6b5926b50a71 428 void frame_sender( void const *args )
SonSenpai 0:6b5926b50a71 429 {
SonSenpai 0:6b5926b50a71 430 while( true )
SonSenpai 0:6b5926b50a71 431 {
SonSenpai 0:6b5926b50a71 432 osEvent evt = OutGoingMail.get();
SonSenpai 0:6b5926b50a71 433
SonSenpai 0:6b5926b50a71 434 if( evt.status == osEventMail )
SonSenpai 0:6b5926b50a71 435 {
SonSenpai 0:6b5926b50a71 436 trame *trm = ( trame* )evt.value.p;
SonSenpai 0:6b5926b50a71 437
SonSenpai 4:d773812f9f7b 438 std::printf( "frame sender thread\r\n" );
SonSenpai 0:6b5926b50a71 439 send( trm );
SonSenpai 4:d773812f9f7b 440 sending = true;
SonSenpai 4:d773812f9f7b 441 Thread::signal_wait(0x3);
SonSenpai 4:d773812f9f7b 442 sending = false;
SonSenpai 4:d773812f9f7b 443 count = 0;
SonSenpai 0:6b5926b50a71 444 OutGoingMail.free( trm );
SonSenpai 5:6315ad5e8686 445 std::printf( "frame sender thread Over \r\n" );
SonSenpai 0:6b5926b50a71 446 }
SonSenpai 0:6b5926b50a71 447 }
SonSenpai 0:6b5926b50a71 448 }
SonSenpai 0:6b5926b50a71 449
SonSenpai 0:6b5926b50a71 450 void frame_printer( void const *args )
SonSenpai 0:6b5926b50a71 451 {
SonSenpai 0:6b5926b50a71 452 while( true )
SonSenpai 0:6b5926b50a71 453 {
SonSenpai 0:6b5926b50a71 454 osEvent evt = inboundChargeUtile.get();
SonSenpai 0:6b5926b50a71 455
SonSenpai 0:6b5926b50a71 456 if( evt.status == osEventMail )
SonSenpai 0:6b5926b50a71 457 {
SonSenpai 0:6b5926b50a71 458 inboundChargeMail* mailed_charge = ( inboundChargeMail* )evt.value.p;
SonSenpai 4:d773812f9f7b 459 std::printf( "Received frame :\r\n%s", mailed_charge->charge );
SonSenpai 0:6b5926b50a71 460 inboundChargeUtile.free( mailed_charge );
SonSenpai 0:6b5926b50a71 461 }
SonSenpai 0:6b5926b50a71 462 }
SonSenpai 0:6b5926b50a71 463 }
SonSenpai 0:6b5926b50a71 464
SonSenpai 0:6b5926b50a71 465 void init_timer1()
SonSenpai 0:6b5926b50a71 466 {
SonSenpai 0:6b5926b50a71 467 LPC_SC->PCLKSEL0 |= ( 1 << 4 ); //Select Timer 1 = CCLK
SonSenpai 4:d773812f9f7b 468 LPC_SC->PCONP |= ( 1 << 2 ); //Power-Up Timer 1
SonSenpai 4:d773812f9f7b 469 LPC_TIM1->MR0 = PERIODE; //Set ticks till interrupt
SonSenpai 4:d773812f9f7b 470 LPC_TIM1->MCR = 3; //Interrupt on MR0 and Reset TC on MR0
SonSenpai 4:d773812f9f7b 471 LPC_TIM1->EMR = (3 << 4);
SonSenpai 4:d773812f9f7b 472 NVIC_EnableIRQ(TIMER1_IRQn); //Bind timer 1 to custom funk
SonSenpai 4:d773812f9f7b 473 LPC_TIM1->TCR = 1; //Enable Timer 1
SonSenpai 0:6b5926b50a71 474 }
SonSenpai 0:6b5926b50a71 475
SonSenpai 0:6b5926b50a71 476 void init_timer2()
SonSenpai 0:6b5926b50a71 477 {
SonSenpai 4:d773812f9f7b 478 LPC_PINCON->PINSEL0 |= ( 3 << 8 ); //Select Capture register 2.0
SonSenpai 0:6b5926b50a71 479 LPC_SC->PCLKSEL1 |= ( 1 << 12 ); //Select Timer 2 = CCLK
SonSenpai 4:d773812f9f7b 480 LPC_SC->PCONP |= ( 1 << 22 ); //Power-Up Timer 2
SonSenpai 0:6b5926b50a71 481 LPC_TIM2->TC = 0;
SonSenpai 4:d773812f9f7b 482 LPC_TIM2->PC = 0;
SonSenpai 4:d773812f9f7b 483 LPC_TIM2->PR = 0;
SonSenpai 0:6b5926b50a71 484 LPC_TIM2->TCR |= ( 1 << 1 );
SonSenpai 4:d773812f9f7b 485 LPC_TIM2->TCR &= ~( 1 << 1 );
SonSenpai 4:d773812f9f7b 486 LPC_TIM2->IR = 0xFFFFFFFF;
SonSenpai 4:d773812f9f7b 487 LPC_TIM2->CCR |= 0x00000007;
SonSenpai 4:d773812f9f7b 488 NVIC_EnableIRQ(TIMER2_IRQn);
SonSenpai 4:d773812f9f7b 489 LPC_TIM2->TCR = 1;
SonSenpai 0:6b5926b50a71 490 }
SonSenpai 0:6b5926b50a71 491
SonSenpai 0:6b5926b50a71 492
SonSenpai 4:d773812f9f7b 493 int main()
SonSenpai 4:d773812f9f7b 494 {
SonSenpai 4:d773812f9f7b 495 d_out = 0;
SonSenpai 4:d773812f9f7b 496 std::printf("Init Timers...");
SonSenpai 4:d773812f9f7b 497 tclock = 1;
SonSenpai 0:6b5926b50a71 498 state = START;
SonSenpai 0:6b5926b50a71 499 messageReady = false;
SonSenpai 1:5504d5ac7d21 500
SonSenpai 1:5504d5ac7d21 501 init_timer1();
SonSenpai 1:5504d5ac7d21 502 init_timer2();
SonSenpai 1:5504d5ac7d21 503
SonSenpai 4:d773812f9f7b 504 std::printf("done\r\n");
SonSenpai 4:d773812f9f7b 505
SonSenpai 4:d773812f9f7b 506 std::printf("Init Threads...");
SonSenpai 3:cd69f04a084e 507 debugTH = new Thread(debug);
SonSenpai 1:5504d5ac7d21 508 Thread fp( frame_printer );
SonSenpai 1:5504d5ac7d21 509 Thread ir( inputReceiver );
SonSenpai 4:d773812f9f7b 510 frame_sender_Th = new Thread( frame_sender );
SonSenpai 4:d773812f9f7b 511 std::printf("done\r\n");
SonSenpai 1:5504d5ac7d21 512
SonSenpai 2:f57df1b4a7a4 513 while( true )
SonSenpai 2:f57df1b4a7a4 514 {
SonSenpai 2:f57df1b4a7a4 515 wait(50000);
SonSenpai 2:f57df1b4a7a4 516 }
SonSenpai 0:6b5926b50a71 517 }