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 05:19:36 2015 +0000
Revision:
1:bfd2fb3f5584
Parent:
0:193d8168f903
Child:
2:61e196a0eaf2
ajout des fonctions; setfrequency; clearbuffer; clearbuffers; sendUART; sendIR; receiveIR; repeat;

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