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 07:21:43 2015 +0000
Revision:
2:61e196a0eaf2
Parent:
1:bfd2fb3f5584
Child:
3:a491b09cfd3b
parsing uart 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 2:61e196a0eaf2 42 enum commands {RECORD=0, SEND=1, SENDSIZE=2, REPEAT=3};
JulesThuillier 0:193d8168f903 43
JulesThuillier 0:193d8168f903 44
JulesThuillier 0:193d8168f903 45 // Timer pour connaitre la duree de l'enfoncement
JulesThuillier 0:193d8168f903 46 Timer timer;
JulesThuillier 0:193d8168f903 47 Timer timerUp;
JulesThuillier 0:193d8168f903 48 Timer timerDown;
JulesThuillier 0:193d8168f903 49 Timeout recordOffTimer;
JulesThuillier 0:193d8168f903 50
JulesThuillier 0:193d8168f903 51 // Ticker pour un reveil toutes ls 1 secondes
JulesThuillier 0:193d8168f903 52 Ticker ticker;
JulesThuillier 0:193d8168f903 53 bool startPeriodick = false;
JulesThuillier 0:193d8168f903 54 // Turn the device off
JulesThuillier 0:193d8168f903 55
JulesThuillier 0:193d8168f903 56 uint16_t recordBuffers [3][100];
JulesThuillier 0:193d8168f903 57 uint8_t indexi = 0, indexj = 0;
JulesThuillier 0:193d8168f903 58
JulesThuillier 1:bfd2fb3f5584 59 uint16_t sendBuffer [100];
JulesThuillier 1:bfd2fb3f5584 60 uint8_t sendBufferSize = 0;
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 1:bfd2fb3f5584 77 void sendIR(uint16_t *data, uint8_t size)
JulesThuillier 0:193d8168f903 78 {
JulesThuillier 0:193d8168f903 79
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 1:bfd2fb3f5584 105 sendIR(sendBuffer, sendBufferSize);
JulesThuillier 1:bfd2fb3f5584 106 }
JulesThuillier 1:bfd2fb3f5584 107
JulesThuillier 1:bfd2fb3f5584 108
JulesThuillier 0:193d8168f903 109 /* Set the IR frequency
JulesThuillier 0:193d8168f903 110 * Param : frequency in Kilohertz
JulesThuillier 0:193d8168f903 111 */
JulesThuillier 0:193d8168f903 112 void setFrequency(int freq)
JulesThuillier 0:193d8168f903 113 {
JulesThuillier 2:61e196a0eaf2 114 DEBUG("Frequency : %d\r\n", freq);
JulesThuillier 0:193d8168f903 115 uint8_t period = 1000/freq;
JulesThuillier 0:193d8168f903 116 irled.period_us(period);
JulesThuillier 0:193d8168f903 117 }
JulesThuillier 0:193d8168f903 118
JulesThuillier 1:bfd2fb3f5584 119
JulesThuillier 1:bfd2fb3f5584 120 // Vide le buffer dont l'index est passe en parametre
JulesThuillier 1:bfd2fb3f5584 121 void clearBuffer(int index)
JulesThuillier 1:bfd2fb3f5584 122 {
JulesThuillier 1:bfd2fb3f5584 123 for(int j=0; j<100;j++){
JulesThuillier 1:bfd2fb3f5584 124 recordBuffers[index][j] = 0;
JulesThuillier 1:bfd2fb3f5584 125 }
JulesThuillier 1:bfd2fb3f5584 126 }
JulesThuillier 1:bfd2fb3f5584 127
JulesThuillier 1:bfd2fb3f5584 128
JulesThuillier 0:193d8168f903 129 // Vide tous les buffers
JulesThuillier 0:193d8168f903 130 void clearBuffers()
JulesThuillier 0:193d8168f903 131 {
JulesThuillier 0:193d8168f903 132 for(int j=0; j<3;j++){
JulesThuillier 0:193d8168f903 133 clearBuffer(j);
JulesThuillier 0:193d8168f903 134 }
JulesThuillier 0:193d8168f903 135 }
JulesThuillier 0:193d8168f903 136
JulesThuillier 0:193d8168f903 137
JulesThuillier 0:193d8168f903 138 void disconnect()
JulesThuillier 0:193d8168f903 139 {
JulesThuillier 0:193d8168f903 140 DEBUG("Shutting down\r\n");
JulesThuillier 0:193d8168f903 141
JulesThuillier 0:193d8168f903 142 // Arrete le timer
JulesThuillier 0:193d8168f903 143 timer.stop();
JulesThuillier 0:193d8168f903 144
JulesThuillier 0:193d8168f903 145
JulesThuillier 0:193d8168f903 146 // Supprime l'appel toutes les 1 secondes
JulesThuillier 0:193d8168f903 147 ticker.detach();
JulesThuillier 0:193d8168f903 148
JulesThuillier 0:193d8168f903 149 Gap::DisconnectionReason_t myreason;
JulesThuillier 0:193d8168f903 150 ble.disconnect(myreason);
JulesThuillier 0:193d8168f903 151
JulesThuillier 0:193d8168f903 152 currentState = OFF;
JulesThuillier 0:193d8168f903 153 }
JulesThuillier 0:193d8168f903 154
JulesThuillier 0:193d8168f903 155 uint8_t getBattery()
JulesThuillier 0:193d8168f903 156 {
JulesThuillier 0:193d8168f903 157 // Configure ADC
JulesThuillier 0:193d8168f903 158 NRF_ADC->CONFIG = (ADC_CONFIG_RES_8bit << ADC_CONFIG_RES_Pos) |
JulesThuillier 0:193d8168f903 159 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
JulesThuillier 0:193d8168f903 160 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
JulesThuillier 0:193d8168f903 161 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
JulesThuillier 0:193d8168f903 162 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
JulesThuillier 0:193d8168f903 163 NRF_ADC->EVENTS_END = 0;
JulesThuillier 0:193d8168f903 164 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
JulesThuillier 0:193d8168f903 165
JulesThuillier 0:193d8168f903 166 NRF_ADC->EVENTS_END = 0; // Stop any running conversions.
JulesThuillier 0:193d8168f903 167 NRF_ADC->TASKS_START = 1;
JulesThuillier 0:193d8168f903 168
JulesThuillier 0:193d8168f903 169 while (!NRF_ADC->EVENTS_END)
JulesThuillier 0:193d8168f903 170 {
JulesThuillier 0:193d8168f903 171 }
JulesThuillier 0:193d8168f903 172
JulesThuillier 0:193d8168f903 173 uint16_t vbg_in_mv = 1200;
JulesThuillier 0:193d8168f903 174 uint8_t adc_max = 255;
JulesThuillier 0:193d8168f903 175 uint16_t vbat_current_in_mv = (NRF_ADC->RESULT * 3 * vbg_in_mv) / adc_max;
JulesThuillier 0:193d8168f903 176
JulesThuillier 0:193d8168f903 177 NRF_ADC->EVENTS_END = 0;
JulesThuillier 0:193d8168f903 178 NRF_ADC->TASKS_STOP = 1;
JulesThuillier 0:193d8168f903 179
JulesThuillier 0:193d8168f903 180 return (uint8_t) ((vbat_current_in_mv * 100) / 3700);
JulesThuillier 0:193d8168f903 181
JulesThuillier 0:193d8168f903 182 // return 12;
JulesThuillier 0:193d8168f903 183 }
JulesThuillier 0:193d8168f903 184
JulesThuillier 0:193d8168f903 185
JulesThuillier 0:193d8168f903 186 // Fontion appelé toutes les 1 secondes lorsque le telephoen est connecté
JulesThuillier 0:193d8168f903 187 void periodicCallback(void)
JulesThuillier 0:193d8168f903 188 {
JulesThuillier 0:193d8168f903 189 // uint8_t batt = getBattery();
JulesThuillier 0:193d8168f903 190 // uint8_t batt = 42;
JulesThuillier 0:193d8168f903 191 // DEBUG("Periodic Callback \n\r");
JulesThuillier 0:193d8168f903 192 //if (battServicePtr != NULL)
JulesThuillier 0:193d8168f903 193 // battServicePtr->updateBatteryLevel(batt);
JulesThuillier 0:193d8168f903 194 // DEBUG("Battery : %d \n\r", batt);
JulesThuillier 0:193d8168f903 195
JulesThuillier 0:193d8168f903 196 }
JulesThuillier 0:193d8168f903 197 // Callback appelé en cas de deconnection
JulesThuillier 0:193d8168f903 198 void onDisconnection(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
JulesThuillier 0:193d8168f903 199 {
JulesThuillier 0:193d8168f903 200 DEBUG("Disconnected \n\r");
JulesThuillier 0:193d8168f903 201
JulesThuillier 0:193d8168f903 202 if(currentState != OFF)
JulesThuillier 0:193d8168f903 203 {
JulesThuillier 0:193d8168f903 204 // printf("Restarting the advertising process\n\r");
JulesThuillier 0:193d8168f903 205 ble.startAdvertising();
JulesThuillier 0:193d8168f903 206 currentState = DISCONNECTED;
JulesThuillier 0:193d8168f903 207 }
JulesThuillier 0:193d8168f903 208
JulesThuillier 0:193d8168f903 209 switch (reason) {
JulesThuillier 0:193d8168f903 210 case Gap::REMOTE_USER_TERMINATED_CONNECTION:
JulesThuillier 0:193d8168f903 211 DEBUG("Disconnected (REMOTE_USER_TERMINATED_CONNECTION)\n\r");
JulesThuillier 0:193d8168f903 212 break;
JulesThuillier 0:193d8168f903 213 case Gap::LOCAL_HOST_TERMINATED_CONNECTION:
JulesThuillier 0:193d8168f903 214 DEBUG("Disconnected (LOCAL_HOST_TERMINATED_CONNECTION)\n\r");
JulesThuillier 0:193d8168f903 215 break;
JulesThuillier 0:193d8168f903 216 case Gap::CONN_INTERVAL_UNACCEPTABLE:
JulesThuillier 0:193d8168f903 217 DEBUG("Disconnected (CONN_INTERVAL_UNACCEPTABLE)\n\r");
JulesThuillier 0:193d8168f903 218 break;
JulesThuillier 0:193d8168f903 219 }
JulesThuillier 0:193d8168f903 220
JulesThuillier 0:193d8168f903 221 }
JulesThuillier 0:193d8168f903 222
JulesThuillier 0:193d8168f903 223 // Callback appelé lorsque la connection est etablie
JulesThuillier 0:193d8168f903 224 void onConnection(Gap::Handle_t handle, Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr, const Gap::ConnectionParams_t *param)
JulesThuillier 0:193d8168f903 225 {
JulesThuillier 0:193d8168f903 226 DEBUG("Connected\n\r");
JulesThuillier 0:193d8168f903 227 currentState = CONNECTED;
JulesThuillier 0:193d8168f903 228 }
JulesThuillier 0:193d8168f903 229
JulesThuillier 0:193d8168f903 230
JulesThuillier 0:193d8168f903 231 // Callback appelé lorsque l'advertising arrive a son timeout avant que la connexion ait été établie
JulesThuillier 0:193d8168f903 232 void onTimeout()
JulesThuillier 0:193d8168f903 233 {
JulesThuillier 0:193d8168f903 234 DEBUG("Timeout \n\r");
JulesThuillier 0:193d8168f903 235 disconnect();
JulesThuillier 0:193d8168f903 236 }
JulesThuillier 0:193d8168f903 237
JulesThuillier 0:193d8168f903 238
JulesThuillier 0:193d8168f903 239 void sendUART(char *data, int size)
JulesThuillier 0:193d8168f903 240 {
JulesThuillier 0:193d8168f903 241 uint8_t buf[size];
JulesThuillier 0:193d8168f903 242 for(int i=0; i< size; i++)
JulesThuillier 0:193d8168f903 243 {
JulesThuillier 0:193d8168f903 244 buf[i] = (uint8_t)data[i];
JulesThuillier 0:193d8168f903 245 }
JulesThuillier 0:193d8168f903 246 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), buf, size);
JulesThuillier 0:193d8168f903 247 }
JulesThuillier 0:193d8168f903 248
JulesThuillier 0:193d8168f903 249
JulesThuillier 0:193d8168f903 250 // Callback appelé lorsque le service uart recoit des données
JulesThuillier 0:193d8168f903 251 void receiveUART(const GattCharacteristicWriteCBParams *params)
JulesThuillier 0:193d8168f903 252 {
JulesThuillier 0:193d8168f903 253 if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) {
JulesThuillier 0:193d8168f903 254 uint16_t bytesRead = params->len;
JulesThuillier 0:193d8168f903 255
JulesThuillier 0:193d8168f903 256 DEBUG("Data received : %*s\n\r", params->len, params->data);
JulesThuillier 0:193d8168f903 257
JulesThuillier 2:61e196a0eaf2 258 // get all the data in one array
JulesThuillier 2:61e196a0eaf2 259 uint8_t buf[bytesRead];
JulesThuillier 2:61e196a0eaf2 260 uint16_t split = bytesRead;
JulesThuillier 2:61e196a0eaf2 261 for(int i=0; i< bytesRead; i++)
JulesThuillier 0:193d8168f903 262 {
JulesThuillier 2:61e196a0eaf2 263 buf[i] = params->data[i];
JulesThuillier 2:61e196a0eaf2 264 if((char)buf[i] == ':' )
JulesThuillier 2:61e196a0eaf2 265 {
JulesThuillier 2:61e196a0eaf2 266 DEBUG("Split at %u\n\r", i);
JulesThuillier 2:61e196a0eaf2 267 split = i;
JulesThuillier 2:61e196a0eaf2 268 }
JulesThuillier 2:61e196a0eaf2 269 }
JulesThuillier 2:61e196a0eaf2 270 char option[split];
JulesThuillier 2:61e196a0eaf2 271 char arg[bytesRead - (split+1)];
JulesThuillier 2:61e196a0eaf2 272
JulesThuillier 2:61e196a0eaf2 273 // split array to get option
JulesThuillier 2:61e196a0eaf2 274 for(int i=0; i< split; i++)
JulesThuillier 2:61e196a0eaf2 275 {
JulesThuillier 2:61e196a0eaf2 276 option[i] = buf[i];
JulesThuillier 2:61e196a0eaf2 277 }
JulesThuillier 2:61e196a0eaf2 278
JulesThuillier 2:61e196a0eaf2 279 // split array to get argument
JulesThuillier 2:61e196a0eaf2 280 if(split<bytesRead)
JulesThuillier 2:61e196a0eaf2 281 {
JulesThuillier 2:61e196a0eaf2 282 for(int i=split+1; i < bytesRead; i++)
JulesThuillier 0:193d8168f903 283 {
JulesThuillier 2:61e196a0eaf2 284 arg[i-(split+1)] = buf[i];
JulesThuillier 0:193d8168f903 285 }
JulesThuillier 0:193d8168f903 286
JulesThuillier 0:193d8168f903 287 }
JulesThuillier 0:193d8168f903 288
JulesThuillier 2:61e196a0eaf2 289 // Set the frequency
JulesThuillier 2:61e196a0eaf2 290 if(strcmp(option, "setfreq") == 0)
JulesThuillier 2:61e196a0eaf2 291 {
JulesThuillier 2:61e196a0eaf2 292 setFrequency(char_to_int(arg));
JulesThuillier 0:193d8168f903 293 }
JulesThuillier 0:193d8168f903 294 }
JulesThuillier 0:193d8168f903 295 }
JulesThuillier 0:193d8168f903 296
JulesThuillier 0:193d8168f903 297
JulesThuillier 0:193d8168f903 298
JulesThuillier 0:193d8168f903 299 void recordFinished()
JulesThuillier 0:193d8168f903 300 {
JulesThuillier 0:193d8168f903 301 timerUp.reset();
JulesThuillier 0:193d8168f903 302 timerDown.reset();
JulesThuillier 0:193d8168f903 303 indexi = 0;
JulesThuillier 0:193d8168f903 304 indexj = 0;
JulesThuillier 0:193d8168f903 305 DEBUG("Record is over\r\n");
JulesThuillier 0:193d8168f903 306 for(int i=0; i<100; i++)
JulesThuillier 0:193d8168f903 307 DEBUG("%d - ",recordBuffers[0][i]);
JulesThuillier 0:193d8168f903 308 DEBUG("\r\n");
JulesThuillier 0:193d8168f903 309 for(int i=0; i<100; i++)
JulesThuillier 0:193d8168f903 310 DEBUG("%d - ",recordBuffers[1][i]);
JulesThuillier 0:193d8168f903 311 DEBUG("\r\n");
JulesThuillier 0:193d8168f903 312
JulesThuillier 0:193d8168f903 313 }
JulesThuillier 0:193d8168f903 314
JulesThuillier 0:193d8168f903 315 void irFall()
JulesThuillier 0:193d8168f903 316 {
JulesThuillier 2:61e196a0eaf2 317 // Arrete le timer
JulesThuillier 2:61e196a0eaf2 318 timerUp.stop();
JulesThuillier 2:61e196a0eaf2 319
JulesThuillier 2:61e196a0eaf2 320 timerDown.reset();
JulesThuillier 2:61e196a0eaf2 321 timerDown.start();
JulesThuillier 2:61e196a0eaf2 322
JulesThuillier 2:61e196a0eaf2 323 // Demarrage du timer de shutdown;
JulesThuillier 2:61e196a0eaf2 324 recordOffTimer.attach_us(&recordFinished, RECORD_OFF_TIMER);
JulesThuillier 2:61e196a0eaf2 325 if(indexj<100 && indexi <3)
JulesThuillier 2:61e196a0eaf2 326 recordBuffers[indexi][indexj] = timerUp.read_us();
JulesThuillier 2:61e196a0eaf2 327 indexj++;
JulesThuillier 0:193d8168f903 328 }
JulesThuillier 0:193d8168f903 329
JulesThuillier 0:193d8168f903 330 void irRise()
JulesThuillier 0:193d8168f903 331 {
JulesThuillier 2:61e196a0eaf2 332 timerDown.stop();
JulesThuillier 2:61e196a0eaf2 333
JulesThuillier 2:61e196a0eaf2 334 timerUp.reset();
JulesThuillier 2:61e196a0eaf2 335 timerUp.start();
JulesThuillier 2:61e196a0eaf2 336
JulesThuillier 2:61e196a0eaf2 337 // Supprime le shutdown timer
JulesThuillier 2:61e196a0eaf2 338 recordOffTimer.detach();
JulesThuillier 2:61e196a0eaf2 339 if(indexj<100 && indexi <3)
JulesThuillier 2:61e196a0eaf2 340 recordBuffers[indexi][indexj] = timerDown.read_us();
JulesThuillier 2:61e196a0eaf2 341 indexj++;
JulesThuillier 0:193d8168f903 342 }
JulesThuillier 0:193d8168f903 343
JulesThuillier 0:193d8168f903 344
JulesThuillier 0:193d8168f903 345 void initIRInterrupt(PinName pin)
JulesThuillier 0:193d8168f903 346 {
JulesThuillier 0:193d8168f903 347 // Interruption sur le bouton
JulesThuillier 0:193d8168f903 348 InterruptIn *interruption;
JulesThuillier 0:193d8168f903 349
JulesThuillier 0:193d8168f903 350 // Initalize interruption
JulesThuillier 0:193d8168f903 351 interruption = new InterruptIn(pin);
JulesThuillier 0:193d8168f903 352
JulesThuillier 0:193d8168f903 353 if(NRF51822)
JulesThuillier 0:193d8168f903 354 {
JulesThuillier 0:193d8168f903 355 interruption->rise(irRise);
JulesThuillier 0:193d8168f903 356 interruption->fall(irFall);
JulesThuillier 0:193d8168f903 357 }
JulesThuillier 0:193d8168f903 358 else
JulesThuillier 0:193d8168f903 359 {
JulesThuillier 0:193d8168f903 360 interruption->fall(irRise);
JulesThuillier 0:193d8168f903 361 interruption->rise(irFall);
JulesThuillier 0:193d8168f903 362 }
JulesThuillier 0:193d8168f903 363 }
JulesThuillier 0:193d8168f903 364
JulesThuillier 0:193d8168f903 365
JulesThuillier 0:193d8168f903 366 int main() {
JulesThuillier 0:193d8168f903 367 /*
JulesThuillier 0:193d8168f903 368 NRF_CLOCK->TASKS_LFCLKSTOP = 1;
JulesThuillier 0:193d8168f903 369 NRF_CLOCK->LFCLKSRC = 2; // 0 = RC, 1 = XTAL, 2 = SYNTH
JulesThuillier 0:193d8168f903 370 NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
JulesThuillier 0:193d8168f903 371 NRF_CLOCK->TASKS_LFCLKSTART = 1;
JulesThuillier 0:193d8168f903 372 while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0){}
JulesThuillier 0:193d8168f903 373 NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
JulesThuillier 0:193d8168f903 374 */
JulesThuillier 1:bfd2fb3f5584 375
JulesThuillier 0:193d8168f903 376 irled.period_us(26);
JulesThuillier 0:193d8168f903 377 // irled.write(0.33f);
JulesThuillier 0:193d8168f903 378
JulesThuillier 0:193d8168f903 379 DEBUG("Hello world\r\n");
JulesThuillier 0:193d8168f903 380
JulesThuillier 0:193d8168f903 381 // Demarre l'appel periodique toutes les 1 seconde
JulesThuillier 0:193d8168f903 382 ticker.attach(periodicCallback, 1.0f);
JulesThuillier 0:193d8168f903 383
JulesThuillier 0:193d8168f903 384 initIRInterrupt(ir);
JulesThuillier 0:193d8168f903 385
JulesThuillier 0:193d8168f903 386 DEBUG("Fin interrupt Set\r\n");
JulesThuillier 0:193d8168f903 387 // Initialisation et set des callback
JulesThuillier 0:193d8168f903 388 ble.init();
JulesThuillier 0:193d8168f903 389 ble.reset();
JulesThuillier 0:193d8168f903 390 ble.onDisconnection(onDisconnection);
JulesThuillier 0:193d8168f903 391 ble.onDataWritten(receiveUART);
JulesThuillier 0:193d8168f903 392 ble.onConnection(onConnection);
JulesThuillier 0:193d8168f903 393 ble.onTimeout(onTimeout);
JulesThuillier 0:193d8168f903 394
JulesThuillier 0:193d8168f903 395 /*****************************************
JulesThuillier 0:193d8168f903 396 ********** AJOUT DES SERVICES ************
JulesThuillier 0:193d8168f903 397 *****************************************/
JulesThuillier 0:193d8168f903 398
JulesThuillier 0:193d8168f903 399 // Creation du service UART
JulesThuillier 0:193d8168f903 400 UARTService uartService(ble);
JulesThuillier 0:193d8168f903 401 uartServicePtr = &uartService;
JulesThuillier 0:193d8168f903 402 // uartService.retargetStdout(); // renvoie la sortie printf sur l'UART
JulesThuillier 0:193d8168f903 403 // Creation du battery service
JulesThuillier 0:193d8168f903 404 BatteryService battery(ble);
JulesThuillier 0:193d8168f903 405 battServicePtr = &battery;
JulesThuillier 0:193d8168f903 406
JulesThuillier 0:193d8168f903 407 // Creation du DFU service
JulesThuillier 0:193d8168f903 408 DFUService dfu(ble);
JulesThuillier 0:193d8168f903 409
JulesThuillier 0:193d8168f903 410 // Creation du device information service
JulesThuillier 0:193d8168f903 411 DeviceInformationService deviceInfo(ble, DEVICE_NAME, "OldRemote", "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
JulesThuillier 0:193d8168f903 412
JulesThuillier 0:193d8168f903 413
JulesThuillier 0:193d8168f903 414 // Setup advertising
JulesThuillier 0:193d8168f903 415 static const uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE, GattService::UUID_DEVICE_INFORMATION_SERVICE};
JulesThuillier 0:193d8168f903 416
JulesThuillier 0:193d8168f903 417 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
JulesThuillier 0:193d8168f903 418 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
JulesThuillier 0:193d8168f903 419 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,(const uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME) - 1);
JulesThuillier 0:193d8168f903 420 ble.accumulateAdvertisingPayload(GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS,(const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
JulesThuillier 0:193d8168f903 421 ble.accumulateAdvertisingPayload(GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
JulesThuillier 0:193d8168f903 422 ble.setAdvertisingInterval(ADV_INTERVAL); /* 100ms; in multiples of 0.625ms. */
JulesThuillier 0:193d8168f903 423 // ble.setAdvertisingTimeout(ADV_TIMEOUT); /* in seconds */
JulesThuillier 0:193d8168f903 424 ble.startAdvertising();
JulesThuillier 0:193d8168f903 425
JulesThuillier 0:193d8168f903 426 currentState = ADVERTISING;
JulesThuillier 0:193d8168f903 427
JulesThuillier 0:193d8168f903 428 DEBUG("Initialisation done\r\n");
JulesThuillier 0:193d8168f903 429
JulesThuillier 0:193d8168f903 430 while (true) {
JulesThuillier 0:193d8168f903 431 ble.waitForEvent();
JulesThuillier 0:193d8168f903 432
JulesThuillier 0:193d8168f903 433 }
JulesThuillier 0:193d8168f903 434 }