OldRemmote allows you to record IR remotes and upload the IR code to your smartphone to replay it later. Check www.julesthuillier.com for more information
Dependencies: BLE_API mbed nRF51822
main.cpp@3:a491b09cfd3b, 2015-02-09 (annotated)
- Committer:
- JulesThuillier
- Date:
- Mon Feb 09 16:25:56 2015 +0000
- Revision:
- 3:a491b09cfd3b
- Parent:
- 2:61e196a0eaf2
- Child:
- 4:688a955562ad
parsing send
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JulesThuillier | 0:193d8168f903 | 1 | #include "mbed.h" |
JulesThuillier | 0:193d8168f903 | 2 | #include "BLEDevice.h" |
JulesThuillier | 0:193d8168f903 | 3 | |
JulesThuillier | 0:193d8168f903 | 4 | #include "DFUService.h" |
JulesThuillier | 0:193d8168f903 | 5 | |
JulesThuillier | 0:193d8168f903 | 6 | //UART Primary Service |
JulesThuillier | 0:193d8168f903 | 7 | #include "UARTService.h" |
JulesThuillier | 0:193d8168f903 | 8 | |
JulesThuillier | 0:193d8168f903 | 9 | //Battery and DeviceInformation Auxilary Services |
JulesThuillier | 0:193d8168f903 | 10 | #include "BatteryService.h" |
JulesThuillier | 0:193d8168f903 | 11 | #include "DeviceInformationService.h" |
JulesThuillier | 0:193d8168f903 | 12 | |
JulesThuillier | 0:193d8168f903 | 13 | #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console; |
JulesThuillier | 0:193d8168f903 | 14 | * it will have an impact on code-size and power consumption. */ |
JulesThuillier | 0:193d8168f903 | 15 | #if NEED_CONSOLE_OUTPUT |
JulesThuillier | 0:193d8168f903 | 16 | #define DEBUG(...) { printf(__VA_ARGS__);} |
JulesThuillier | 0:193d8168f903 | 17 | #else |
JulesThuillier | 0:193d8168f903 | 18 | #define DEBUG(...) /* nothing */ |
JulesThuillier | 0:193d8168f903 | 19 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
JulesThuillier | 0:193d8168f903 | 20 | |
JulesThuillier | 0:193d8168f903 | 21 | #define RECORD_OFF_TIMER 12000 |
JulesThuillier | 0:193d8168f903 | 22 | #define ADV_INTERVAL 1600 /* 1000ms; in multiples of 0.625ms. */ |
JulesThuillier | 0:193d8168f903 | 23 | #define ADV_TIMEOUT 30 /* in seconds */ |
JulesThuillier | 0:193d8168f903 | 24 | #define BUTTON_SHUTDOWN_DELAY 4 |
JulesThuillier | 0:193d8168f903 | 25 | |
JulesThuillier | 0:193d8168f903 | 26 | #define NRF51822 0 |
JulesThuillier | 0:193d8168f903 | 27 | |
JulesThuillier | 0:193d8168f903 | 28 | /* Initialisation des entrées sorties */ |
JulesThuillier | 0:193d8168f903 | 29 | |
JulesThuillier | 0:193d8168f903 | 30 | PinName ir = P0_6; |
JulesThuillier | 0:193d8168f903 | 31 | PwmOut irled(P0_12); |
JulesThuillier | 0:193d8168f903 | 32 | |
JulesThuillier | 0:193d8168f903 | 33 | static char const DEVICE_NAME[] = "OldRemote"; |
JulesThuillier | 0:193d8168f903 | 34 | |
JulesThuillier | 0:193d8168f903 | 35 | BLEDevice ble; |
JulesThuillier | 0:193d8168f903 | 36 | UARTService *uartServicePtr; |
JulesThuillier | 0:193d8168f903 | 37 | BatteryService *battServicePtr; |
JulesThuillier | 0:193d8168f903 | 38 | |
JulesThuillier | 0:193d8168f903 | 39 | enum States {DISCONNECTED, OFF, ADVERTISING, CONNECTED}; |
JulesThuillier | 0:193d8168f903 | 40 | States currentState = DISCONNECTED; |
JulesThuillier | 0:193d8168f903 | 41 | |
JulesThuillier | 0:193d8168f903 | 42 | // Timer pour connaitre la duree de l'enfoncement |
JulesThuillier | 0:193d8168f903 | 43 | Timer timer; |
JulesThuillier | 0:193d8168f903 | 44 | Timer timerUp; |
JulesThuillier | 0:193d8168f903 | 45 | Timer timerDown; |
JulesThuillier | 0:193d8168f903 | 46 | Timeout recordOffTimer; |
JulesThuillier | 0:193d8168f903 | 47 | |
JulesThuillier | 0:193d8168f903 | 48 | // Ticker pour un reveil toutes ls 1 secondes |
JulesThuillier | 0:193d8168f903 | 49 | Ticker ticker; |
JulesThuillier | 0:193d8168f903 | 50 | bool startPeriodick = false; |
JulesThuillier | 0:193d8168f903 | 51 | // Turn the device off |
JulesThuillier | 0:193d8168f903 | 52 | |
JulesThuillier | 0:193d8168f903 | 53 | uint16_t recordBuffers [3][100]; |
JulesThuillier | 0:193d8168f903 | 54 | uint8_t indexi = 0, indexj = 0; |
JulesThuillier | 0:193d8168f903 | 55 | |
JulesThuillier | 1:bfd2fb3f5584 | 56 | uint16_t sendBuffer [100]; |
JulesThuillier | 3:a491b09cfd3b | 57 | uint8_t sendBufferIndex = 0; |
JulesThuillier | 3:a491b09cfd3b | 58 | |
JulesThuillier | 3:a491b09cfd3b | 59 | bool receivingDatas = false; |
JulesThuillier | 1:bfd2fb3f5584 | 60 | |
JulesThuillier | 2:61e196a0eaf2 | 61 | // Convertit un tableau de char en int |
JulesThuillier | 2:61e196a0eaf2 | 62 | int char_to_int(char *data) |
JulesThuillier | 2:61e196a0eaf2 | 63 | { |
JulesThuillier | 2:61e196a0eaf2 | 64 | int i; |
JulesThuillier | 2:61e196a0eaf2 | 65 | sscanf(data, "%d", &i); |
JulesThuillier | 2:61e196a0eaf2 | 66 | return i; |
JulesThuillier | 2:61e196a0eaf2 | 67 | } |
JulesThuillier | 2:61e196a0eaf2 | 68 | |
JulesThuillier | 0:193d8168f903 | 69 | |
JulesThuillier | 0:193d8168f903 | 70 | /* Envoi en infrarouge les données passées en parametre |
JulesThuillier | 0:193d8168f903 | 71 | * PROTOCOL : |
JulesThuillier | 0:193d8168f903 | 72 | * first data : array size - 1 (number of HIGH - LOW datas) |
JulesThuillier | 0:193d8168f903 | 73 | * every odd index : duration of HIGH |
JulesThuillier | 0:193d8168f903 | 74 | * every even index : duration of LOW |
JulesThuillier | 0:193d8168f903 | 75 | */ |
JulesThuillier | 3:a491b09cfd3b | 76 | void sendIR(uint16_t *data) |
JulesThuillier | 0:193d8168f903 | 77 | { |
JulesThuillier | 3:a491b09cfd3b | 78 | uint8_t size = data[0]; |
JulesThuillier | 0:193d8168f903 | 79 | // Start at index 1, as index 0 is buffer length |
JulesThuillier | 0:193d8168f903 | 80 | for(int i=1; i<size; i++) |
JulesThuillier | 0:193d8168f903 | 81 | { |
JulesThuillier | 0:193d8168f903 | 82 | // HIGH |
JulesThuillier | 1:bfd2fb3f5584 | 83 | if((i%2)==1) |
JulesThuillier | 0:193d8168f903 | 84 | { |
JulesThuillier | 0:193d8168f903 | 85 | irled.write(0.33f); |
JulesThuillier | 0:193d8168f903 | 86 | } |
JulesThuillier | 0:193d8168f903 | 87 | // LOW |
JulesThuillier | 0:193d8168f903 | 88 | else |
JulesThuillier | 0:193d8168f903 | 89 | { |
JulesThuillier | 0:193d8168f903 | 90 | irled.write(0); |
JulesThuillier | 0:193d8168f903 | 91 | } |
JulesThuillier | 0:193d8168f903 | 92 | |
JulesThuillier | 0:193d8168f903 | 93 | wait_us(data[i]); |
JulesThuillier | 0:193d8168f903 | 94 | } |
JulesThuillier | 0:193d8168f903 | 95 | irled.write(0); |
JulesThuillier | 0:193d8168f903 | 96 | } |
JulesThuillier | 0:193d8168f903 | 97 | |
JulesThuillier | 1:bfd2fb3f5584 | 98 | |
JulesThuillier | 1:bfd2fb3f5584 | 99 | /* |
JulesThuillier | 1:bfd2fb3f5584 | 100 | * Renvoie le dernier signal IR |
JulesThuillier | 1:bfd2fb3f5584 | 101 | */ |
JulesThuillier | 1:bfd2fb3f5584 | 102 | void repeat() |
JulesThuillier | 1:bfd2fb3f5584 | 103 | { |
JulesThuillier | 3:a491b09cfd3b | 104 | if(sendBuffer[0] != 0) |
JulesThuillier | 3:a491b09cfd3b | 105 | { |
JulesThuillier | 3:a491b09cfd3b | 106 | sendIR(sendBuffer); |
JulesThuillier | 3:a491b09cfd3b | 107 | } |
JulesThuillier | 3:a491b09cfd3b | 108 | } |
JulesThuillier | 3:a491b09cfd3b | 109 | |
JulesThuillier | 3:a491b09cfd3b | 110 | void prepareForReception() |
JulesThuillier | 3:a491b09cfd3b | 111 | { |
JulesThuillier | 3:a491b09cfd3b | 112 | for(int i=0; i<100; i++) |
JulesThuillier | 3:a491b09cfd3b | 113 | { |
JulesThuillier | 3:a491b09cfd3b | 114 | sendBuffer[i] = 0; |
JulesThuillier | 3:a491b09cfd3b | 115 | } |
JulesThuillier | 1:bfd2fb3f5584 | 116 | } |
JulesThuillier | 1:bfd2fb3f5584 | 117 | |
JulesThuillier | 1:bfd2fb3f5584 | 118 | |
JulesThuillier | 0:193d8168f903 | 119 | /* Set the IR frequency |
JulesThuillier | 0:193d8168f903 | 120 | * Param : frequency in Kilohertz |
JulesThuillier | 0:193d8168f903 | 121 | */ |
JulesThuillier | 0:193d8168f903 | 122 | void setFrequency(int freq) |
JulesThuillier | 0:193d8168f903 | 123 | { |
JulesThuillier | 2:61e196a0eaf2 | 124 | DEBUG("Frequency : %d\r\n", freq); |
JulesThuillier | 0:193d8168f903 | 125 | uint8_t period = 1000/freq; |
JulesThuillier | 0:193d8168f903 | 126 | irled.period_us(period); |
JulesThuillier | 0:193d8168f903 | 127 | } |
JulesThuillier | 0:193d8168f903 | 128 | |
JulesThuillier | 1:bfd2fb3f5584 | 129 | |
JulesThuillier | 1:bfd2fb3f5584 | 130 | // Vide le buffer dont l'index est passe en parametre |
JulesThuillier | 1:bfd2fb3f5584 | 131 | void clearBuffer(int index) |
JulesThuillier | 1:bfd2fb3f5584 | 132 | { |
JulesThuillier | 1:bfd2fb3f5584 | 133 | for(int j=0; j<100;j++){ |
JulesThuillier | 1:bfd2fb3f5584 | 134 | recordBuffers[index][j] = 0; |
JulesThuillier | 1:bfd2fb3f5584 | 135 | } |
JulesThuillier | 1:bfd2fb3f5584 | 136 | } |
JulesThuillier | 1:bfd2fb3f5584 | 137 | |
JulesThuillier | 1:bfd2fb3f5584 | 138 | |
JulesThuillier | 0:193d8168f903 | 139 | // Vide tous les buffers |
JulesThuillier | 0:193d8168f903 | 140 | void clearBuffers() |
JulesThuillier | 0:193d8168f903 | 141 | { |
JulesThuillier | 0:193d8168f903 | 142 | for(int j=0; j<3;j++){ |
JulesThuillier | 0:193d8168f903 | 143 | clearBuffer(j); |
JulesThuillier | 0:193d8168f903 | 144 | } |
JulesThuillier | 0:193d8168f903 | 145 | } |
JulesThuillier | 0:193d8168f903 | 146 | |
JulesThuillier | 0:193d8168f903 | 147 | |
JulesThuillier | 0:193d8168f903 | 148 | void disconnect() |
JulesThuillier | 0:193d8168f903 | 149 | { |
JulesThuillier | 0:193d8168f903 | 150 | DEBUG("Shutting down\r\n"); |
JulesThuillier | 0:193d8168f903 | 151 | |
JulesThuillier | 0:193d8168f903 | 152 | // Arrete le timer |
JulesThuillier | 0:193d8168f903 | 153 | timer.stop(); |
JulesThuillier | 0:193d8168f903 | 154 | |
JulesThuillier | 0:193d8168f903 | 155 | |
JulesThuillier | 0:193d8168f903 | 156 | // Supprime l'appel toutes les 1 secondes |
JulesThuillier | 0:193d8168f903 | 157 | ticker.detach(); |
JulesThuillier | 0:193d8168f903 | 158 | |
JulesThuillier | 0:193d8168f903 | 159 | Gap::DisconnectionReason_t myreason; |
JulesThuillier | 0:193d8168f903 | 160 | ble.disconnect(myreason); |
JulesThuillier | 0:193d8168f903 | 161 | |
JulesThuillier | 0:193d8168f903 | 162 | currentState = OFF; |
JulesThuillier | 0:193d8168f903 | 163 | } |
JulesThuillier | 0:193d8168f903 | 164 | |
JulesThuillier | 0:193d8168f903 | 165 | uint8_t getBattery() |
JulesThuillier | 0:193d8168f903 | 166 | { |
JulesThuillier | 0:193d8168f903 | 167 | // Configure ADC |
JulesThuillier | 0:193d8168f903 | 168 | NRF_ADC->CONFIG = (ADC_CONFIG_RES_8bit << ADC_CONFIG_RES_Pos) | |
JulesThuillier | 0:193d8168f903 | 169 | (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) | |
JulesThuillier | 0:193d8168f903 | 170 | (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) | |
JulesThuillier | 0:193d8168f903 | 171 | (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) | |
JulesThuillier | 0:193d8168f903 | 172 | (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos); |
JulesThuillier | 0:193d8168f903 | 173 | NRF_ADC->EVENTS_END = 0; |
JulesThuillier | 0:193d8168f903 | 174 | NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled; |
JulesThuillier | 0:193d8168f903 | 175 | |
JulesThuillier | 0:193d8168f903 | 176 | NRF_ADC->EVENTS_END = 0; // Stop any running conversions. |
JulesThuillier | 0:193d8168f903 | 177 | NRF_ADC->TASKS_START = 1; |
JulesThuillier | 0:193d8168f903 | 178 | |
JulesThuillier | 0:193d8168f903 | 179 | while (!NRF_ADC->EVENTS_END) |
JulesThuillier | 0:193d8168f903 | 180 | { |
JulesThuillier | 0:193d8168f903 | 181 | } |
JulesThuillier | 0:193d8168f903 | 182 | |
JulesThuillier | 0:193d8168f903 | 183 | uint16_t vbg_in_mv = 1200; |
JulesThuillier | 0:193d8168f903 | 184 | uint8_t adc_max = 255; |
JulesThuillier | 0:193d8168f903 | 185 | uint16_t vbat_current_in_mv = (NRF_ADC->RESULT * 3 * vbg_in_mv) / adc_max; |
JulesThuillier | 0:193d8168f903 | 186 | |
JulesThuillier | 0:193d8168f903 | 187 | NRF_ADC->EVENTS_END = 0; |
JulesThuillier | 0:193d8168f903 | 188 | NRF_ADC->TASKS_STOP = 1; |
JulesThuillier | 0:193d8168f903 | 189 | |
JulesThuillier | 0:193d8168f903 | 190 | return (uint8_t) ((vbat_current_in_mv * 100) / 3700); |
JulesThuillier | 0:193d8168f903 | 191 | |
JulesThuillier | 0:193d8168f903 | 192 | // return 12; |
JulesThuillier | 0:193d8168f903 | 193 | } |
JulesThuillier | 0:193d8168f903 | 194 | |
JulesThuillier | 0:193d8168f903 | 195 | |
JulesThuillier | 0:193d8168f903 | 196 | // Fontion appelé toutes les 1 secondes lorsque le telephoen est connecté |
JulesThuillier | 0:193d8168f903 | 197 | void periodicCallback(void) |
JulesThuillier | 0:193d8168f903 | 198 | { |
JulesThuillier | 0:193d8168f903 | 199 | // uint8_t batt = getBattery(); |
JulesThuillier | 0:193d8168f903 | 200 | // uint8_t batt = 42; |
JulesThuillier | 0:193d8168f903 | 201 | // DEBUG("Periodic Callback \n\r"); |
JulesThuillier | 0:193d8168f903 | 202 | //if (battServicePtr != NULL) |
JulesThuillier | 0:193d8168f903 | 203 | // battServicePtr->updateBatteryLevel(batt); |
JulesThuillier | 0:193d8168f903 | 204 | // DEBUG("Battery : %d \n\r", batt); |
JulesThuillier | 0:193d8168f903 | 205 | |
JulesThuillier | 0:193d8168f903 | 206 | } |
JulesThuillier | 0:193d8168f903 | 207 | // Callback appelé en cas de deconnection |
JulesThuillier | 0:193d8168f903 | 208 | void onDisconnection(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
JulesThuillier | 0:193d8168f903 | 209 | { |
JulesThuillier | 0:193d8168f903 | 210 | DEBUG("Disconnected \n\r"); |
JulesThuillier | 0:193d8168f903 | 211 | |
JulesThuillier | 0:193d8168f903 | 212 | if(currentState != OFF) |
JulesThuillier | 0:193d8168f903 | 213 | { |
JulesThuillier | 0:193d8168f903 | 214 | // printf("Restarting the advertising process\n\r"); |
JulesThuillier | 0:193d8168f903 | 215 | ble.startAdvertising(); |
JulesThuillier | 0:193d8168f903 | 216 | currentState = DISCONNECTED; |
JulesThuillier | 0:193d8168f903 | 217 | } |
JulesThuillier | 0:193d8168f903 | 218 | |
JulesThuillier | 0:193d8168f903 | 219 | switch (reason) { |
JulesThuillier | 0:193d8168f903 | 220 | case Gap::REMOTE_USER_TERMINATED_CONNECTION: |
JulesThuillier | 0:193d8168f903 | 221 | DEBUG("Disconnected (REMOTE_USER_TERMINATED_CONNECTION)\n\r"); |
JulesThuillier | 0:193d8168f903 | 222 | break; |
JulesThuillier | 0:193d8168f903 | 223 | case Gap::LOCAL_HOST_TERMINATED_CONNECTION: |
JulesThuillier | 0:193d8168f903 | 224 | DEBUG("Disconnected (LOCAL_HOST_TERMINATED_CONNECTION)\n\r"); |
JulesThuillier | 0:193d8168f903 | 225 | break; |
JulesThuillier | 0:193d8168f903 | 226 | case Gap::CONN_INTERVAL_UNACCEPTABLE: |
JulesThuillier | 0:193d8168f903 | 227 | DEBUG("Disconnected (CONN_INTERVAL_UNACCEPTABLE)\n\r"); |
JulesThuillier | 0:193d8168f903 | 228 | break; |
JulesThuillier | 0:193d8168f903 | 229 | } |
JulesThuillier | 0:193d8168f903 | 230 | |
JulesThuillier | 0:193d8168f903 | 231 | } |
JulesThuillier | 0:193d8168f903 | 232 | |
JulesThuillier | 0:193d8168f903 | 233 | // Callback appelé lorsque la connection est etablie |
JulesThuillier | 0:193d8168f903 | 234 | void onConnection(Gap::Handle_t handle, Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr, const Gap::ConnectionParams_t *param) |
JulesThuillier | 0:193d8168f903 | 235 | { |
JulesThuillier | 0:193d8168f903 | 236 | DEBUG("Connected\n\r"); |
JulesThuillier | 0:193d8168f903 | 237 | currentState = CONNECTED; |
JulesThuillier | 0:193d8168f903 | 238 | } |
JulesThuillier | 0:193d8168f903 | 239 | |
JulesThuillier | 0:193d8168f903 | 240 | |
JulesThuillier | 0:193d8168f903 | 241 | // Callback appelé lorsque l'advertising arrive a son timeout avant que la connexion ait été établie |
JulesThuillier | 0:193d8168f903 | 242 | void onTimeout() |
JulesThuillier | 0:193d8168f903 | 243 | { |
JulesThuillier | 0:193d8168f903 | 244 | DEBUG("Timeout \n\r"); |
JulesThuillier | 0:193d8168f903 | 245 | disconnect(); |
JulesThuillier | 0:193d8168f903 | 246 | } |
JulesThuillier | 0:193d8168f903 | 247 | |
JulesThuillier | 0:193d8168f903 | 248 | |
JulesThuillier | 0:193d8168f903 | 249 | void sendUART(char *data, int size) |
JulesThuillier | 0:193d8168f903 | 250 | { |
JulesThuillier | 0:193d8168f903 | 251 | uint8_t buf[size]; |
JulesThuillier | 0:193d8168f903 | 252 | for(int i=0; i< size; i++) |
JulesThuillier | 0:193d8168f903 | 253 | { |
JulesThuillier | 0:193d8168f903 | 254 | buf[i] = (uint8_t)data[i]; |
JulesThuillier | 0:193d8168f903 | 255 | } |
JulesThuillier | 0:193d8168f903 | 256 | ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), buf, size); |
JulesThuillier | 0:193d8168f903 | 257 | } |
JulesThuillier | 0:193d8168f903 | 258 | |
JulesThuillier | 0:193d8168f903 | 259 | |
JulesThuillier | 0:193d8168f903 | 260 | // Callback appelé lorsque le service uart recoit des données |
JulesThuillier | 0:193d8168f903 | 261 | void receiveUART(const GattCharacteristicWriteCBParams *params) |
JulesThuillier | 0:193d8168f903 | 262 | { |
JulesThuillier | 0:193d8168f903 | 263 | if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) { |
JulesThuillier | 0:193d8168f903 | 264 | uint16_t bytesRead = params->len; |
JulesThuillier | 0:193d8168f903 | 265 | |
JulesThuillier | 0:193d8168f903 | 266 | DEBUG("Data received : %*s\n\r", params->len, params->data); |
JulesThuillier | 3:a491b09cfd3b | 267 | DEBUG("Data length : %d\n\r", bytesRead); |
JulesThuillier | 0:193d8168f903 | 268 | |
JulesThuillier | 2:61e196a0eaf2 | 269 | // get all the data in one array |
JulesThuillier | 2:61e196a0eaf2 | 270 | uint8_t buf[bytesRead]; |
JulesThuillier | 2:61e196a0eaf2 | 271 | uint16_t split = bytesRead; |
JulesThuillier | 2:61e196a0eaf2 | 272 | for(int i=0; i< bytesRead; i++) |
JulesThuillier | 0:193d8168f903 | 273 | { |
JulesThuillier | 2:61e196a0eaf2 | 274 | buf[i] = params->data[i]; |
JulesThuillier | 2:61e196a0eaf2 | 275 | if((char)buf[i] == ':' ) |
JulesThuillier | 2:61e196a0eaf2 | 276 | { |
JulesThuillier | 2:61e196a0eaf2 | 277 | DEBUG("Split at %u\n\r", i); |
JulesThuillier | 2:61e196a0eaf2 | 278 | split = i; |
JulesThuillier | 2:61e196a0eaf2 | 279 | } |
JulesThuillier | 2:61e196a0eaf2 | 280 | } |
JulesThuillier | 2:61e196a0eaf2 | 281 | char option[split]; |
JulesThuillier | 2:61e196a0eaf2 | 282 | char arg[bytesRead - (split+1)]; |
JulesThuillier | 2:61e196a0eaf2 | 283 | |
JulesThuillier | 2:61e196a0eaf2 | 284 | // split array to get option |
JulesThuillier | 2:61e196a0eaf2 | 285 | for(int i=0; i< split; i++) |
JulesThuillier | 2:61e196a0eaf2 | 286 | { |
JulesThuillier | 2:61e196a0eaf2 | 287 | option[i] = buf[i]; |
JulesThuillier | 2:61e196a0eaf2 | 288 | } |
JulesThuillier | 2:61e196a0eaf2 | 289 | |
JulesThuillier | 2:61e196a0eaf2 | 290 | // split array to get argument |
JulesThuillier | 2:61e196a0eaf2 | 291 | if(split<bytesRead) |
JulesThuillier | 2:61e196a0eaf2 | 292 | { |
JulesThuillier | 2:61e196a0eaf2 | 293 | for(int i=split+1; i < bytesRead; i++) |
JulesThuillier | 0:193d8168f903 | 294 | { |
JulesThuillier | 2:61e196a0eaf2 | 295 | arg[i-(split+1)] = buf[i]; |
JulesThuillier | 0:193d8168f903 | 296 | } |
JulesThuillier | 0:193d8168f903 | 297 | |
JulesThuillier | 0:193d8168f903 | 298 | } |
JulesThuillier | 0:193d8168f903 | 299 | |
JulesThuillier | 3:a491b09cfd3b | 300 | // Get ready to receive the datas to send |
JulesThuillier | 3:a491b09cfd3b | 301 | if(strncmp(option, "send", split) == 0) |
JulesThuillier | 3:a491b09cfd3b | 302 | { |
JulesThuillier | 3:a491b09cfd3b | 303 | |
JulesThuillier | 3:a491b09cfd3b | 304 | prepareForReception(); |
JulesThuillier | 3:a491b09cfd3b | 305 | sendBuffer[0] = char_to_int(arg); |
JulesThuillier | 3:a491b09cfd3b | 306 | receivingDatas = true; |
JulesThuillier | 3:a491b09cfd3b | 307 | DEBUG("Receiving datas\r\n"); |
JulesThuillier | 3:a491b09cfd3b | 308 | } |
JulesThuillier | 3:a491b09cfd3b | 309 | |
JulesThuillier | 3:a491b09cfd3b | 310 | |
JulesThuillier | 2:61e196a0eaf2 | 311 | // Set the frequency |
JulesThuillier | 3:a491b09cfd3b | 312 | else if(strncmp(option, "setfreq", split) == 0) |
JulesThuillier | 2:61e196a0eaf2 | 313 | { |
JulesThuillier | 2:61e196a0eaf2 | 314 | setFrequency(char_to_int(arg)); |
JulesThuillier | 0:193d8168f903 | 315 | } |
JulesThuillier | 3:a491b09cfd3b | 316 | |
JulesThuillier | 3:a491b09cfd3b | 317 | // Repeat the last emission |
JulesThuillier | 3:a491b09cfd3b | 318 | else if(strncmp(option, "repeat", split) == 0) |
JulesThuillier | 3:a491b09cfd3b | 319 | { |
JulesThuillier | 3:a491b09cfd3b | 320 | repeat(); |
JulesThuillier | 3:a491b09cfd3b | 321 | } |
JulesThuillier | 3:a491b09cfd3b | 322 | |
JulesThuillier | 3:a491b09cfd3b | 323 | |
JulesThuillier | 3:a491b09cfd3b | 324 | else if(receivingDatas) |
JulesThuillier | 3:a491b09cfd3b | 325 | { |
JulesThuillier | 3:a491b09cfd3b | 326 | int duration = char_to_int(option); |
JulesThuillier | 3:a491b09cfd3b | 327 | DEBUG("data : %u\r\n", duration); |
JulesThuillier | 3:a491b09cfd3b | 328 | |
JulesThuillier | 3:a491b09cfd3b | 329 | if(duration != 0) |
JulesThuillier | 3:a491b09cfd3b | 330 | { |
JulesThuillier | 3:a491b09cfd3b | 331 | sendBufferIndex++; |
JulesThuillier | 3:a491b09cfd3b | 332 | sendBuffer[sendBufferIndex] = duration; |
JulesThuillier | 3:a491b09cfd3b | 333 | |
JulesThuillier | 3:a491b09cfd3b | 334 | if(sendBufferIndex == sendBuffer[0]-1) |
JulesThuillier | 3:a491b09cfd3b | 335 | { |
JulesThuillier | 3:a491b09cfd3b | 336 | DEBUG("Reception Over\r\n"); |
JulesThuillier | 3:a491b09cfd3b | 337 | receivingDatas = false; |
JulesThuillier | 3:a491b09cfd3b | 338 | } |
JulesThuillier | 3:a491b09cfd3b | 339 | } |
JulesThuillier | 3:a491b09cfd3b | 340 | else { |
JulesThuillier | 3:a491b09cfd3b | 341 | sendUART("FAIL:send", 9); |
JulesThuillier | 3:a491b09cfd3b | 342 | DEBUG("FAIL:send\r\n"); |
JulesThuillier | 3:a491b09cfd3b | 343 | receivingDatas = false; |
JulesThuillier | 3:a491b09cfd3b | 344 | |
JulesThuillier | 3:a491b09cfd3b | 345 | } |
JulesThuillier | 3:a491b09cfd3b | 346 | } |
JulesThuillier | 3:a491b09cfd3b | 347 | else |
JulesThuillier | 3:a491b09cfd3b | 348 | { |
JulesThuillier | 3:a491b09cfd3b | 349 | DEBUG("UNPARSED : %s\r\n", option); |
JulesThuillier | 3:a491b09cfd3b | 350 | } |
JulesThuillier | 0:193d8168f903 | 351 | } |
JulesThuillier | 0:193d8168f903 | 352 | } |
JulesThuillier | 0:193d8168f903 | 353 | |
JulesThuillier | 0:193d8168f903 | 354 | |
JulesThuillier | 0:193d8168f903 | 355 | |
JulesThuillier | 0:193d8168f903 | 356 | void recordFinished() |
JulesThuillier | 0:193d8168f903 | 357 | { |
JulesThuillier | 0:193d8168f903 | 358 | timerUp.reset(); |
JulesThuillier | 0:193d8168f903 | 359 | timerDown.reset(); |
JulesThuillier | 0:193d8168f903 | 360 | indexi = 0; |
JulesThuillier | 0:193d8168f903 | 361 | indexj = 0; |
JulesThuillier | 0:193d8168f903 | 362 | DEBUG("Record is over\r\n"); |
JulesThuillier | 0:193d8168f903 | 363 | for(int i=0; i<100; i++) |
JulesThuillier | 0:193d8168f903 | 364 | DEBUG("%d - ",recordBuffers[0][i]); |
JulesThuillier | 0:193d8168f903 | 365 | DEBUG("\r\n"); |
JulesThuillier | 0:193d8168f903 | 366 | for(int i=0; i<100; i++) |
JulesThuillier | 0:193d8168f903 | 367 | DEBUG("%d - ",recordBuffers[1][i]); |
JulesThuillier | 0:193d8168f903 | 368 | DEBUG("\r\n"); |
JulesThuillier | 0:193d8168f903 | 369 | |
JulesThuillier | 0:193d8168f903 | 370 | } |
JulesThuillier | 0:193d8168f903 | 371 | |
JulesThuillier | 0:193d8168f903 | 372 | void irFall() |
JulesThuillier | 0:193d8168f903 | 373 | { |
JulesThuillier | 2:61e196a0eaf2 | 374 | // Arrete le timer |
JulesThuillier | 2:61e196a0eaf2 | 375 | timerUp.stop(); |
JulesThuillier | 2:61e196a0eaf2 | 376 | |
JulesThuillier | 2:61e196a0eaf2 | 377 | timerDown.reset(); |
JulesThuillier | 2:61e196a0eaf2 | 378 | timerDown.start(); |
JulesThuillier | 2:61e196a0eaf2 | 379 | |
JulesThuillier | 2:61e196a0eaf2 | 380 | // Demarrage du timer de shutdown; |
JulesThuillier | 2:61e196a0eaf2 | 381 | recordOffTimer.attach_us(&recordFinished, RECORD_OFF_TIMER); |
JulesThuillier | 2:61e196a0eaf2 | 382 | if(indexj<100 && indexi <3) |
JulesThuillier | 2:61e196a0eaf2 | 383 | recordBuffers[indexi][indexj] = timerUp.read_us(); |
JulesThuillier | 2:61e196a0eaf2 | 384 | indexj++; |
JulesThuillier | 0:193d8168f903 | 385 | } |
JulesThuillier | 0:193d8168f903 | 386 | |
JulesThuillier | 0:193d8168f903 | 387 | void irRise() |
JulesThuillier | 0:193d8168f903 | 388 | { |
JulesThuillier | 2:61e196a0eaf2 | 389 | timerDown.stop(); |
JulesThuillier | 2:61e196a0eaf2 | 390 | |
JulesThuillier | 2:61e196a0eaf2 | 391 | timerUp.reset(); |
JulesThuillier | 2:61e196a0eaf2 | 392 | timerUp.start(); |
JulesThuillier | 2:61e196a0eaf2 | 393 | |
JulesThuillier | 2:61e196a0eaf2 | 394 | // Supprime le shutdown timer |
JulesThuillier | 2:61e196a0eaf2 | 395 | recordOffTimer.detach(); |
JulesThuillier | 2:61e196a0eaf2 | 396 | if(indexj<100 && indexi <3) |
JulesThuillier | 2:61e196a0eaf2 | 397 | recordBuffers[indexi][indexj] = timerDown.read_us(); |
JulesThuillier | 2:61e196a0eaf2 | 398 | indexj++; |
JulesThuillier | 0:193d8168f903 | 399 | } |
JulesThuillier | 0:193d8168f903 | 400 | |
JulesThuillier | 0:193d8168f903 | 401 | |
JulesThuillier | 0:193d8168f903 | 402 | void initIRInterrupt(PinName pin) |
JulesThuillier | 0:193d8168f903 | 403 | { |
JulesThuillier | 0:193d8168f903 | 404 | // Interruption sur le bouton |
JulesThuillier | 0:193d8168f903 | 405 | InterruptIn *interruption; |
JulesThuillier | 0:193d8168f903 | 406 | |
JulesThuillier | 0:193d8168f903 | 407 | // Initalize interruption |
JulesThuillier | 0:193d8168f903 | 408 | interruption = new InterruptIn(pin); |
JulesThuillier | 0:193d8168f903 | 409 | |
JulesThuillier | 0:193d8168f903 | 410 | if(NRF51822) |
JulesThuillier | 0:193d8168f903 | 411 | { |
JulesThuillier | 0:193d8168f903 | 412 | interruption->rise(irRise); |
JulesThuillier | 0:193d8168f903 | 413 | interruption->fall(irFall); |
JulesThuillier | 0:193d8168f903 | 414 | } |
JulesThuillier | 0:193d8168f903 | 415 | else |
JulesThuillier | 0:193d8168f903 | 416 | { |
JulesThuillier | 0:193d8168f903 | 417 | interruption->fall(irRise); |
JulesThuillier | 0:193d8168f903 | 418 | interruption->rise(irFall); |
JulesThuillier | 0:193d8168f903 | 419 | } |
JulesThuillier | 0:193d8168f903 | 420 | } |
JulesThuillier | 0:193d8168f903 | 421 | |
JulesThuillier | 0:193d8168f903 | 422 | |
JulesThuillier | 0:193d8168f903 | 423 | int main() { |
JulesThuillier | 0:193d8168f903 | 424 | /* |
JulesThuillier | 0:193d8168f903 | 425 | NRF_CLOCK->TASKS_LFCLKSTOP = 1; |
JulesThuillier | 0:193d8168f903 | 426 | NRF_CLOCK->LFCLKSRC = 2; // 0 = RC, 1 = XTAL, 2 = SYNTH |
JulesThuillier | 0:193d8168f903 | 427 | NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; |
JulesThuillier | 0:193d8168f903 | 428 | NRF_CLOCK->TASKS_LFCLKSTART = 1; |
JulesThuillier | 0:193d8168f903 | 429 | while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0){} |
JulesThuillier | 0:193d8168f903 | 430 | NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; |
JulesThuillier | 0:193d8168f903 | 431 | */ |
JulesThuillier | 1:bfd2fb3f5584 | 432 | |
JulesThuillier | 0:193d8168f903 | 433 | irled.period_us(26); |
JulesThuillier | 0:193d8168f903 | 434 | // irled.write(0.33f); |
JulesThuillier | 0:193d8168f903 | 435 | |
JulesThuillier | 0:193d8168f903 | 436 | DEBUG("Hello world\r\n"); |
JulesThuillier | 0:193d8168f903 | 437 | |
JulesThuillier | 0:193d8168f903 | 438 | // Demarre l'appel periodique toutes les 1 seconde |
JulesThuillier | 0:193d8168f903 | 439 | ticker.attach(periodicCallback, 1.0f); |
JulesThuillier | 0:193d8168f903 | 440 | |
JulesThuillier | 0:193d8168f903 | 441 | initIRInterrupt(ir); |
JulesThuillier | 0:193d8168f903 | 442 | |
JulesThuillier | 0:193d8168f903 | 443 | DEBUG("Fin interrupt Set\r\n"); |
JulesThuillier | 0:193d8168f903 | 444 | // Initialisation et set des callback |
JulesThuillier | 0:193d8168f903 | 445 | ble.init(); |
JulesThuillier | 0:193d8168f903 | 446 | ble.reset(); |
JulesThuillier | 0:193d8168f903 | 447 | ble.onDisconnection(onDisconnection); |
JulesThuillier | 0:193d8168f903 | 448 | ble.onDataWritten(receiveUART); |
JulesThuillier | 0:193d8168f903 | 449 | ble.onConnection(onConnection); |
JulesThuillier | 0:193d8168f903 | 450 | ble.onTimeout(onTimeout); |
JulesThuillier | 0:193d8168f903 | 451 | |
JulesThuillier | 0:193d8168f903 | 452 | /***************************************** |
JulesThuillier | 0:193d8168f903 | 453 | ********** AJOUT DES SERVICES ************ |
JulesThuillier | 0:193d8168f903 | 454 | *****************************************/ |
JulesThuillier | 0:193d8168f903 | 455 | |
JulesThuillier | 0:193d8168f903 | 456 | // Creation du service UART |
JulesThuillier | 0:193d8168f903 | 457 | UARTService uartService(ble); |
JulesThuillier | 0:193d8168f903 | 458 | uartServicePtr = &uartService; |
JulesThuillier | 0:193d8168f903 | 459 | // uartService.retargetStdout(); // renvoie la sortie printf sur l'UART |
JulesThuillier | 0:193d8168f903 | 460 | // Creation du battery service |
JulesThuillier | 0:193d8168f903 | 461 | BatteryService battery(ble); |
JulesThuillier | 0:193d8168f903 | 462 | battServicePtr = &battery; |
JulesThuillier | 0:193d8168f903 | 463 | |
JulesThuillier | 0:193d8168f903 | 464 | // Creation du DFU service |
JulesThuillier | 0:193d8168f903 | 465 | DFUService dfu(ble); |
JulesThuillier | 0:193d8168f903 | 466 | |
JulesThuillier | 0:193d8168f903 | 467 | // Creation du device information service |
JulesThuillier | 0:193d8168f903 | 468 | DeviceInformationService deviceInfo(ble, DEVICE_NAME, "OldRemote", "SN1", "hw-rev1", "fw-rev1", "soft-rev1"); |
JulesThuillier | 0:193d8168f903 | 469 | |
JulesThuillier | 0:193d8168f903 | 470 | |
JulesThuillier | 0:193d8168f903 | 471 | // Setup advertising |
JulesThuillier | 0:193d8168f903 | 472 | static const uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE, GattService::UUID_DEVICE_INFORMATION_SERVICE}; |
JulesThuillier | 0:193d8168f903 | 473 | |
JulesThuillier | 0:193d8168f903 | 474 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
JulesThuillier | 0:193d8168f903 | 475 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
JulesThuillier | 0:193d8168f903 | 476 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,(const uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME) - 1); |
JulesThuillier | 0:193d8168f903 | 477 | ble.accumulateAdvertisingPayload(GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS,(const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
JulesThuillier | 0:193d8168f903 | 478 | ble.accumulateAdvertisingPayload(GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); |
JulesThuillier | 0:193d8168f903 | 479 | ble.setAdvertisingInterval(ADV_INTERVAL); /* 100ms; in multiples of 0.625ms. */ |
JulesThuillier | 0:193d8168f903 | 480 | // ble.setAdvertisingTimeout(ADV_TIMEOUT); /* in seconds */ |
JulesThuillier | 0:193d8168f903 | 481 | ble.startAdvertising(); |
JulesThuillier | 0:193d8168f903 | 482 | |
JulesThuillier | 0:193d8168f903 | 483 | currentState = ADVERTISING; |
JulesThuillier | 0:193d8168f903 | 484 | |
JulesThuillier | 0:193d8168f903 | 485 | DEBUG("Initialisation done\r\n"); |
JulesThuillier | 0:193d8168f903 | 486 | |
JulesThuillier | 0:193d8168f903 | 487 | while (true) { |
JulesThuillier | 0:193d8168f903 | 488 | ble.waitForEvent(); |
JulesThuillier | 0:193d8168f903 | 489 | |
JulesThuillier | 0:193d8168f903 | 490 | } |
JulesThuillier | 0:193d8168f903 | 491 | } |