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@2:61e196a0eaf2, 2015-02-09 (annotated)
- 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?
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 | 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 | } |