Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ConfigFile EthernetInterface mbed-rtos mbed
Fork of S05APP3 by
main.cpp@3:fbd4b164e8ad, 2017-02-11 (annotated)
- Committer:
- marc1119
- Date:
- Sat Feb 11 01:54:57 2017 +0000
- Revision:
- 3:fbd4b164e8ad
- Parent:
- 2:3fbf13ba290e
- Child:
- 4:393738672d08
L'envoie ne fonctionne pas encore correctement
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
marc1119 | 0:ec23a7ae804c | 1 | #include "EthernetInterface.h" |
marc1119 | 0:ec23a7ae804c | 2 | #include "ConfigFile.h" |
marc1119 | 0:ec23a7ae804c | 3 | #include "mbed.h" |
marc1119 | 0:ec23a7ae804c | 4 | |
marc1119 | 1:ceb3f8ba8793 | 5 | //Serial avec le Xbee |
marc1119 | 0:ec23a7ae804c | 6 | DigitalOut reset(p8); |
marc1119 | 1:ceb3f8ba8793 | 7 | Serial uart(p13, p14); // tx, rx |
marc1119 | 2:3fbf13ba290e | 8 | uint16_t frameSize = 0; |
marc1119 | 1:ceb3f8ba8793 | 9 | |
marc1119 | 1:ceb3f8ba8793 | 10 | //Serial avec le PC |
marc1119 | 1:ceb3f8ba8793 | 11 | Serial pc(USBTX, USBRX); // tx, rx |
marc1119 | 0:ec23a7ae804c | 12 | |
marc1119 | 0:ec23a7ae804c | 13 | //Socket Buffer |
marc1119 | 2:3fbf13ba290e | 14 | TCPSocketConnection sock; |
marc1119 | 2:3fbf13ba290e | 15 | uint8_t buffer[104] = { 0 }; |
marc1119 | 0:ec23a7ae804c | 16 | char serverAddrvalue[32]; |
marc1119 | 2:3fbf13ba290e | 17 | uint16_t portNo = 0; |
marc1119 | 2:3fbf13ba290e | 18 | char portNbValue[4]; |
marc1119 | 2:3fbf13ba290e | 19 | |
marc1119 | 3:fbd4b164e8ad | 20 | bool boolLED = false; |
marc1119 | 3:fbd4b164e8ad | 21 | |
marc1119 | 2:3fbf13ba290e | 22 | //Union créée pour mettre deux 8 bits en un 16 bits. |
marc1119 | 2:3fbf13ba290e | 23 | uint16_t getLength(uint8_t value1, uint8_t value2) { |
marc1119 | 2:3fbf13ba290e | 24 | union { |
marc1119 | 2:3fbf13ba290e | 25 | uint16_t u16_value; |
marc1119 | 2:3fbf13ba290e | 26 | uint8_t u8_value[2]; |
marc1119 | 2:3fbf13ba290e | 27 | } length; |
marc1119 | 2:3fbf13ba290e | 28 | |
marc1119 | 2:3fbf13ba290e | 29 | length.u8_value[1] = value1; |
marc1119 | 2:3fbf13ba290e | 30 | length.u8_value[0] = value2; |
marc1119 | 2:3fbf13ba290e | 31 | |
marc1119 | 2:3fbf13ba290e | 32 | return length.u16_value; |
marc1119 | 2:3fbf13ba290e | 33 | } |
marc1119 | 2:3fbf13ba290e | 34 | |
marc1119 | 3:fbd4b164e8ad | 35 | void toogleLED() { |
marc1119 | 3:fbd4b164e8ad | 36 | |
marc1119 | 3:fbd4b164e8ad | 37 | //Numéro 64 bit = 00 13 A2 00 40 8B 41 6E |
marc1119 | 3:fbd4b164e8ad | 38 | //uint8_t high[20] = {0x7E, 0x00, 0x10, 0x17, 0x00, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x05, 0x3D}; |
marc1119 | 3:fbd4b164e8ad | 39 | //uint8_t low[20] = {0x7E, 0x00, 0x10, 0x17, 0x00, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x04, 0x3E}; |
marc1119 | 3:fbd4b164e8ad | 40 | uint8_t high[20] = {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x05, 0x3C}; |
marc1119 | 3:fbd4b164e8ad | 41 | uint8_t low[20] = {0x7E, 0x00, 0x10, 0x17, 0x02, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x04, 0x3C}; |
marc1119 | 3:fbd4b164e8ad | 42 | |
marc1119 | 3:fbd4b164e8ad | 43 | for(int i = 0; i < 20;) { |
marc1119 | 3:fbd4b164e8ad | 44 | if(uart.writeable()) { |
marc1119 | 3:fbd4b164e8ad | 45 | if(boolLED) uart.putc(high[i]); |
marc1119 | 3:fbd4b164e8ad | 46 | else uart.putc(low[i]); |
marc1119 | 3:fbd4b164e8ad | 47 | i++; |
marc1119 | 3:fbd4b164e8ad | 48 | } |
marc1119 | 3:fbd4b164e8ad | 49 | } |
marc1119 | 3:fbd4b164e8ad | 50 | |
marc1119 | 3:fbd4b164e8ad | 51 | if(boolLED) pc.printf("Et un haut!\n"); |
marc1119 | 3:fbd4b164e8ad | 52 | else pc.printf("Et un bas!\n"); |
marc1119 | 3:fbd4b164e8ad | 53 | |
marc1119 | 3:fbd4b164e8ad | 54 | boolLED = !boolLED; |
marc1119 | 3:fbd4b164e8ad | 55 | } |
marc1119 | 3:fbd4b164e8ad | 56 | |
marc1119 | 0:ec23a7ae804c | 57 | //Read the config file |
marc1119 | 0:ec23a7ae804c | 58 | void readConfigFile() |
marc1119 | 0:ec23a7ae804c | 59 | { |
marc1119 | 0:ec23a7ae804c | 60 | LocalFileSystem local("local"); |
marc1119 | 0:ec23a7ae804c | 61 | ConfigFile cfg; |
marc1119 | 0:ec23a7ae804c | 62 | char *serverAddr = "serverAddr"; |
marc1119 | 2:3fbf13ba290e | 63 | char *tempPortNo = "portNb"; |
marc1119 | 2:3fbf13ba290e | 64 | if (!cfg.read("/local/input.cfg")) error("Erreur dans la lecture du fichier\n"); |
marc1119 | 2:3fbf13ba290e | 65 | else |
marc1119 | 2:3fbf13ba290e | 66 | { |
marc1119 | 2:3fbf13ba290e | 67 | cfg.getValue(serverAddr, &serverAddrvalue[0], sizeof(serverAddrvalue)); |
marc1119 | 2:3fbf13ba290e | 68 | cfg.getValue(tempPortNo, &portNbValue[0], sizeof(portNbValue)); |
marc1119 | 2:3fbf13ba290e | 69 | portNo = (uint16_t)strtol(portNbValue, NULL, 10); |
marc1119 | 2:3fbf13ba290e | 70 | } |
marc1119 | 0:ec23a7ae804c | 71 | } |
marc1119 | 0:ec23a7ae804c | 72 | |
marc1119 | 0:ec23a7ae804c | 73 | void initSocket() |
marc1119 | 0:ec23a7ae804c | 74 | { |
marc1119 | 2:3fbf13ba290e | 75 | //int repSize; |
marc1119 | 1:ceb3f8ba8793 | 76 | //while (true) { |
marc1119 | 1:ceb3f8ba8793 | 77 | |
marc1119 | 1:ceb3f8ba8793 | 78 | //sprintf (buffer, (const char *)uart.getc()); |
marc1119 | 1:ceb3f8ba8793 | 79 | //sock.send_all(buffer, sizeof(buffer)-1); |
marc1119 | 1:ceb3f8ba8793 | 80 | |
marc1119 | 1:ceb3f8ba8793 | 81 | //repSize = sock.receive(buffer, sizeof(buffer)-1); |
marc1119 | 1:ceb3f8ba8793 | 82 | // if (repSize <= 0) { |
marc1119 | 1:ceb3f8ba8793 | 83 | // printf("Error"); |
marc1119 | 1:ceb3f8ba8793 | 84 | // sock.close(); |
marc1119 | 1:ceb3f8ba8793 | 85 | // break; |
marc1119 | 1:ceb3f8ba8793 | 86 | // } |
marc1119 | 1:ceb3f8ba8793 | 87 | //buffer[repSize] = '\0'; |
marc1119 | 1:ceb3f8ba8793 | 88 | //printf("Received %d chars from server:\n%s\n", repSize, buffer); |
marc1119 | 1:ceb3f8ba8793 | 89 | //} |
marc1119 | 1:ceb3f8ba8793 | 90 | } |
marc1119 | 1:ceb3f8ba8793 | 91 | |
marc1119 | 3:fbd4b164e8ad | 92 | void checkForError() |
marc1119 | 3:fbd4b164e8ad | 93 | { |
marc1119 | 3:fbd4b164e8ad | 94 | if(buffer[0] == 0x97) { |
marc1119 | 3:fbd4b164e8ad | 95 | if(buffer[1] == 0x02) { |
marc1119 | 3:fbd4b164e8ad | 96 | pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat bas.\n"); |
marc1119 | 3:fbd4b164e8ad | 97 | } |
marc1119 | 3:fbd4b164e8ad | 98 | else if(buffer[1] == 0x01) { |
marc1119 | 3:fbd4b164e8ad | 99 | pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat haut\n"); |
marc1119 | 3:fbd4b164e8ad | 100 | } |
marc1119 | 3:fbd4b164e8ad | 101 | } |
marc1119 | 3:fbd4b164e8ad | 102 | } |
marc1119 | 3:fbd4b164e8ad | 103 | |
marc1119 | 2:3fbf13ba290e | 104 | void verifyChecksum() |
marc1119 | 1:ceb3f8ba8793 | 105 | { |
marc1119 | 2:3fbf13ba290e | 106 | //Je valide le checksum pour voir si tout est correct. |
marc1119 | 2:3fbf13ba290e | 107 | uint32_t checkSum = 0; |
marc1119 | 2:3fbf13ba290e | 108 | for(int i = 0; i < frameSize; i++) { |
marc1119 | 2:3fbf13ba290e | 109 | checkSum += buffer[i]; |
marc1119 | 1:ceb3f8ba8793 | 110 | } |
marc1119 | 2:3fbf13ba290e | 111 | if((0xFF - (checkSum & 0xFF)) != buffer[frameSize]) |
marc1119 | 2:3fbf13ba290e | 112 | pc.printf("Erreur dans le checksum. \n"); |
marc1119 | 3:fbd4b164e8ad | 113 | |
marc1119 | 3:fbd4b164e8ad | 114 | checkForError(); |
marc1119 | 2:3fbf13ba290e | 115 | } |
marc1119 | 2:3fbf13ba290e | 116 | |
marc1119 | 2:3fbf13ba290e | 117 | void readFrame(){ |
marc1119 | 2:3fbf13ba290e | 118 | |
marc1119 | 2:3fbf13ba290e | 119 | uint8_t temp[2] = { 0 }; |
marc1119 | 2:3fbf13ba290e | 120 | if(uart.readable() && uart.getc() == 0x7E) { |
marc1119 | 2:3fbf13ba290e | 121 | |
marc1119 | 2:3fbf13ba290e | 122 | //On ramasse la taille de la trame |
marc1119 | 2:3fbf13ba290e | 123 | for(int i = 0; i < 2;) |
marc1119 | 2:3fbf13ba290e | 124 | { |
marc1119 | 2:3fbf13ba290e | 125 | if(uart.readable()) { |
marc1119 | 2:3fbf13ba290e | 126 | temp[i] = uart.getc(); |
marc1119 | 2:3fbf13ba290e | 127 | i++; |
marc1119 | 2:3fbf13ba290e | 128 | } |
marc1119 | 2:3fbf13ba290e | 129 | } |
marc1119 | 2:3fbf13ba290e | 130 | frameSize = getLength(temp[0], temp[1]); |
marc1119 | 2:3fbf13ba290e | 131 | |
marc1119 | 2:3fbf13ba290e | 132 | //Je lis le restant de la tramme et la met dans un buffer |
marc1119 | 2:3fbf13ba290e | 133 | for(int j = 0; j < frameSize + 1;) |
marc1119 | 2:3fbf13ba290e | 134 | { |
marc1119 | 2:3fbf13ba290e | 135 | if(uart.readable()) { |
marc1119 | 2:3fbf13ba290e | 136 | buffer[j] = uart.getc(); |
marc1119 | 2:3fbf13ba290e | 137 | j++; |
marc1119 | 2:3fbf13ba290e | 138 | } |
marc1119 | 2:3fbf13ba290e | 139 | } |
marc1119 | 2:3fbf13ba290e | 140 | verifyChecksum(); |
marc1119 | 3:fbd4b164e8ad | 141 | //Debug seulement |
marc1119 | 3:fbd4b164e8ad | 142 | for(int k = 0; k < frameSize; k++) |
marc1119 | 3:fbd4b164e8ad | 143 | pc.printf("%X-", buffer[k]); |
marc1119 | 3:fbd4b164e8ad | 144 | pc.printf("\n---------------\n"); |
marc1119 | 0:ec23a7ae804c | 145 | } |
marc1119 | 0:ec23a7ae804c | 146 | } |
marc1119 | 0:ec23a7ae804c | 147 | |
marc1119 | 0:ec23a7ae804c | 148 | int main() { |
marc1119 | 2:3fbf13ba290e | 149 | |
marc1119 | 1:ceb3f8ba8793 | 150 | reset = 0; |
marc1119 | 1:ceb3f8ba8793 | 151 | wait(0.4); |
marc1119 | 1:ceb3f8ba8793 | 152 | reset = 1; |
marc1119 | 0:ec23a7ae804c | 153 | |
marc1119 | 2:3fbf13ba290e | 154 | readConfigFile(); |
marc1119 | 2:3fbf13ba290e | 155 | |
marc1119 | 2:3fbf13ba290e | 156 | //Init RJ45 and use DHCP |
marc1119 | 2:3fbf13ba290e | 157 | EthernetInterface eth; |
marc1119 | 2:3fbf13ba290e | 158 | if(eth.init() != 0) |
marc1119 | 3:fbd4b164e8ad | 159 | pc.printf("Erreur d'initialisation du RJ45.\n"); |
marc1119 | 2:3fbf13ba290e | 160 | if(eth.connect() != 0) |
marc1119 | 3:fbd4b164e8ad | 161 | pc.printf("Erreur de connection du RJ45\n"); |
marc1119 | 2:3fbf13ba290e | 162 | |
marc1119 | 2:3fbf13ba290e | 163 | //Init Socket |
marc1119 | 2:3fbf13ba290e | 164 | if(sock.connect(serverAddrvalue, portNo) != 0) |
marc1119 | 3:fbd4b164e8ad | 165 | pc.printf("Erreur de socket.\n"); |
marc1119 | 2:3fbf13ba290e | 166 | |
marc1119 | 2:3fbf13ba290e | 167 | //sock.send_all(buffer, sizeof(buffer)-1); |
marc1119 | 2:3fbf13ba290e | 168 | |
marc1119 | 2:3fbf13ba290e | 169 | //initSocket(); |
marc1119 | 3:fbd4b164e8ad | 170 | |
marc1119 | 3:fbd4b164e8ad | 171 | //Set ticker to blink LED at each 1 sec |
marc1119 | 3:fbd4b164e8ad | 172 | //Ticker blinkLED; |
marc1119 | 3:fbd4b164e8ad | 173 | // blinkLED.attach(&toogleLED, 1); |
marc1119 | 3:fbd4b164e8ad | 174 | |
marc1119 | 3:fbd4b164e8ad | 175 | pc.printf("Pret a recevoir des trames! \n"); |
marc1119 | 1:ceb3f8ba8793 | 176 | while(1) { |
marc1119 | 2:3fbf13ba290e | 177 | readFrame(); |
marc1119 | 3:fbd4b164e8ad | 178 | wait_ms(1000); |
marc1119 | 3:fbd4b164e8ad | 179 | toogleLED(); |
marc1119 | 1:ceb3f8ba8793 | 180 | } |
marc1119 | 0:ec23a7ae804c | 181 | } |
marc1119 | 0:ec23a7ae804c | 182 | |
marc1119 | 2:3fbf13ba290e | 183 |