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

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?

UserRevisionLine numberNew 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 }