S5info_H14
/
APP3
Problematique
main.cpp@2:db7c8378b324, 2014-02-11 (annotated)
- Committer:
- RufflesAllD
- Date:
- Tue Feb 11 15:15:23 2014 +0000
- Revision:
- 2:db7c8378b324
- Parent:
- 1:261bb31628e8
- Child:
- 3:65845faafbb1
almost done, remain signal acquirement
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
joGenie | 0:dc7095ab4963 | 1 | #include "mbed.h" |
RufflesAllD | 1:261bb31628e8 | 2 | #include "rtos.h" |
RufflesAllD | 2:db7c8378b324 | 3 | #include "trame.hpp" |
joGenie | 0:dc7095ab4963 | 4 | |
joGenie | 0:dc7095ab4963 | 5 | Serial pc(USBTX, USBRX); |
joGenie | 0:dc7095ab4963 | 6 | |
RufflesAllD | 2:db7c8378b324 | 7 | int tickPerPeriod = 9600; |
RufflesAllD | 2:db7c8378b324 | 8 | |
RufflesAllD | 2:db7c8378b324 | 9 | Queue<string, 16> textToSend; |
RufflesAllD | 2:db7c8378b324 | 10 | Mail<trame, 16> trameToSend; |
RufflesAllD | 2:db7c8378b324 | 11 | |
RufflesAllD | 2:db7c8378b324 | 12 | Mail<trame, 16> trameToDecode; |
RufflesAllD | 2:db7c8378b324 | 13 | Queue<string, 16> textToPrint; |
RufflesAllD | 2:db7c8378b324 | 14 | |
RufflesAllD | 2:db7c8378b324 | 15 | void getText(void const *args) |
RufflesAllD | 2:db7c8378b324 | 16 | { |
RufflesAllD | 2:db7c8378b324 | 17 | int compteur = 0; |
RufflesAllD | 2:db7c8378b324 | 18 | char c; |
RufflesAllD | 2:db7c8378b324 | 19 | string message = ""; |
RufflesAllD | 2:db7c8378b324 | 20 | |
RufflesAllD | 2:db7c8378b324 | 21 | while (true) |
RufflesAllD | 2:db7c8378b324 | 22 | { |
RufflesAllD | 2:db7c8378b324 | 23 | c = pc.getc(); |
RufflesAllD | 2:db7c8378b324 | 24 | |
RufflesAllD | 2:db7c8378b324 | 25 | if (c == 0xD) |
RufflesAllD | 2:db7c8378b324 | 26 | { |
RufflesAllD | 2:db7c8378b324 | 27 | if (!message.empty()) |
RufflesAllD | 2:db7c8378b324 | 28 | { |
RufflesAllD | 2:db7c8378b324 | 29 | pc.putc(0xA); |
RufflesAllD | 2:db7c8378b324 | 30 | pc.putc(0xD); |
RufflesAllD | 2:db7c8378b324 | 31 | textToSend.put(new string(message)); |
RufflesAllD | 2:db7c8378b324 | 32 | message = ""; |
RufflesAllD | 2:db7c8378b324 | 33 | compteur = 0; |
RufflesAllD | 2:db7c8378b324 | 34 | } |
RufflesAllD | 2:db7c8378b324 | 35 | } |
RufflesAllD | 2:db7c8378b324 | 36 | else if (c == 0x8) |
RufflesAllD | 2:db7c8378b324 | 37 | { |
RufflesAllD | 2:db7c8378b324 | 38 | pc.putc(c); |
RufflesAllD | 2:db7c8378b324 | 39 | pc.putc(0x20); |
RufflesAllD | 2:db7c8378b324 | 40 | pc.putc(c); |
RufflesAllD | 2:db7c8378b324 | 41 | message = message.substr(0, message.length() - 1); |
RufflesAllD | 2:db7c8378b324 | 42 | compteur--; |
RufflesAllD | 2:db7c8378b324 | 43 | } |
RufflesAllD | 2:db7c8378b324 | 44 | else |
RufflesAllD | 2:db7c8378b324 | 45 | { |
RufflesAllD | 2:db7c8378b324 | 46 | if (compteur < 80) |
RufflesAllD | 2:db7c8378b324 | 47 | { |
RufflesAllD | 2:db7c8378b324 | 48 | pc.putc(c); |
RufflesAllD | 2:db7c8378b324 | 49 | message += c; |
RufflesAllD | 2:db7c8378b324 | 50 | compteur++; |
RufflesAllD | 2:db7c8378b324 | 51 | } |
RufflesAllD | 2:db7c8378b324 | 52 | } |
RufflesAllD | 2:db7c8378b324 | 53 | } |
RufflesAllD | 2:db7c8378b324 | 54 | } |
RufflesAllD | 2:db7c8378b324 | 55 | |
RufflesAllD | 2:db7c8378b324 | 56 | void leTrameur(void const *args) |
RufflesAllD | 2:db7c8378b324 | 57 | { |
RufflesAllD | 2:db7c8378b324 | 58 | while (true) |
RufflesAllD | 2:db7c8378b324 | 59 | { |
RufflesAllD | 2:db7c8378b324 | 60 | osEvent evt = textToSend.get(); |
RufflesAllD | 2:db7c8378b324 | 61 | |
RufflesAllD | 2:db7c8378b324 | 62 | if (evt.status == osEventMessage) { |
RufflesAllD | 2:db7c8378b324 | 63 | string *msg = (string*)evt.value.p; |
RufflesAllD | 2:db7c8378b324 | 64 | |
RufflesAllD | 2:db7c8378b324 | 65 | //pc.printf("message envoye :\n\r%s\n\r", msg->c_str()); |
RufflesAllD | 2:db7c8378b324 | 66 | trameToSend.put(new trame(*msg)); |
RufflesAllD | 2:db7c8378b324 | 67 | |
RufflesAllD | 2:db7c8378b324 | 68 | delete msg; |
RufflesAllD | 2:db7c8378b324 | 69 | } |
RufflesAllD | 2:db7c8378b324 | 70 | } |
RufflesAllD | 2:db7c8378b324 | 71 | } |
joGenie | 0:dc7095ab4963 | 72 | |
RufflesAllD | 2:db7c8378b324 | 73 | void setPwmMatch(bitset<8> bitst) |
RufflesAllD | 2:db7c8378b324 | 74 | { |
RufflesAllD | 2:db7c8378b324 | 75 | for (int a = 0; a < 8; a++) |
RufflesAllD | 2:db7c8378b324 | 76 | { |
RufflesAllD | 2:db7c8378b324 | 77 | if (bitst.test(a)) |
RufflesAllD | 2:db7c8378b324 | 78 | { |
RufflesAllD | 2:db7c8378b324 | 79 | LPC_PWM1->MR1 = tickPerPeriod/2; |
RufflesAllD | 2:db7c8378b324 | 80 | LPC_PWM1->MR2 = 1; |
RufflesAllD | 2:db7c8378b324 | 81 | } |
RufflesAllD | 2:db7c8378b324 | 82 | else |
RufflesAllD | 2:db7c8378b324 | 83 | { |
RufflesAllD | 2:db7c8378b324 | 84 | LPC_PWM1->MR1 = 1; |
RufflesAllD | 2:db7c8378b324 | 85 | LPC_PWM1->MR2 = tickPerPeriod/2; |
RufflesAllD | 2:db7c8378b324 | 86 | } |
RufflesAllD | 2:db7c8378b324 | 87 | |
RufflesAllD | 2:db7c8378b324 | 88 | while(LPC_PWM1->IR != 0x01); |
RufflesAllD | 2:db7c8378b324 | 89 | LPC_PWM1->IR = 0xFF; |
RufflesAllD | 2:db7c8378b324 | 90 | } |
RufflesAllD | 2:db7c8378b324 | 91 | } |
RufflesAllD | 2:db7c8378b324 | 92 | |
RufflesAllD | 2:db7c8378b324 | 93 | void sendTrame(trame *trm) |
RufflesAllD | 2:db7c8378b324 | 94 | { |
RufflesAllD | 2:db7c8378b324 | 95 | LPC_PWM1->TCR |= (1 << 0); // Enable counter |
RufflesAllD | 2:db7c8378b324 | 96 | |
RufflesAllD | 2:db7c8378b324 | 97 | setPwmMatch(trm->preambule); |
RufflesAllD | 2:db7c8378b324 | 98 | setPwmMatch(trm->start_end); |
RufflesAllD | 2:db7c8378b324 | 99 | setPwmMatch(trm->type_flag); |
RufflesAllD | 2:db7c8378b324 | 100 | setPwmMatch(trm->charge_utile); |
RufflesAllD | 2:db7c8378b324 | 101 | |
RufflesAllD | 2:db7c8378b324 | 102 | for (int a = 0; a < trm->length; a++) |
RufflesAllD | 2:db7c8378b324 | 103 | { |
RufflesAllD | 2:db7c8378b324 | 104 | if (trm->message.test(a)) |
RufflesAllD | 2:db7c8378b324 | 105 | { |
RufflesAllD | 2:db7c8378b324 | 106 | LPC_PWM1->MR1 = tickPerPeriod/2; |
RufflesAllD | 2:db7c8378b324 | 107 | LPC_PWM1->MR2 = 1; |
RufflesAllD | 2:db7c8378b324 | 108 | } |
RufflesAllD | 2:db7c8378b324 | 109 | else |
RufflesAllD | 2:db7c8378b324 | 110 | { |
RufflesAllD | 2:db7c8378b324 | 111 | LPC_PWM1->MR1 = 1; |
RufflesAllD | 2:db7c8378b324 | 112 | LPC_PWM1->MR2 = tickPerPeriod/2; |
RufflesAllD | 2:db7c8378b324 | 113 | } |
RufflesAllD | 2:db7c8378b324 | 114 | |
RufflesAllD | 2:db7c8378b324 | 115 | while(LPC_PWM1->IR != 0x01); |
RufflesAllD | 2:db7c8378b324 | 116 | LPC_PWM1->IR = 0xFF; |
RufflesAllD | 2:db7c8378b324 | 117 | } |
RufflesAllD | 2:db7c8378b324 | 118 | |
RufflesAllD | 2:db7c8378b324 | 119 | for (int a = 0; a < 16; a++) |
RufflesAllD | 2:db7c8378b324 | 120 | { |
RufflesAllD | 2:db7c8378b324 | 121 | if (trm->crc16.test(a)) |
RufflesAllD | 2:db7c8378b324 | 122 | { |
RufflesAllD | 2:db7c8378b324 | 123 | LPC_PWM1->MR1 = tickPerPeriod/2; |
RufflesAllD | 2:db7c8378b324 | 124 | LPC_PWM1->MR2 = 1; |
RufflesAllD | 2:db7c8378b324 | 125 | } |
RufflesAllD | 2:db7c8378b324 | 126 | else |
RufflesAllD | 2:db7c8378b324 | 127 | { |
RufflesAllD | 2:db7c8378b324 | 128 | LPC_PWM1->MR1 = 1; |
RufflesAllD | 2:db7c8378b324 | 129 | LPC_PWM1->MR2 = tickPerPeriod/2; |
RufflesAllD | 2:db7c8378b324 | 130 | } |
RufflesAllD | 2:db7c8378b324 | 131 | |
RufflesAllD | 2:db7c8378b324 | 132 | while(LPC_PWM1->IR != 0x01); |
RufflesAllD | 2:db7c8378b324 | 133 | LPC_PWM1->IR = 0xFF; |
RufflesAllD | 2:db7c8378b324 | 134 | } |
RufflesAllD | 2:db7c8378b324 | 135 | |
RufflesAllD | 2:db7c8378b324 | 136 | setPwmMatch(trm->start_end); |
RufflesAllD | 2:db7c8378b324 | 137 | |
RufflesAllD | 2:db7c8378b324 | 138 | LPC_PWM1->TCR = 0x0; // Disable counter |
RufflesAllD | 2:db7c8378b324 | 139 | } |
RufflesAllD | 2:db7c8378b324 | 140 | |
RufflesAllD | 2:db7c8378b324 | 141 | void sender(void const *args) |
RufflesAllD | 2:db7c8378b324 | 142 | { |
RufflesAllD | 2:db7c8378b324 | 143 | while (true) |
RufflesAllD | 2:db7c8378b324 | 144 | { |
RufflesAllD | 2:db7c8378b324 | 145 | osEvent evt = trameToSend.get(); |
RufflesAllD | 2:db7c8378b324 | 146 | |
RufflesAllD | 2:db7c8378b324 | 147 | if (evt.status == osEventMail) { |
RufflesAllD | 2:db7c8378b324 | 148 | trame *trm = (trame*)evt.value.p; |
RufflesAllD | 2:db7c8378b324 | 149 | |
RufflesAllD | 2:db7c8378b324 | 150 | pc.printf("trame shooter :\n\r%s", trm->trameToString().c_str()); |
RufflesAllD | 2:db7c8378b324 | 151 | sendTrame(trm); |
RufflesAllD | 2:db7c8378b324 | 152 | |
RufflesAllD | 2:db7c8378b324 | 153 | trameToSend.free(trm); |
RufflesAllD | 2:db7c8378b324 | 154 | } |
RufflesAllD | 2:db7c8378b324 | 155 | } |
RufflesAllD | 2:db7c8378b324 | 156 | } |
joGenie | 0:dc7095ab4963 | 157 | |
joGenie | 0:dc7095ab4963 | 158 | void readTrame() |
joGenie | 0:dc7095ab4963 | 159 | { |
RufflesAllD | 2:db7c8378b324 | 160 | //LPC_TIM2->IR = 0xFF; |
RufflesAllD | 2:db7c8378b324 | 161 | } |
joGenie | 0:dc7095ab4963 | 162 | |
RufflesAllD | 2:db7c8378b324 | 163 | void bla() |
RufflesAllD | 2:db7c8378b324 | 164 | { |
RufflesAllD | 2:db7c8378b324 | 165 | string temp = "01010101011111100000000000000011011000110110011000100000011001101101101001111110"; |
RufflesAllD | 2:db7c8378b324 | 166 | bitset<696> bit(temp); |
RufflesAllD | 2:db7c8378b324 | 167 | |
RufflesAllD | 2:db7c8378b324 | 168 | trame *trm = new trame(bit); |
RufflesAllD | 2:db7c8378b324 | 169 | if (trm->checkCRC16()) |
RufflesAllD | 2:db7c8378b324 | 170 | { |
RufflesAllD | 2:db7c8378b324 | 171 | //pc.printf("trame recu :\n\r%s\n\r", trm->trameToString().c_str()); |
RufflesAllD | 2:db7c8378b324 | 172 | trameToDecode.put(trm); |
RufflesAllD | 2:db7c8378b324 | 173 | } |
RufflesAllD | 2:db7c8378b324 | 174 | else |
RufflesAllD | 2:db7c8378b324 | 175 | { |
RufflesAllD | 2:db7c8378b324 | 176 | pc.printf("Mauvais CRC16"); |
RufflesAllD | 2:db7c8378b324 | 177 | } |
RufflesAllD | 2:db7c8378b324 | 178 | } |
RufflesAllD | 2:db7c8378b324 | 179 | |
RufflesAllD | 2:db7c8378b324 | 180 | void receiver(void const *args) |
RufflesAllD | 2:db7c8378b324 | 181 | { |
RufflesAllD | 2:db7c8378b324 | 182 | bla(); |
joGenie | 0:dc7095ab4963 | 183 | } |
joGenie | 0:dc7095ab4963 | 184 | |
RufflesAllD | 2:db7c8378b324 | 185 | void decoder(void const *args) |
joGenie | 0:dc7095ab4963 | 186 | { |
RufflesAllD | 2:db7c8378b324 | 187 | while(true) |
joGenie | 0:dc7095ab4963 | 188 | { |
RufflesAllD | 2:db7c8378b324 | 189 | osEvent evt = trameToDecode.get(); |
RufflesAllD | 2:db7c8378b324 | 190 | |
RufflesAllD | 2:db7c8378b324 | 191 | if (evt.status == osEventMail) { |
RufflesAllD | 2:db7c8378b324 | 192 | trame *trm = (trame*)evt.value.p; |
RufflesAllD | 2:db7c8378b324 | 193 | |
RufflesAllD | 2:db7c8378b324 | 194 | textToPrint.put(new string(trm->text)); |
RufflesAllD | 2:db7c8378b324 | 195 | |
RufflesAllD | 2:db7c8378b324 | 196 | trameToSend.free(trm); |
joGenie | 0:dc7095ab4963 | 197 | } |
joGenie | 0:dc7095ab4963 | 198 | } |
RufflesAllD | 1:261bb31628e8 | 199 | } |
RufflesAllD | 1:261bb31628e8 | 200 | |
RufflesAllD | 2:db7c8378b324 | 201 | void printer(void const *args) |
RufflesAllD | 2:db7c8378b324 | 202 | { |
RufflesAllD | 2:db7c8378b324 | 203 | while (true) |
RufflesAllD | 2:db7c8378b324 | 204 | { |
RufflesAllD | 2:db7c8378b324 | 205 | osEvent evt = textToPrint.get(); |
RufflesAllD | 2:db7c8378b324 | 206 | |
RufflesAllD | 2:db7c8378b324 | 207 | if (evt.status == osEventMessage) { |
RufflesAllD | 2:db7c8378b324 | 208 | string *msg = (string*)evt.value.p; |
RufflesAllD | 2:db7c8378b324 | 209 | |
RufflesAllD | 2:db7c8378b324 | 210 | pc.printf("Sender says :\n\r%s\n\r", msg->c_str()); |
RufflesAllD | 2:db7c8378b324 | 211 | |
RufflesAllD | 2:db7c8378b324 | 212 | delete msg; |
RufflesAllD | 2:db7c8378b324 | 213 | } |
RufflesAllD | 2:db7c8378b324 | 214 | } |
joGenie | 0:dc7095ab4963 | 215 | } |
joGenie | 0:dc7095ab4963 | 216 | |
joGenie | 0:dc7095ab4963 | 217 | void initialize() |
joGenie | 0:dc7095ab4963 | 218 | { |
joGenie | 0:dc7095ab4963 | 219 | // Set system control |
joGenie | 0:dc7095ab4963 | 220 | LPC_SC->PCONP |= (1 << 22) | (1 << 6); // Enable Timer2 et PWM |
joGenie | 0:dc7095ab4963 | 221 | LPC_SC->PCLKSEL0 |= (1 << 12); // PClk PWM = CCLK |
joGenie | 0:dc7095ab4963 | 222 | LPC_SC->PCLKSEL1 |= (1 << 12); // PClk Timer2 = CCLK |
joGenie | 0:dc7095ab4963 | 223 | |
joGenie | 0:dc7095ab4963 | 224 | // Set pin connection |
joGenie | 0:dc7095ab4963 | 225 | LPC_PINCON->PINSEL0 |= (3 << 10); // Pin 29 Capture |
joGenie | 0:dc7095ab4963 | 226 | LPC_PINCON->PINSEL4 |= (1 << 2); // Pin 25 PWM |
joGenie | 0:dc7095ab4963 | 227 | |
joGenie | 0:dc7095ab4963 | 228 | //Initialize Timer2 for capture |
RufflesAllD | 1:261bb31628e8 | 229 | NVIC_SetVector(TIMER2_IRQn, (uint32_t)&readTrame); |
RufflesAllD | 1:261bb31628e8 | 230 | NVIC_EnableIRQ(TIMER2_IRQn); |
joGenie | 0:dc7095ab4963 | 231 | |
joGenie | 0:dc7095ab4963 | 232 | LPC_TIM2->TC = 0; // Initialize Time Counter |
joGenie | 0:dc7095ab4963 | 233 | LPC_TIM2->PC = 0; // Initialize Prescale Counter |
joGenie | 0:dc7095ab4963 | 234 | LPC_TIM2->PR = 0; // Initialize Prescale Register |
joGenie | 0:dc7095ab4963 | 235 | LPC_TIM2->TCR |= (1 << 1); // Reset Timer Control Register |
joGenie | 0:dc7095ab4963 | 236 | LPC_TIM2->IR = 0xFF; // Reset Interrupt Register |
RufflesAllD | 1:261bb31628e8 | 237 | LPC_TIM2->CCR |= (1 << 5) | (1 << 4) | (1 << 3); // Initialize Capture Control Register |
RufflesAllD | 1:261bb31628e8 | 238 | LPC_TIM2->CTCR |= (1 << 0); // TC is incremented on rising edge |
joGenie | 0:dc7095ab4963 | 239 | |
joGenie | 0:dc7095ab4963 | 240 | LPC_TIM2->TCR = 0x01; // Start Timer Control Register |
joGenie | 0:dc7095ab4963 | 241 | |
joGenie | 0:dc7095ab4963 | 242 | //Initialize PWM |
joGenie | 0:dc7095ab4963 | 243 | LPC_PWM1->MCR |= (1 << 1) | (1 << 0); // Initialize Match Control Register Interrupt/Reset |
joGenie | 0:dc7095ab4963 | 244 | LPC_PWM1->PCR |= (1 << 10) | (1 << 2); // Initialize PWM Control Register Output/Double-edge |
joGenie | 0:dc7095ab4963 | 245 | |
RufflesAllD | 2:db7c8378b324 | 246 | LPC_PWM1->MR0 = tickPerPeriod; // Period |
joGenie | 0:dc7095ab4963 | 247 | LPC_PWM1->LER |= (1 << 2) | (1 << 1); // Initialize Latch Enable Register |
joGenie | 0:dc7095ab4963 | 248 | |
RufflesAllD | 1:261bb31628e8 | 249 | LPC_PWM1->IR = 0xFF; // Reset Interrupt Registe |
joGenie | 0:dc7095ab4963 | 250 | } |
joGenie | 0:dc7095ab4963 | 251 | |
joGenie | 0:dc7095ab4963 | 252 | int main() |
joGenie | 0:dc7095ab4963 | 253 | { |
joGenie | 0:dc7095ab4963 | 254 | initialize(); |
joGenie | 0:dc7095ab4963 | 255 | |
RufflesAllD | 2:db7c8378b324 | 256 | Thread thread1(getText); |
RufflesAllD | 2:db7c8378b324 | 257 | //thread1.set_priority(osPriorityAboveNormal); |
RufflesAllD | 2:db7c8378b324 | 258 | Thread thread2(leTrameur); |
RufflesAllD | 2:db7c8378b324 | 259 | thread2.set_priority(osPriorityAboveNormal); |
RufflesAllD | 2:db7c8378b324 | 260 | Thread thread3(sender); |
RufflesAllD | 2:db7c8378b324 | 261 | thread3.set_priority(osPriorityHigh); |
RufflesAllD | 2:db7c8378b324 | 262 | Thread thread4(receiver); |
RufflesAllD | 2:db7c8378b324 | 263 | thread4.set_priority(osPriorityRealtime); |
RufflesAllD | 2:db7c8378b324 | 264 | Thread thread5(decoder); |
RufflesAllD | 2:db7c8378b324 | 265 | thread5.set_priority(osPriorityHigh); |
RufflesAllD | 2:db7c8378b324 | 266 | Thread thread6(printer); |
RufflesAllD | 2:db7c8378b324 | 267 | thread6.set_priority(osPriorityAboveNormal); |
joGenie | 0:dc7095ab4963 | 268 | |
RufflesAllD | 2:db7c8378b324 | 269 | while(true); |
joGenie | 0:dc7095ab4963 | 270 | } |