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@1:bfd2fb3f5584, 2015-02-09 (annotated)
- 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?
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 | 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 | } |