BLE UART adapted for controlling ObCP ENSMM user board with nrF UART
Dependencies: mbed X_NUCLEO_IDB0XA1 BLE_API LIS3DH_spi
main.cpp@13:38d6b18040c7, 2020-11-09 (annotated)
- Committer:
- jimbaud
- Date:
- Mon Nov 09 18:12:58 2020 +0000
- Revision:
- 13:38d6b18040c7
BLE UART adapted for ObCP ENSMM user board
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jimbaud | 13:38d6b18040c7 | 1 | #include "mbed.h" |
jimbaud | 13:38d6b18040c7 | 2 | #include "ble/BLE.h" |
jimbaud | 13:38d6b18040c7 | 3 | #include "ble/services/UARTService.h" |
jimbaud | 13:38d6b18040c7 | 4 | #include "Serial.h" |
jimbaud | 13:38d6b18040c7 | 5 | #include "LIS3DH.h" |
jimbaud | 13:38d6b18040c7 | 6 | #include "stdlib.h" |
jimbaud | 13:38d6b18040c7 | 7 | |
jimbaud | 13:38d6b18040c7 | 8 | #define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN) |
jimbaud | 13:38d6b18040c7 | 9 | |
jimbaud | 13:38d6b18040c7 | 10 | |
jimbaud | 13:38d6b18040c7 | 11 | const static char DEVICE_NAME[] = "ObCP"; |
jimbaud | 13:38d6b18040c7 | 12 | UARTService *uartServicePtr; |
jimbaud | 13:38d6b18040c7 | 13 | |
jimbaud | 13:38d6b18040c7 | 14 | //PWM output |
jimbaud | 13:38d6b18040c7 | 15 | PwmOut PWMoutput(PB_1); //Main PWM output |
jimbaud | 13:38d6b18040c7 | 16 | PwmOut Green(PC_8); //PWM Red LED |
jimbaud | 13:38d6b18040c7 | 17 | PwmOut Red(PC_6); //PWM Green LED |
jimbaud | 13:38d6b18040c7 | 18 | PwmOut Blue(PC_9); //PWM Blue LED |
jimbaud | 13:38d6b18040c7 | 19 | |
jimbaud | 13:38d6b18040c7 | 20 | //Accelerometer |
jimbaud | 13:38d6b18040c7 | 21 | |
jimbaud | 13:38d6b18040c7 | 22 | #define MOSI PC_12 |
jimbaud | 13:38d6b18040c7 | 23 | #define MISO PC_11 |
jimbaud | 13:38d6b18040c7 | 24 | #define CS PC_5 |
jimbaud | 13:38d6b18040c7 | 25 | #define SCLK PC_10 |
jimbaud | 13:38d6b18040c7 | 26 | |
jimbaud | 13:38d6b18040c7 | 27 | // Def Peripheriques |
jimbaud | 13:38d6b18040c7 | 28 | DigitalIn myButton(PC_13); // USER BUTTON |
jimbaud | 13:38d6b18040c7 | 29 | //Init accelerometer |
jimbaud | 13:38d6b18040c7 | 30 | LIS3DH acc(MOSI, MISO, SCLK, CS, LIS3DH_DR_NR_LP_50HZ, LIS3DH_FS_2G); |
jimbaud | 13:38d6b18040c7 | 31 | |
jimbaud | 13:38d6b18040c7 | 32 | Ticker Acceleration; |
jimbaud | 13:38d6b18040c7 | 33 | |
jimbaud | 13:38d6b18040c7 | 34 | // Tableau et index de communication avec UART |
jimbaud | 13:38d6b18040c7 | 35 | static char uartBuff[UART_BUFFER]; |
jimbaud | 13:38d6b18040c7 | 36 | // Variables contenant accelerations |
jimbaud | 13:38d6b18040c7 | 37 | double accX, accY, accZ; |
jimbaud | 13:38d6b18040c7 | 38 | // Routine de traitement des erreurs |
jimbaud | 13:38d6b18040c7 | 39 | void onBleError(ble_error_t error); |
jimbaud | 13:38d6b18040c7 | 40 | |
jimbaud | 13:38d6b18040c7 | 41 | /****************************************************/ |
jimbaud | 13:38d6b18040c7 | 42 | /* Ticker actif lorsque la connexion BLE est présente */ |
jimbaud | 13:38d6b18040c7 | 43 | /****************************************************/ |
jimbaud | 13:38d6b18040c7 | 44 | void ConnectedBLE(void) |
jimbaud | 13:38d6b18040c7 | 45 | { |
jimbaud | 13:38d6b18040c7 | 46 | // Signal de vie: allumer et éteindre la LED |
jimbaud | 13:38d6b18040c7 | 47 | Green.period(1.0f); // période = 1 seconde |
jimbaud | 13:38d6b18040c7 | 48 | Green.write(0.01f); // élaire 1% de la période |
jimbaud | 13:38d6b18040c7 | 49 | } |
jimbaud | 13:38d6b18040c7 | 50 | |
jimbaud | 13:38d6b18040c7 | 51 | void AccMeasurement(void) |
jimbaud | 13:38d6b18040c7 | 52 | { |
jimbaud | 13:38d6b18040c7 | 53 | char outstrX[5]; |
jimbaud | 13:38d6b18040c7 | 54 | char outstrY[5]; |
jimbaud | 13:38d6b18040c7 | 55 | char outstrZ[5]; |
jimbaud | 13:38d6b18040c7 | 56 | |
jimbaud | 13:38d6b18040c7 | 57 | // Mesure des accélérations sur les 3 axes |
jimbaud | 13:38d6b18040c7 | 58 | accX = float(short((acc.read_reg(LIS3DH_OUT_X_H) << 8) | acc.read_reg(LIS3DH_OUT_X_L))) * 0.001F / 15; |
jimbaud | 13:38d6b18040c7 | 59 | accY = float(short((acc.read_reg(LIS3DH_OUT_Y_H) << 8) | acc.read_reg(LIS3DH_OUT_Y_L))) * 0.001F / 15; |
jimbaud | 13:38d6b18040c7 | 60 | accZ = float(short((acc.read_reg(LIS3DH_OUT_Z_H) << 8) | acc.read_reg(LIS3DH_OUT_Z_L))) * 0.001F / 15; |
jimbaud | 13:38d6b18040c7 | 61 | |
jimbaud | 13:38d6b18040c7 | 62 | //Transformation des valeurs numeriques en chaine de caracteres |
jimbaud | 13:38d6b18040c7 | 63 | sprintf(outstrX,"%5.2f",accX); |
jimbaud | 13:38d6b18040c7 | 64 | sprintf(outstrY,"%5.2f",accY); |
jimbaud | 13:38d6b18040c7 | 65 | sprintf(outstrZ,"%5.2f",accZ); |
jimbaud | 13:38d6b18040c7 | 66 | //Integre les trois chaines de caractere contenant les accelerations dans la chaine uartBuff |
jimbaud | 13:38d6b18040c7 | 67 | sprintf(uartBuff, "X%s Y%s Z%s", outstrX, outstrY, outstrZ) ; |
jimbaud | 13:38d6b18040c7 | 68 | //Envoie la chaine uartBuff sur le sevice TX UART BLE |
jimbaud | 13:38d6b18040c7 | 69 | uartServicePtr->write(uartBuff, UARTService::BLE_UART_SERVICE_MAX_DATA_LEN); |
jimbaud | 13:38d6b18040c7 | 70 | // Réinitialiser la chaîne uartBuff en entrant 0 dans les premiers caractères UART_BUFFER |
jimbaud | 13:38d6b18040c7 | 71 | memset(uartBuff, 0, UART_BUFFER); |
jimbaud | 13:38d6b18040c7 | 72 | |
jimbaud | 13:38d6b18040c7 | 73 | } |
jimbaud | 13:38d6b18040c7 | 74 | |
jimbaud | 13:38d6b18040c7 | 75 | /*************************/ |
jimbaud | 13:38d6b18040c7 | 76 | /* Connexion BLE réussie */ |
jimbaud | 13:38d6b18040c7 | 77 | /*************************/ |
jimbaud | 13:38d6b18040c7 | 78 | void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params) |
jimbaud | 13:38d6b18040c7 | 79 | { |
jimbaud | 13:38d6b18040c7 | 80 | // Signal de connexion BLE: allume / éteint la LED avec une période de 1 seconde |
jimbaud | 13:38d6b18040c7 | 81 | ConnectedBLE(); |
jimbaud | 13:38d6b18040c7 | 82 | Acceleration.attach(AccMeasurement, 1); |
jimbaud | 13:38d6b18040c7 | 83 | } |
jimbaud | 13:38d6b18040c7 | 84 | |
jimbaud | 13:38d6b18040c7 | 85 | /*****************************/ |
jimbaud | 13:38d6b18040c7 | 86 | /* Déconnexion du client BLE */ |
jimbaud | 13:38d6b18040c7 | 87 | /*****************************/ |
jimbaud | 13:38d6b18040c7 | 88 | void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
jimbaud | 13:38d6b18040c7 | 89 | { |
jimbaud | 13:38d6b18040c7 | 90 | (void)params; |
jimbaud | 13:38d6b18040c7 | 91 | // Redémarrer la publicité |
jimbaud | 13:38d6b18040c7 | 92 | Acceleration.detach(); |
jimbaud | 13:38d6b18040c7 | 93 | BLE::Instance().gap().startAdvertising(); |
jimbaud | 13:38d6b18040c7 | 94 | |
jimbaud | 13:38d6b18040c7 | 95 | PWMoutput.write(0.0f); |
jimbaud | 13:38d6b18040c7 | 96 | Green.write(0.0f); |
jimbaud | 13:38d6b18040c7 | 97 | Red.write(0.0f); |
jimbaud | 13:38d6b18040c7 | 98 | Blue.write(0.0f); |
jimbaud | 13:38d6b18040c7 | 99 | } |
jimbaud | 13:38d6b18040c7 | 100 | |
jimbaud | 13:38d6b18040c7 | 101 | /***************************/ |
jimbaud | 13:38d6b18040c7 | 102 | /* Rx de BLE et Rx vers USB*/ |
jimbaud | 13:38d6b18040c7 | 103 | /***************************/ |
jimbaud | 13:38d6b18040c7 | 104 | void BleOnDataWrittenCallback(const GattWriteCallbackParams *params) |
jimbaud | 13:38d6b18040c7 | 105 | { |
jimbaud | 13:38d6b18040c7 | 106 | char reception[UART_BUFFER]; |
jimbaud | 13:38d6b18040c7 | 107 | char commande[2]; |
jimbaud | 13:38d6b18040c7 | 108 | float valeur; |
jimbaud | 13:38d6b18040c7 | 109 | |
jimbaud | 13:38d6b18040c7 | 110 | // Reçoit une chaîne de BLE |
jimbaud | 13:38d6b18040c7 | 111 | if (params->handle == uartServicePtr->getTXCharacteristicHandle()) { |
jimbaud | 13:38d6b18040c7 | 112 | // Copie de la chaine reçue dans reception |
jimbaud | 13:38d6b18040c7 | 113 | sprintf(reception,"%s", params->data); |
jimbaud | 13:38d6b18040c7 | 114 | // Copie dans la chaine commande des deux premier caracteres de la chaine reception |
jimbaud | 13:38d6b18040c7 | 115 | sprintf(commande,"%c%c", reception[0], reception[1]); |
jimbaud | 13:38d6b18040c7 | 116 | // Transformation des 3 caracteres suivants en valeur numerique |
jimbaud | 13:38d6b18040c7 | 117 | valeur = ((reception[2] - '0')* 100 + (reception[3] - '0')* 10 +(reception[4] - '0')) ; |
jimbaud | 13:38d6b18040c7 | 118 | valeur = valeur/255; |
jimbaud | 13:38d6b18040c7 | 119 | |
jimbaud | 13:38d6b18040c7 | 120 | if( strcmp(commande, "LR")==0) { |
jimbaud | 13:38d6b18040c7 | 121 | Red.period(0.01f); |
jimbaud | 13:38d6b18040c7 | 122 | Red.write(valeur); |
jimbaud | 13:38d6b18040c7 | 123 | } |
jimbaud | 13:38d6b18040c7 | 124 | if( strcmp(commande, "LV")==0) { |
jimbaud | 13:38d6b18040c7 | 125 | Green.period(0.01f); |
jimbaud | 13:38d6b18040c7 | 126 | Green.write(valeur); |
jimbaud | 13:38d6b18040c7 | 127 | } |
jimbaud | 13:38d6b18040c7 | 128 | if( strcmp(commande, "LB")==0) { |
jimbaud | 13:38d6b18040c7 | 129 | Blue.period(0.01f); |
jimbaud | 13:38d6b18040c7 | 130 | Blue.write(valeur); |
jimbaud | 13:38d6b18040c7 | 131 | } |
jimbaud | 13:38d6b18040c7 | 132 | if( strcmp(commande, "PW")==0) { |
jimbaud | 13:38d6b18040c7 | 133 | PWMoutput.period(0.001f); |
jimbaud | 13:38d6b18040c7 | 134 | PWMoutput.write(valeur); |
jimbaud | 13:38d6b18040c7 | 135 | } |
jimbaud | 13:38d6b18040c7 | 136 | |
jimbaud | 13:38d6b18040c7 | 137 | } |
jimbaud | 13:38d6b18040c7 | 138 | } |
jimbaud | 13:38d6b18040c7 | 139 | |
jimbaud | 13:38d6b18040c7 | 140 | /***************************/ |
jimbaud | 13:38d6b18040c7 | 141 | /* Erreur sur le canal BLE */ |
jimbaud | 13:38d6b18040c7 | 142 | /***************************/ |
jimbaud | 13:38d6b18040c7 | 143 | |
jimbaud | 13:38d6b18040c7 | 144 | void onBleError(ble_error_t error) |
jimbaud | 13:38d6b18040c7 | 145 | { |
jimbaud | 13:38d6b18040c7 | 146 | Red.period(0.8f); // période = 0.8 seconde |
jimbaud | 13:38d6b18040c7 | 147 | Red.write(0.10f); // élaire 10% de la période |
jimbaud | 13:38d6b18040c7 | 148 | /* Entrer le traitement des erreurs */ |
jimbaud | 13:38d6b18040c7 | 149 | } |
jimbaud | 13:38d6b18040c7 | 150 | |
jimbaud | 13:38d6b18040c7 | 151 | /**************************************/ |
jimbaud | 13:38d6b18040c7 | 152 | /* Initialisation du service BLE UART */ |
jimbaud | 13:38d6b18040c7 | 153 | /**************************************/ |
jimbaud | 13:38d6b18040c7 | 154 | |
jimbaud | 13:38d6b18040c7 | 155 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
jimbaud | 13:38d6b18040c7 | 156 | { |
jimbaud | 13:38d6b18040c7 | 157 | BLE& ble = params->ble; |
jimbaud | 13:38d6b18040c7 | 158 | ble_error_t error = params->error; |
jimbaud | 13:38d6b18040c7 | 159 | |
jimbaud | 13:38d6b18040c7 | 160 | if (error != BLE_ERROR_NONE) { |
jimbaud | 13:38d6b18040c7 | 161 | |
jimbaud | 13:38d6b18040c7 | 162 | /* En cas d'erreur, transmettez le traitement d'erreur à onBleInitError*/ |
jimbaud | 13:38d6b18040c7 | 163 | onBleError(error); |
jimbaud | 13:38d6b18040c7 | 164 | return; |
jimbaud | 13:38d6b18040c7 | 165 | } |
jimbaud | 13:38d6b18040c7 | 166 | |
jimbaud | 13:38d6b18040c7 | 167 | /* Assurez-vous qu'il s'agit de l'instance par défaut de BLE */ |
jimbaud | 13:38d6b18040c7 | 168 | if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
jimbaud | 13:38d6b18040c7 | 169 | return; |
jimbaud | 13:38d6b18040c7 | 170 | } |
jimbaud | 13:38d6b18040c7 | 171 | |
jimbaud | 13:38d6b18040c7 | 172 | ble.gap().onConnection(BleConnectionCallback); |
jimbaud | 13:38d6b18040c7 | 173 | ble.gap().onDisconnection(BleDisconnectionCallback); |
jimbaud | 13:38d6b18040c7 | 174 | ble.gattServer().onDataWritten(BleOnDataWrittenCallback); |
jimbaud | 13:38d6b18040c7 | 175 | |
jimbaud | 13:38d6b18040c7 | 176 | /* Configuration du service primaire. */ |
jimbaud | 13:38d6b18040c7 | 177 | UARTService uartService(ble); |
jimbaud | 13:38d6b18040c7 | 178 | uartServicePtr = &uartService; |
jimbaud | 13:38d6b18040c7 | 179 | |
jimbaud | 13:38d6b18040c7 | 180 | /* Configurer la publicité */ |
jimbaud | 13:38d6b18040c7 | 181 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
jimbaud | 13:38d6b18040c7 | 182 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
jimbaud | 13:38d6b18040c7 | 183 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
jimbaud | 13:38d6b18040c7 | 184 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
jimbaud | 13:38d6b18040c7 | 185 | ble.gap().setAdvertisingInterval(500); /* 500ms. */ |
jimbaud | 13:38d6b18040c7 | 186 | ble.gap().startAdvertising(); |
jimbaud | 13:38d6b18040c7 | 187 | |
jimbaud | 13:38d6b18040c7 | 188 | // Attend les événements sur BLE |
jimbaud | 13:38d6b18040c7 | 189 | while (true) { |
jimbaud | 13:38d6b18040c7 | 190 | ble.waitForEvent(); |
jimbaud | 13:38d6b18040c7 | 191 | } |
jimbaud | 13:38d6b18040c7 | 192 | } |
jimbaud | 13:38d6b18040c7 | 193 | |
jimbaud | 13:38d6b18040c7 | 194 | /********/ |
jimbaud | 13:38d6b18040c7 | 195 | /* MAIN */ |
jimbaud | 13:38d6b18040c7 | 196 | /********/ |
jimbaud | 13:38d6b18040c7 | 197 | int main(void) |
jimbaud | 13:38d6b18040c7 | 198 | { |
jimbaud | 13:38d6b18040c7 | 199 | //Définit le fonctionnement du bouton sur "PullDown": Open = '0'. L’autre mode de fonctionnement est PullUp |
jimbaud | 13:38d6b18040c7 | 200 | myButton.mode(PullDown); |
jimbaud | 13:38d6b18040c7 | 201 | |
jimbaud | 13:38d6b18040c7 | 202 | // Initialiser LED |
jimbaud | 13:38d6b18040c7 | 203 | Green.write(0.0f); |
jimbaud | 13:38d6b18040c7 | 204 | Red.write(0.0f); |
jimbaud | 13:38d6b18040c7 | 205 | Blue.write(0.0f); |
jimbaud | 13:38d6b18040c7 | 206 | |
jimbaud | 13:38d6b18040c7 | 207 | /****** START Initialiser BLE **********/ |
jimbaud | 13:38d6b18040c7 | 208 | BLE &ble = BLE::Instance(); |
jimbaud | 13:38d6b18040c7 | 209 | ble.init(bleInitComplete); |
jimbaud | 13:38d6b18040c7 | 210 | /******* FIN initialise BLE ***********/ |
jimbaud | 13:38d6b18040c7 | 211 | |
jimbaud | 13:38d6b18040c7 | 212 | } |
jimbaud | 13:38d6b18040c7 | 213 |