APP4 - S5 H16

Dependencies:   mbed-rtos mbed

Committer:
SonSenpai
Date:
Tue Feb 23 14:47:09 2016 +0000
Revision:
3:cd69f04a084e
Parent:
2:f57df1b4a7a4
Child:
4:d773812f9f7b
turd

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