app4
Dependencies: mbed-rtos mbed CRC16
Fork of S5info_APP2 by
main.cpp@12:a55f77a0e188, 2017-03-07 (annotated)
- Committer:
- JoeyDionne
- Date:
- Tue Mar 07 02:12:21 2017 +0000
- Revision:
- 12:a55f77a0e188
- Parent:
- 11:b27d1a83f688
- Child:
- 13:a436ba0b78e8
add ?criture
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ericbisson | 7:5501dbea5650 | 1 | #include "mbed.h" |
ericbisson | 0:c637467eeb8f | 2 | #include "rtos.h" |
ericbisson | 7:5501dbea5650 | 3 | #include "bit.h" |
ericbisson | 8:5b87b1f9d91f | 4 | #include "uart.h" |
ericbisson | 1:b3ae0d9f02ad | 5 | |
ericbisson | 8:5b87b1f9d91f | 6 | const float HALF_PERIOD = 0.05; // secondes |
ericbisson | 2:c6465d4e82d2 | 7 | |
ericbisson | 7:5501dbea5650 | 8 | Serial pc(USBTX, USBRX, 9600); |
ericbisson | 7:5501dbea5650 | 9 | Serial uart(p13, p14, 9600); |
ericbisson | 8:5b87b1f9d91f | 10 | Thread ThreadLecture; |
ericbisson | 2:c6465d4e82d2 | 11 | |
JoeyDionne | 12:a55f77a0e188 | 12 | bool transmit = false; //faux pour le debut de demi-periode d'envoie d'un bit, vrai pour la 2ème demi-periode |
JoeyDionne | 12:a55f77a0e188 | 13 | char trame_sent[80]; //tableau de la trame à envoyer |
JoeyDionne | 12:a55f77a0e188 | 14 | uint8_t byte_sent_pos, //position de l'octet dans le tableau d'envoi |
JoeyDionne | 12:a55f77a0e188 | 15 | bit_sent, //position du bit de l'octet en cours d'envoi (du MSB au LSB) 7..0 |
JoeyDionne | 12:a55f77a0e188 | 16 | trame_length; //longueur de la trame complete |
JoeyDionne | 11:b27d1a83f688 | 17 | //test |
JoeyDionne | 11:b27d1a83f688 | 18 | |
ericbisson | 7:5501dbea5650 | 19 | bool bIsHalfPeriod = false; |
ericbisson | 7:5501dbea5650 | 20 | |
ericbisson | 7:5501dbea5650 | 21 | extern "C" void RIT_IRQHandler(void) { |
ericbisson | 7:5501dbea5650 | 22 | //clear flag |
ericbisson | 7:5501dbea5650 | 23 | LPC_RIT->RICTRL |= bit0; //write 1 to clear bit |
ericbisson | 5:e878d87782ce | 24 | |
ericbisson | 7:5501dbea5650 | 25 | bIsHalfPeriod = !bIsHalfPeriod; |
ericbisson | 1:b3ae0d9f02ad | 26 | } |
ericbisson | 1:b3ae0d9f02ad | 27 | |
ericbisson | 7:5501dbea5650 | 28 | void p14_interrupt() |
ericbisson | 7:5501dbea5650 | 29 | { |
ericbisson | 8:5b87b1f9d91f | 30 | // On turn off les interrupts de lecture une fois qu'on a détecter un message |
ericbisson | 8:5b87b1f9d91f | 31 | uart.attach(NULL, uart.RxIrq); |
ericbisson | 8:5b87b1f9d91f | 32 | |
ericbisson | 7:5501dbea5650 | 33 | // On envoie le signal au thread de lecture |
ericbisson | 8:5b87b1f9d91f | 34 | ThreadLecture.signal_set(1); |
ericbisson | 7:5501dbea5650 | 35 | }; |
ericbisson | 1:b3ae0d9f02ad | 36 | |
ericbisson | 7:5501dbea5650 | 37 | void read() |
ericbisson | 7:5501dbea5650 | 38 | { |
ericbisson | 7:5501dbea5650 | 39 | while(true) |
ericbisson | 7:5501dbea5650 | 40 | { |
ericbisson | 8:5b87b1f9d91f | 41 | // Attente passive d'un message entrant |
ericbisson | 8:5b87b1f9d91f | 42 | uart.attach(&p14_interrupt, uart.RxIrq); |
ericbisson | 8:5b87b1f9d91f | 43 | ThreadLecture.signal_wait(1); |
ericbisson | 2:c6465d4e82d2 | 44 | |
ericbisson | 8:5b87b1f9d91f | 45 | // Lis le message. Retourne une exception si il y a une erreur |
ericbisson | 10:8b066285c2e0 | 46 | vector<char> message = uart_read(uart); |
ericbisson | 2:c6465d4e82d2 | 47 | |
ericbisson | 8:5b87b1f9d91f | 48 | if (!message.empty()) |
ericbisson | 8:5b87b1f9d91f | 49 | { |
ericbisson | 8:5b87b1f9d91f | 50 | // Affiche le message à l'écran |
ericbisson | 8:5b87b1f9d91f | 51 | pc.printf(&message[0], message.size()); |
ericbisson | 8:5b87b1f9d91f | 52 | } |
ericbisson | 1:b3ae0d9f02ad | 53 | } |
ericbisson | 7:5501dbea5650 | 54 | }; |
ericbisson | 3:3ecbcc05bc85 | 55 | |
ericbisson | 7:5501dbea5650 | 56 | void rit_init() |
ericbisson | 4:87e9b434bb4d | 57 | { |
ericbisson | 7:5501dbea5650 | 58 | LPC_SC->PCONP |= bit16; //Power Control for Peripherals register: power up RIT clock |
ericbisson | 7:5501dbea5650 | 59 | LPC_SC->PCLKSEL1 |= (bit26 && bit27); //Peripheral clock selection: divide clock by 8 (run RIT clock by 12.5MHz) |
ericbisson | 7:5501dbea5650 | 60 | LPC_RIT->RICOUNTER = 0; //set counter to zero |
ericbisson | 8:5b87b1f9d91f | 61 | LPC_RIT->RICOMPVAL = 250000000 * HALF_PERIOD; //interrupt tick every HALF_PERIOD |
ericbisson | 7:5501dbea5650 | 62 | LPC_RIT->RICTRL |= bit1; // clear timer when counter reaches value |
ericbisson | 7:5501dbea5650 | 63 | LPC_RIT->RICTRL |= bit3; // enable timer |
ericbisson | 7:5501dbea5650 | 64 | |
ericbisson | 7:5501dbea5650 | 65 | //enable interrupt |
ericbisson | 7:5501dbea5650 | 66 | NVIC_SetPriority(RIT_IRQn, 31); |
ericbisson | 7:5501dbea5650 | 67 | NVIC_EnableIRQ(RIT_IRQn); |
ericbisson | 7:5501dbea5650 | 68 | }; |
ericbisson | 4:87e9b434bb4d | 69 | |
JoeyDionne | 12:a55f77a0e188 | 70 | void send_data() |
JoeyDionne | 12:a55f77a0e188 | 71 | { |
JoeyDionne | 12:a55f77a0e188 | 72 | if (!transmit) { //Si on est dans la premiere demi-periode d'envoie |
JoeyDionne | 12:a55f77a0e188 | 73 | if (((trame_sent[byte_sent_pos] >> bit_sent) & 0x01) == 1) { //Verifier le bit à envoyer et preparer la prochaine interruption pour prendre sa valeur |
JoeyDionne | 12:a55f77a0e188 | 74 | LPC_RIT->EMR |= 1 << 5; |
JoeyDionne | 12:a55f77a0e188 | 75 | LPC_RIT->EMR &= ~(1 << 4); |
JoeyDionne | 12:a55f77a0e188 | 76 | } else { |
JoeyDionne | 12:a55f77a0e188 | 77 | LPC_RIT->EMR |= 1 << 4; |
JoeyDionne | 12:a55f77a0e188 | 78 | LPC_RIT->EMR &= ~(1 << 5); |
JoeyDionne | 12:a55f77a0e188 | 79 | } |
JoeyDionne | 12:a55f77a0e188 | 80 | } else { //Si on est dans la 2eme demi-periode d'envoie, toggle a la prochaine interruption |
JoeyDionne | 12:a55f77a0e188 | 81 | LPC_RIT->EMR |= 3 << 4; |
JoeyDionne | 12:a55f77a0e188 | 82 | bit_sent--; |
JoeyDionne | 12:a55f77a0e188 | 83 | } |
JoeyDionne | 12:a55f77a0e188 | 84 | transmit = !transmit; //varier entre la 1ere et 2eme partie de demi-periode |
JoeyDionne | 12:a55f77a0e188 | 85 | LPC_RIT->MR0 += HALF_PERIOD; //preparer la prochaine interruption a une demi-periode plus loin |
JoeyDionne | 12:a55f77a0e188 | 86 | if (bit_sent < 0) { //Si l'octet a ete envoye |
JoeyDionne | 12:a55f77a0e188 | 87 | bit_sent = 7; //remettre la position initiale pour le prochain octet |
JoeyDionne | 12:a55f77a0e188 | 88 | byte_sent_pos++; //incrementer l'octet |
JoeyDionne | 12:a55f77a0e188 | 89 | if (byte_sent_pos > trame_length) { //Si la trame a ete envoyee |
JoeyDionne | 12:a55f77a0e188 | 90 | LPC_RIT->MCR &= 0; //desactiver les interruptions du MAT |
JoeyDionne | 12:a55f77a0e188 | 91 | LPC_RIT->EMR &= ~(3 << 4); //remettre a zero le registre EMR (00 pour rien faire, 01 pour mettre a 1, 10 pour mettre a 0 et 11 pour toggle) |
JoeyDionne | 12:a55f77a0e188 | 92 | byte_sent_pos = 0; |
JoeyDionne | 12:a55f77a0e188 | 93 | transmit = false; |
JoeyDionne | 12:a55f77a0e188 | 94 | } |
JoeyDionne | 12:a55f77a0e188 | 95 | } |
JoeyDionne | 12:a55f77a0e188 | 96 | } |
JoeyDionne | 12:a55f77a0e188 | 97 | |
JoeyDionne | 12:a55f77a0e188 | 98 | void get_text() |
JoeyDionne | 12:a55f77a0e188 | 99 | { |
JoeyDionne | 12:a55f77a0e188 | 100 | CRC16 *myCRC = new CRC16(); |
JoeyDionne | 12:a55f77a0e188 | 101 | |
JoeyDionne | 12:a55f77a0e188 | 102 | trame_sent[0] = 0x55; //Preambule |
JoeyDionne | 12:a55f77a0e188 | 103 | trame_sent[1] = 0x7E; //Start |
JoeyDionne | 12:a55f77a0e188 | 104 | trame_sent[2] = 0x00; //Type + Flag mis a 0x00 |
JoeyDionne | 12:a55f77a0e188 | 105 | |
JoeyDionne | 12:a55f77a0e188 | 106 | pc.printf("\n\rYour text : "); |
JoeyDionne | 12:a55f77a0e188 | 107 | int count = 0; |
JoeyDionne | 12:a55f77a0e188 | 108 | char c = 0x00; |
JoeyDionne | 12:a55f77a0e188 | 109 | char text[73]; |
JoeyDionne | 12:a55f77a0e188 | 110 | while(c != 0x0D && count < 73) { //Tant que c'est different de '\r' et un maximum de 33 caractères |
JoeyDionne | 12:a55f77a0e188 | 111 | c = pc.getc(); |
JoeyDionne | 12:a55f77a0e188 | 112 | trame_sent[count + 4] = c; //Ajouter les caractères tapés au clavier dans le message |
JoeyDionne | 12:a55f77a0e188 | 113 | text[count] = c; |
JoeyDionne | 12:a55f77a0e188 | 114 | pc.putc(c); |
JoeyDionne | 12:a55f77a0e188 | 115 | count++; |
JoeyDionne | 12:a55f77a0e188 | 116 | } |
JoeyDionne | 12:a55f77a0e188 | 117 | trame_sent[3] = (char)count; //Longueur du message (Max 33 caractères) |
JoeyDionne | 12:a55f77a0e188 | 118 | |
JoeyDionne | 12:a55f77a0e188 | 119 | unsigned short resultCRC = myCRC->calculateCRC16(text,count); |
JoeyDionne | 12:a55f77a0e188 | 120 | trame_sent[count + 4] = (resultCRC >> 8) & 0xFF; |
JoeyDionne | 12:a55f77a0e188 | 121 | trame_sent[count + 5] = resultCRC & 0xFF; |
JoeyDionne | 12:a55f77a0e188 | 122 | |
JoeyDionne | 12:a55f77a0e188 | 123 | trame_sent[count + 6] = 0x7E; //End |
JoeyDionne | 12:a55f77a0e188 | 124 | trame_length = count + 6; //Longueur de la trame |
JoeyDionne | 12:a55f77a0e188 | 125 | |
JoeyDionne | 12:a55f77a0e188 | 126 | } |
JoeyDionne | 12:a55f77a0e188 | 127 | |
JoeyDionne | 12:a55f77a0e188 | 128 | void write() |
JoeyDionne | 12:a55f77a0e188 | 129 | { |
JoeyDionne | 12:a55f77a0e188 | 130 | byte_sent_pos = 0; |
JoeyDionne | 12:a55f77a0e188 | 131 | bit_sent = 7; |
JoeyDionne | 12:a55f77a0e188 | 132 | LPC_RIT->MCR = 1; //Permettre les interruption du MAT |
JoeyDionne | 12:a55f77a0e188 | 133 | LPC_RIT->MR0 = LPC_RIT->TC + HALF_PERIOD; //Faire une interruption a la prochaine demi-periode |
JoeyDionne | 12:a55f77a0e188 | 134 | } |
JoeyDionne | 12:a55f77a0e188 | 135 | |
ericbisson | 2:c6465d4e82d2 | 136 | int main() { |
ericbisson | 7:5501dbea5650 | 137 | rit_init(); |
ericbisson | 0:c637467eeb8f | 138 | |
ericbisson | 8:5b87b1f9d91f | 139 | ThreadLecture.start(read); |
ericbisson | 0:c637467eeb8f | 140 | |
ericbisson | 3:3ecbcc05bc85 | 141 | while(true) { |
JoeyDionne | 12:a55f77a0e188 | 142 | get_text(); |
JoeyDionne | 12:a55f77a0e188 | 143 | write(); |
JoeyDionne | 12:a55f77a0e188 | 144 | //uart.printf("12345"); |
ericbisson | 7:5501dbea5650 | 145 | wait_ms(100); |
ericbisson | 0:c637467eeb8f | 146 | } |
ericbisson | 7:5501dbea5650 | 147 | }; |