OldRemmote allows you to record IR remotes and upload the IR code to your smartphone to replay it later. Check www.julesthuillier.com for more information
Dependencies: BLE_API mbed nRF51822
main.cpp@4:688a955562ad, 2015-02-09 (annotated)
- 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?
User | Revision | Line number | New contents of line |
---|---|---|---|
JulesThuillier | 0:193d8168f903 | 1 | #include "mbed.h" |
JulesThuillier | 0:193d8168f903 | 2 | #include "BLEDevice.h" |
JulesThuillier | 0:193d8168f903 | 3 | |
JulesThuillier | 0:193d8168f903 | 4 | #include "DFUService.h" |
JulesThuillier | 0:193d8168f903 | 5 | |
JulesThuillier | 0:193d8168f903 | 6 | //UART Primary Service |
JulesThuillier | 0:193d8168f903 | 7 | #include "UARTService.h" |
JulesThuillier | 0:193d8168f903 | 8 | |
JulesThuillier | 0:193d8168f903 | 9 | //Battery and DeviceInformation Auxilary Services |
JulesThuillier | 0:193d8168f903 | 10 | #include "BatteryService.h" |
JulesThuillier | 0:193d8168f903 | 11 | #include "DeviceInformationService.h" |
JulesThuillier | 0:193d8168f903 | 12 | |
JulesThuillier | 0:193d8168f903 | 13 | #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console; |
JulesThuillier | 0:193d8168f903 | 14 | * it will have an impact on code-size and power consumption. */ |
JulesThuillier | 0:193d8168f903 | 15 | #if NEED_CONSOLE_OUTPUT |
JulesThuillier | 0:193d8168f903 | 16 | #define DEBUG(...) { printf(__VA_ARGS__);} |
JulesThuillier | 0:193d8168f903 | 17 | #else |
JulesThuillier | 0:193d8168f903 | 18 | #define DEBUG(...) /* nothing */ |
JulesThuillier | 0:193d8168f903 | 19 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
JulesThuillier | 0:193d8168f903 | 20 | |
JulesThuillier | 0:193d8168f903 | 21 | #define RECORD_OFF_TIMER 12000 |
JulesThuillier | 0:193d8168f903 | 22 | #define ADV_INTERVAL 1600 /* 1000ms; in multiples of 0.625ms. */ |
JulesThuillier | 0:193d8168f903 | 23 | #define ADV_TIMEOUT 30 /* in seconds */ |
JulesThuillier | 0:193d8168f903 | 24 | #define BUTTON_SHUTDOWN_DELAY 4 |
JulesThuillier | 0:193d8168f903 | 25 | |
JulesThuillier | 0:193d8168f903 | 26 | #define NRF51822 0 |
JulesThuillier | 0:193d8168f903 | 27 | |
JulesThuillier | 0:193d8168f903 | 28 | /* Initialisation des entrées sorties */ |
JulesThuillier | 0:193d8168f903 | 29 | |
JulesThuillier | 0:193d8168f903 | 30 | PinName ir = P0_6; |
JulesThuillier | 0:193d8168f903 | 31 | PwmOut irled(P0_12); |
JulesThuillier | 0:193d8168f903 | 32 | |
JulesThuillier | 0:193d8168f903 | 33 | static char const DEVICE_NAME[] = "OldRemote"; |
JulesThuillier | 0:193d8168f903 | 34 | |
JulesThuillier | 0:193d8168f903 | 35 | BLEDevice ble; |
JulesThuillier | 0:193d8168f903 | 36 | UARTService *uartServicePtr; |
JulesThuillier | 0:193d8168f903 | 37 | BatteryService *battServicePtr; |
JulesThuillier | 0:193d8168f903 | 38 | |
JulesThuillier | 0:193d8168f903 | 39 | enum States {DISCONNECTED, OFF, ADVERTISING, CONNECTED}; |
JulesThuillier | 0:193d8168f903 | 40 | States currentState = DISCONNECTED; |
JulesThuillier | 0:193d8168f903 | 41 | |
JulesThuillier | 0:193d8168f903 | 42 | // Timer pour connaitre la duree de l'enfoncement |
JulesThuillier | 0:193d8168f903 | 43 | Timer timer; |
JulesThuillier | 0:193d8168f903 | 44 | Timer timerUp; |
JulesThuillier | 0:193d8168f903 | 45 | Timer timerDown; |
JulesThuillier | 0:193d8168f903 | 46 | Timeout recordOffTimer; |
JulesThuillier | 0:193d8168f903 | 47 | |
JulesThuillier | 0:193d8168f903 | 48 | // Ticker pour un reveil toutes ls 1 secondes |
JulesThuillier | 0:193d8168f903 | 49 | Ticker ticker; |
JulesThuillier | 0:193d8168f903 | 50 | bool startPeriodick = false; |
JulesThuillier | 0:193d8168f903 | 51 | // Turn the device off |
JulesThuillier | 0:193d8168f903 | 52 | |
JulesThuillier | 0:193d8168f903 | 53 | uint16_t recordBuffers [3][100]; |
JulesThuillier | 0:193d8168f903 | 54 | uint8_t indexi = 0, indexj = 0; |
JulesThuillier | 0:193d8168f903 | 55 | |
JulesThuillier | 1:bfd2fb3f5584 | 56 | uint16_t sendBuffer [100]; |
JulesThuillier | 3:a491b09cfd3b | 57 | uint8_t sendBufferIndex = 0; |
JulesThuillier | 3:a491b09cfd3b | 58 | |
JulesThuillier | 3:a491b09cfd3b | 59 | bool receivingDatas = false; |
JulesThuillier | 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 | } |