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:43:09 2015 +0000
Revision:
4:688a955562ad
Parent:
3:a491b09cfd3b
send OK

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