Project aims to use LED panel controlled through UART with an nucleo STM32 board with shields BLE IDB05A1 & MEMS IKS01A1

Dependencies:   mbed X_NUCLEO_IKS01A2 X_NUCLEO_IDB0XA1 BLE_API

Committer:
waby38
Date:
Fri Nov 24 16:03:25 2017 +0000
Revision:
3:60fe58ad8c7d
Parent:
2:74b8978081c5
Last updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
waby38 0:ff227fd5674f 1 /* mbed Microcontroller Library
waby38 0:ff227fd5674f 2 * Copyright (c) 2006-2013 ARM Limited
waby38 0:ff227fd5674f 3 *
waby38 0:ff227fd5674f 4 * Licensed under the Apache License, Version 2.0 (the "License");
waby38 0:ff227fd5674f 5 * you may not use this file except in compliance with the License.
waby38 0:ff227fd5674f 6 * You may obtain a copy of the License at
waby38 0:ff227fd5674f 7 *
waby38 0:ff227fd5674f 8 * http://www.apache.org/licenses/LICENSE-2.0
waby38 0:ff227fd5674f 9 *
waby38 0:ff227fd5674f 10 * Unless required by applicable law or agreed to in writing, software
waby38 0:ff227fd5674f 11 * distributed under the License is distributed on an "AS IS" BASIS,
waby38 0:ff227fd5674f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
waby38 0:ff227fd5674f 13 * See the License for the specific language governing permissions and
waby38 0:ff227fd5674f 14 * limitations under the License.
waby38 0:ff227fd5674f 15 */
waby38 0:ff227fd5674f 16
waby38 0:ff227fd5674f 17 #include "mbed.h"
waby38 3:60fe58ad8c7d 18 #include "XNucleoIKS01A2.h"
waby38 0:ff227fd5674f 19 #include "ble/BLE.h"
waby38 0:ff227fd5674f 20 #include "ble/services/UARTService.h"
waby38 0:ff227fd5674f 21 #include "Serial.h"
waby38 0:ff227fd5674f 22
waby38 3:60fe58ad8c7d 23 /* Instantiate the mems expansion board */
waby38 3:60fe58ad8c7d 24 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
davidDicko 1:2bddfc61380d 25
waby38 3:60fe58ad8c7d 26 /* Retrieve the composing elements of the expansion board */
waby38 3:60fe58ad8c7d 27 static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer;
waby38 3:60fe58ad8c7d 28 static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
waby38 3:60fe58ad8c7d 29 static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
waby38 3:60fe58ad8c7d 30 static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
waby38 3:60fe58ad8c7d 31 static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
waby38 0:ff227fd5674f 32
waby38 3:60fe58ad8c7d 33 /* BLE part */
waby38 0:ff227fd5674f 34 #define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN*10)
waby38 3:60fe58ad8c7d 35 const static char DEVICE_NAME[] = "$PANEL$";
waby38 0:ff227fd5674f 36 UARTService *uartServicePtr;
davidDicko 1:2bddfc61380d 37 static char BLEBuffRX[UART_BUFFER];
davidDicko 1:2bddfc61380d 38 static uint8_t BLEBuffPos=0;
waby38 3:60fe58ad8c7d 39 void onBleError(ble_error_t error);
davidDicko 1:2bddfc61380d 40
waby38 3:60fe58ad8c7d 41 /* pc uart part */
davidDicko 1:2bddfc61380d 42 static char uartBuff[UART_BUFFER];
waby38 0:ff227fd5674f 43 static uint8_t uartBuffPos=0;
waby38 3:60fe58ad8c7d 44 Serial uart1(USBTX,USBRX);
waby38 3:60fe58ad8c7d 45 #define DEBUG uart1.printf
waby38 0:ff227fd5674f 46
waby38 3:60fe58ad8c7d 47 /* Led panel part */
waby38 3:60fe58ad8c7d 48 #define PANEL_PAGE_NUMBER 26
waby38 3:60fe58ad8c7d 49 #define PANEL_PAGE_SIZE 256
waby38 3:60fe58ad8c7d 50 Serial uart_panel(PA_9,PA_10);
waby38 3:60fe58ad8c7d 51 static uint8_t panel_disppage=0;
waby38 3:60fe58ad8c7d 52 static char panel_msg[PANEL_PAGE_NUMBER][PANEL_PAGE_SIZE]={
waby38 3:60fe58ad8c7d 53 "<FE><MA><WC><FE>Bienvenue a STMicroeletronics",
waby38 3:60fe58ad8c7d 54 "<FE><MA><WC><FE>Welcome to STMicroeletronics",
waby38 3:60fe58ad8c7d 55 "<FE><MA><WC><FE>Today is <KD>",
waby38 3:60fe58ad8c7d 56 "<FE><MA><WC><FE>It is <KT>",
waby38 3:60fe58ad8c7d 57 "<FE><MA><WC><FE>Temp is <TEMPERAT>",
waby38 3:60fe58ad8c7d 58 "<FE><MA><WC><FE>I am a <CE>STM32L476",
waby38 3:60fe58ad8c7d 59 "<FE><MA><WC><FE>with <CE>MEMs <CB>and <CE>BLE <CB>shields"
waby38 3:60fe58ad8c7d 60 };
waby38 3:60fe58ad8c7d 61
waby38 3:60fe58ad8c7d 62 typedef enum {
waby38 3:60fe58ad8c7d 63 SCROLL_DEFAULT,
waby38 3:60fe58ad8c7d 64 SCROLL_LEFT,
waby38 3:60fe58ad8c7d 65 SCROLL_RIGHT,
waby38 3:60fe58ad8c7d 66 SCROLL_UP,
waby38 3:60fe58ad8c7d 67 SCROLL_DOWN
waby38 3:60fe58ad8c7d 68 } panel_effect_e ;
waby38 3:60fe58ad8c7d 69 panel_effect_e panel_effect = SCROLL_DEFAULT;
waby38 0:ff227fd5674f 70
waby38 0:ff227fd5674f 71 DigitalOut led1(LED1);
waby38 0:ff227fd5674f 72 Ticker ticker;
waby38 0:ff227fd5674f 73
waby38 0:ff227fd5674f 74 /* Helper function for printing floats & doubles */
waby38 0:ff227fd5674f 75 static char *printDouble(char* str, double v, int decimalDigits=2)
waby38 0:ff227fd5674f 76 {
waby38 0:ff227fd5674f 77 int i = 1;
waby38 0:ff227fd5674f 78 int intPart, fractPart;
waby38 0:ff227fd5674f 79 int len;
waby38 0:ff227fd5674f 80 char *ptr;
waby38 0:ff227fd5674f 81
waby38 0:ff227fd5674f 82 /* prepare decimal digits multiplicator */
waby38 0:ff227fd5674f 83 for (;decimalDigits!=0; i*=10, decimalDigits--);
waby38 0:ff227fd5674f 84
waby38 0:ff227fd5674f 85 /* calculate integer & fractinal parts */
waby38 0:ff227fd5674f 86 intPart = (int)v;
waby38 0:ff227fd5674f 87 fractPart = (int)((v-(double)(int)v)*i);
waby38 0:ff227fd5674f 88
waby38 0:ff227fd5674f 89 /* fill in integer part */
waby38 0:ff227fd5674f 90 sprintf(str, "%i.", intPart);
waby38 0:ff227fd5674f 91
waby38 0:ff227fd5674f 92 /* prepare fill in of fractional part */
davidDicko 1:2bddfc61380d 93 len = strlen(str);
waby38 0:ff227fd5674f 94 ptr = &str[len];
waby38 0:ff227fd5674f 95
waby38 0:ff227fd5674f 96 /* fill in leading fractional zeros */
waby38 0:ff227fd5674f 97 for (i/=10;i>1; i/=10, ptr++) {
waby38 0:ff227fd5674f 98 if(fractPart >= i) break;
waby38 0:ff227fd5674f 99 *ptr = '0';
waby38 0:ff227fd5674f 100 }
waby38 0:ff227fd5674f 101
waby38 0:ff227fd5674f 102 /* fill in (rest of) fractional part */
waby38 0:ff227fd5674f 103 sprintf(ptr, "%i", fractPart);
waby38 0:ff227fd5674f 104
waby38 0:ff227fd5674f 105 return str;
waby38 0:ff227fd5674f 106 }
waby38 0:ff227fd5674f 107
davidDicko 1:2bddfc61380d 108 void panel_sendmsg(char line, char page, char* text){
waby38 3:60fe58ad8c7d 109 char buff[PANEL_PAGE_SIZE];
waby38 3:60fe58ad8c7d 110 char* pos_t;
waby38 3:60fe58ad8c7d 111 char* pos_p;
waby38 3:60fe58ad8c7d 112 char* pos_h;
waby38 3:60fe58ad8c7d 113 char* pos_e;
waby38 3:60fe58ad8c7d 114 char* panel_reset;
davidDicko 1:2bddfc61380d 115 uint8_t i, checksum=0;
waby38 3:60fe58ad8c7d 116 pos_t=strstr(text,"<SC>");
waby38 3:60fe58ad8c7d 117 if(pos_t!=0) {
waby38 3:60fe58ad8c7d 118 sprintf(buff,"<ID00>%s",text);
waby38 3:60fe58ad8c7d 119 for(i=6; i<strlen(buff); i++){
waby38 3:60fe58ad8c7d 120 checksum ^= buff[i];
waby38 3:60fe58ad8c7d 121 }
waby38 3:60fe58ad8c7d 122 sprintf(buff,"%s%02X<E>", buff, checksum);
waby38 3:60fe58ad8c7d 123 uart1.printf("panel msg = %s\r\n", buff);
waby38 3:60fe58ad8c7d 124 uart_panel.printf(buff);
waby38 3:60fe58ad8c7d 125 return;
waby38 3:60fe58ad8c7d 126 }
davidDicko 1:2bddfc61380d 127 sprintf(buff, "<ID00><L%c><P%c>%s", line, page, text);
waby38 3:60fe58ad8c7d 128 pos_t=strstr(buff,"<TEMPERAT>");
waby38 3:60fe58ad8c7d 129 if(pos_t!=0) {
davidDicko 1:2bddfc61380d 130 float sensor_temp;
davidDicko 1:2bddfc61380d 131 char temp[3];
waby38 3:60fe58ad8c7d 132 hum_temp->get_temperature(&sensor_temp);
davidDicko 2:74b8978081c5 133 sprintf(temp, "%02d", (int)sensor_temp);
davidDicko 2:74b8978081c5 134 buff[pos_t-buff]=' '; /* replace < */
waby38 3:60fe58ad8c7d 135 buff[pos_t-buff+1]=temp[0]; /* replace T */
waby38 3:60fe58ad8c7d 136 buff[pos_t-buff+2]=temp[1]; /* replace E */
waby38 3:60fe58ad8c7d 137 buff[pos_t-buff+3]='<'; /* replace M */
waby38 3:60fe58ad8c7d 138 buff[pos_t-buff+4]='U'; /* replace P */
waby38 3:60fe58ad8c7d 139 buff[pos_t-buff+5]='3'; /* replace E */
waby38 3:60fe58ad8c7d 140 buff[pos_t-buff+6]='A'; /* replace R */
waby38 3:60fe58ad8c7d 141 buff[pos_t-buff+7]='>'; /* replace A */
waby38 3:60fe58ad8c7d 142 buff[pos_t-buff+8]='C'; /* replace T */
waby38 3:60fe58ad8c7d 143 buff[pos_t-buff+9]=' '; /* replace > */
waby38 3:60fe58ad8c7d 144 }
waby38 3:60fe58ad8c7d 145 pos_p=strstr(buff,"<PRESSI>");
waby38 3:60fe58ad8c7d 146 if(pos_p!=0) {
waby38 3:60fe58ad8c7d 147 float sensor_pres;
waby38 3:60fe58ad8c7d 148 char pres[3];
waby38 3:60fe58ad8c7d 149 press_temp->get_pressure(&sensor_pres);
waby38 3:60fe58ad8c7d 150 sprintf(pres, "%02d", (int)sensor_pres);
waby38 3:60fe58ad8c7d 151 buff[pos_p-buff]=' '; /* replace < */
waby38 3:60fe58ad8c7d 152 buff[pos_p-buff+1]=pres[0]; /* replace P */
waby38 3:60fe58ad8c7d 153 buff[pos_p-buff+2]=pres[1]; /* replace R */
waby38 3:60fe58ad8c7d 154 buff[pos_p-buff+3]='m'; /* replace E */
waby38 3:60fe58ad8c7d 155 buff[pos_p-buff+4]='B'; /* replace S */
waby38 3:60fe58ad8c7d 156 buff[pos_p-buff+5]='a'; /* replace S */
waby38 3:60fe58ad8c7d 157 buff[pos_p-buff+6]='r'; /* replace I */
waby38 3:60fe58ad8c7d 158 buff[pos_p-buff+7]=' '; /* replace > */
waby38 3:60fe58ad8c7d 159
davidDicko 1:2bddfc61380d 160 }
waby38 3:60fe58ad8c7d 161 pos_h=strstr(buff,"<HUM>");
waby38 3:60fe58ad8c7d 162 if(pos_h!=0) {
waby38 3:60fe58ad8c7d 163 float sensor_hum;
waby38 3:60fe58ad8c7d 164 char hum[3];
waby38 3:60fe58ad8c7d 165 hum_temp->get_humidity(&sensor_hum);
waby38 3:60fe58ad8c7d 166 sprintf(hum, "%02d", (int)sensor_hum);
waby38 3:60fe58ad8c7d 167 buff[pos_h-buff]=' '; /* replace < */
waby38 3:60fe58ad8c7d 168 buff[pos_h-buff+1]=hum[0]; /* replace H */
waby38 3:60fe58ad8c7d 169 buff[pos_h-buff+2]=hum[1]; /* replace U */
waby38 3:60fe58ad8c7d 170 buff[pos_h-buff+3]='\''; /* replace M */
waby38 3:60fe58ad8c7d 171 buff[pos_h-buff+4]=' '; /* replace > */
waby38 3:60fe58ad8c7d 172 }
waby38 3:60fe58ad8c7d 173 switch(panel_effect) {
waby38 3:60fe58ad8c7d 174 case SCROLL_RIGHT:
waby38 3:60fe58ad8c7d 175 pos_e=strstr(buff,"<F");
waby38 3:60fe58ad8c7d 176 buff[pos_e-buff+2]='F';
waby38 3:60fe58ad8c7d 177 buff[pos_e-buff+14]='F';
waby38 3:60fe58ad8c7d 178 break;
waby38 3:60fe58ad8c7d 179 case SCROLL_LEFT:
waby38 3:60fe58ad8c7d 180 pos_e=strstr(buff,"<F");
waby38 3:60fe58ad8c7d 181 buff[pos_e-buff+2]='E';
waby38 3:60fe58ad8c7d 182 buff[pos_e-buff+14]='E';
waby38 3:60fe58ad8c7d 183 break;
waby38 3:60fe58ad8c7d 184 case SCROLL_UP:
waby38 3:60fe58ad8c7d 185 pos_e=strstr(buff,"<F");
waby38 3:60fe58ad8c7d 186 buff[pos_e-buff+2]='I';
waby38 3:60fe58ad8c7d 187 buff[pos_e-buff+14]='I';
waby38 3:60fe58ad8c7d 188 break;
waby38 3:60fe58ad8c7d 189 case SCROLL_DOWN:
waby38 3:60fe58ad8c7d 190 pos_e=strstr(buff,"<F");
waby38 3:60fe58ad8c7d 191 buff[pos_e-buff+2]='J';
waby38 3:60fe58ad8c7d 192 buff[pos_e-buff+14]='J';
waby38 3:60fe58ad8c7d 193 break;
waby38 3:60fe58ad8c7d 194 case SCROLL_DEFAULT:
waby38 3:60fe58ad8c7d 195 /* No change */
waby38 3:60fe58ad8c7d 196 break;
waby38 3:60fe58ad8c7d 197 }
waby38 3:60fe58ad8c7d 198 panel_reset=strstr(buff,"<RES>");
waby38 3:60fe58ad8c7d 199 if(panel_reset!=0){
waby38 3:60fe58ad8c7d 200 sprintf(buff,"<ID00><D*>");
waby38 3:60fe58ad8c7d 201 }
waby38 3:60fe58ad8c7d 202
davidDicko 1:2bddfc61380d 203 for(i=6; i<strlen(buff); i++){
davidDicko 1:2bddfc61380d 204 checksum ^= buff[i];
davidDicko 1:2bddfc61380d 205 }
davidDicko 1:2bddfc61380d 206 sprintf(buff,"%s%02X<E>", buff, checksum);
waby38 3:60fe58ad8c7d 207
waby38 3:60fe58ad8c7d 208 uart1.printf("panel msg = %s pos_d@ %d\r\n", buff, pos_h-buff);
davidDicko 1:2bddfc61380d 209 uart_panel.printf(buff);
waby38 0:ff227fd5674f 210
waby38 3:60fe58ad8c7d 211 wait(0.1);
davidDicko 1:2bddfc61380d 212 checksum=0;
waby38 3:60fe58ad8c7d 213 if(panel_disppage < page-'A'+1){
waby38 3:60fe58ad8c7d 214 panel_disppage = page-'A'+1;
waby38 3:60fe58ad8c7d 215 sprintf(buff, "<ID00><TA>00010100009912302359");
davidDicko 1:2bddfc61380d 216
davidDicko 1:2bddfc61380d 217 for(i=0; i<panel_disppage; i++){
davidDicko 1:2bddfc61380d 218 sprintf(buff,"%s%c",buff,i+'A');
davidDicko 1:2bddfc61380d 219 }
davidDicko 1:2bddfc61380d 220 for(i=6; i<strlen(buff); i++){
davidDicko 1:2bddfc61380d 221 checksum ^= buff[i];
davidDicko 1:2bddfc61380d 222 }
davidDicko 1:2bddfc61380d 223 sprintf(buff,"%s%02X<E>", buff, checksum);
davidDicko 1:2bddfc61380d 224
waby38 3:60fe58ad8c7d 225 uart1.printf("panel msg = %s\r\n", buff);
waby38 3:60fe58ad8c7d 226
davidDicko 1:2bddfc61380d 227 uart_panel.printf(buff);
davidDicko 1:2bddfc61380d 228 }
davidDicko 1:2bddfc61380d 229 }
davidDicko 1:2bddfc61380d 230
waby38 3:60fe58ad8c7d 231 void periodicCallback(void){
waby38 3:60fe58ad8c7d 232 int32_t axes[3];
waby38 3:60fe58ad8c7d 233 panel_effect_e new_panel_effect;
waby38 3:60fe58ad8c7d 234 acc_gyro->get_x_axes(axes);
waby38 3:60fe58ad8c7d 235 new_panel_effect = SCROLL_DEFAULT;
waby38 3:60fe58ad8c7d 236
waby38 3:60fe58ad8c7d 237 accelerometer->enable();
waby38 3:60fe58ad8c7d 238 acc_gyro->enable_x();
waby38 0:ff227fd5674f 239
waby38 3:60fe58ad8c7d 240 // DEBUG("accelerometer : %d %d %d\r\n", axes[0], axes[1], axes[2]);
waby38 3:60fe58ad8c7d 241 if(axes[1]<-800){ /* move up */
waby38 3:60fe58ad8c7d 242 new_panel_effect = SCROLL_UP;
waby38 3:60fe58ad8c7d 243 }
waby38 3:60fe58ad8c7d 244 if(axes[1]>800){ /* move down */
waby38 3:60fe58ad8c7d 245 new_panel_effect = SCROLL_DOWN;
waby38 3:60fe58ad8c7d 246 }
waby38 3:60fe58ad8c7d 247 if(axes[0]<-800){ /* move to left */
waby38 3:60fe58ad8c7d 248 new_panel_effect = SCROLL_LEFT;
davidDicko 1:2bddfc61380d 249 }
waby38 3:60fe58ad8c7d 250 if(axes[0]>800){ /* move to right */
waby38 3:60fe58ad8c7d 251 new_panel_effect = SCROLL_RIGHT;
davidDicko 1:2bddfc61380d 252 }
waby38 3:60fe58ad8c7d 253 if(new_panel_effect != panel_effect){
waby38 3:60fe58ad8c7d 254 uint8_t i=0;
waby38 3:60fe58ad8c7d 255 panel_effect=new_panel_effect;
waby38 3:60fe58ad8c7d 256 /* while(strlen(panel_msg[i])){
waby38 3:60fe58ad8c7d 257 panel_sendmsg('1','A'+i,panel_msg[i]);
waby38 3:60fe58ad8c7d 258 i++;
waby38 3:60fe58ad8c7d 259 } */
waby38 3:60fe58ad8c7d 260 while(i<26){
waby38 3:60fe58ad8c7d 261 if(strlen(panel_msg[i])){
waby38 3:60fe58ad8c7d 262 panel_sendmsg('1','A'+i,panel_msg[i]);
waby38 3:60fe58ad8c7d 263 }
waby38 3:60fe58ad8c7d 264 i++;
waby38 3:60fe58ad8c7d 265 }
waby38 3:60fe58ad8c7d 266 }
waby38 3:60fe58ad8c7d 267
waby38 0:ff227fd5674f 268 }
waby38 0:ff227fd5674f 269
waby38 0:ff227fd5674f 270 /* UART */
waby38 0:ff227fd5674f 271 void uartRx(void)
waby38 0:ff227fd5674f 272 {
waby38 0:ff227fd5674f 273 if(uart1.readable()){
waby38 0:ff227fd5674f 274 uartBuff[uartBuffPos] = uart1.getc();
waby38 0:ff227fd5674f 275 if((uartBuff[uartBuffPos] == '\r') || (uartBuff[uartBuffPos] == '\n') || (uartBuffPos >= UART_BUFFER)) {
waby38 0:ff227fd5674f 276 uartBuff[uartBuffPos] = '\0';
waby38 0:ff227fd5674f 277 /* We are sending the whole string even if less than BLE_UART_SERVICE_MAX_DATA_LEN otherwise we need to wait */
waby38 0:ff227fd5674f 278 uartServicePtr->write(uartBuff, (uartBuffPos/UARTService::BLE_UART_SERVICE_MAX_DATA_LEN +1) * UARTService::BLE_UART_SERVICE_MAX_DATA_LEN);
waby38 0:ff227fd5674f 279 DEBUG("TX : %s\r\n", uartBuff);
waby38 3:60fe58ad8c7d 280 if(uartBuff[0]!='0'){
waby38 3:60fe58ad8c7d 281 strcpy(panel_msg[uartBuff[1]-'A'],&uartBuff[2]);
waby38 3:60fe58ad8c7d 282 }
davidDicko 1:2bddfc61380d 283 panel_sendmsg(uartBuff[0],uartBuff[1], &uartBuff[2]);
waby38 0:ff227fd5674f 284 memset(uartBuff, 0, UART_BUFFER);
davidDicko 1:2bddfc61380d 285 uartBuffPos = 0;
waby38 0:ff227fd5674f 286 }
waby38 0:ff227fd5674f 287 else
waby38 0:ff227fd5674f 288 uartBuffPos++;
waby38 0:ff227fd5674f 289 }
waby38 0:ff227fd5674f 290 }
waby38 0:ff227fd5674f 291
waby38 0:ff227fd5674f 292 /* BLE */
waby38 0:ff227fd5674f 293 void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params) {
waby38 0:ff227fd5674f 294 DEBUG("BLE Client Connected!\n\r");
waby38 0:ff227fd5674f 295 DEBUG("Please type a string and press return\r\n");
waby38 3:60fe58ad8c7d 296 led1 = 1;
waby38 0:ff227fd5674f 297 }
waby38 0:ff227fd5674f 298
waby38 0:ff227fd5674f 299 void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
waby38 0:ff227fd5674f 300 {
waby38 0:ff227fd5674f 301 (void)params;
waby38 0:ff227fd5674f 302 DEBUG("BLE Client Disconnected!\r\n");
waby38 0:ff227fd5674f 303 BLE::Instance().gap().startAdvertising(); // restart advertising
waby38 3:60fe58ad8c7d 304 led1= 0;
waby38 0:ff227fd5674f 305 }
waby38 0:ff227fd5674f 306
waby38 0:ff227fd5674f 307 void BleOnDataWrittenCallback(const GattWriteCallbackParams *params) {
waby38 0:ff227fd5674f 308 if (params->handle == uartServicePtr->getTXCharacteristicHandle()){
davidDicko 1:2bddfc61380d 309 DEBUG("RX: %s\r\n", (char *)params->data);
davidDicko 1:2bddfc61380d 310 strncpy(&BLEBuffRX[BLEBuffPos], (char *)params->data, params->len);
davidDicko 1:2bddfc61380d 311 BLEBuffPos+=params->len;
davidDicko 1:2bddfc61380d 312 if((params->len==UARTService::BLE_UART_SERVICE_MAX_DATA_LEN) && (BLEBuffRX[BLEBuffPos-1]!='\n')){
davidDicko 1:2bddfc61380d 313 return;
davidDicko 1:2bddfc61380d 314 }
davidDicko 1:2bddfc61380d 315 BLEBuffRX[BLEBuffPos-1]='\0';
davidDicko 1:2bddfc61380d 316 DEBUG("TX=>Panel: L%c P%c =>%s<=\r\n", BLEBuffRX[0],BLEBuffRX[1], &BLEBuffRX[2]);
waby38 3:60fe58ad8c7d 317 DEBUG("pos dans le pannel %x PANEL_PAGE_NUMBER%d\n\r",BLEBuffRX[1]-'A',PANEL_PAGE_NUMBER);
waby38 3:60fe58ad8c7d 318 if(BLEBuffRX[0]!='0'){
waby38 3:60fe58ad8c7d 319
waby38 3:60fe58ad8c7d 320 int dippage=BLEBuffRX[1]-'A';
waby38 3:60fe58ad8c7d 321 DEBUG("disppage: %x BLEBUFFRX=%d\n\r",dippage,BLEBuffRX[1]);
waby38 3:60fe58ad8c7d 322 strcpy(panel_msg[BLEBuffRX[1]-'A'],&BLEBuffRX[2]);
waby38 3:60fe58ad8c7d 323
waby38 3:60fe58ad8c7d 324 DEBUG("panel_MGS: %s \n\r",panel_msg[26]);
waby38 3:60fe58ad8c7d 325 }
davidDicko 1:2bddfc61380d 326 panel_sendmsg(BLEBuffRX[0],BLEBuffRX[1], &BLEBuffRX[2]);
waby38 3:60fe58ad8c7d 327 uart1.printf("%c\n",panel_msg);
davidDicko 1:2bddfc61380d 328 BLEBuffPos=0;
waby38 3:60fe58ad8c7d 329
waby38 3:60fe58ad8c7d 330
waby38 3:60fe58ad8c7d 331
waby38 0:ff227fd5674f 332 }
waby38 3:60fe58ad8c7d 333
waby38 0:ff227fd5674f 334 }
waby38 0:ff227fd5674f 335
waby38 3:60fe58ad8c7d 336
waby38 0:ff227fd5674f 337 void onBleError(ble_error_t error) {
waby38 0:ff227fd5674f 338 DEBUG("BLE Error: %d\r\n");
waby38 0:ff227fd5674f 339 /* Handle error now */
waby38 0:ff227fd5674f 340 }
waby38 0:ff227fd5674f 341
waby38 0:ff227fd5674f 342 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
waby38 0:ff227fd5674f 343 {
waby38 0:ff227fd5674f 344 BLE& ble = params->ble;
waby38 0:ff227fd5674f 345 ble_error_t error = params->error;
waby38 0:ff227fd5674f 346
waby38 0:ff227fd5674f 347 if (error != BLE_ERROR_NONE) {
waby38 0:ff227fd5674f 348 /* In case of error, forward the error handling to onBleInitError */
waby38 0:ff227fd5674f 349 onBleError(error);
waby38 0:ff227fd5674f 350 return;
waby38 0:ff227fd5674f 351 }
waby38 0:ff227fd5674f 352
waby38 0:ff227fd5674f 353 /* Ensure that it is the default instance of BLE */
waby38 0:ff227fd5674f 354 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
waby38 0:ff227fd5674f 355 return;
waby38 0:ff227fd5674f 356 }
waby38 0:ff227fd5674f 357
waby38 0:ff227fd5674f 358 ble.gap().onConnection(BleConnectionCallback);
waby38 0:ff227fd5674f 359 ble.gap().onDisconnection(BleDisconnectionCallback);
waby38 0:ff227fd5674f 360 ble.gattServer().onDataWritten(BleOnDataWrittenCallback);
waby38 0:ff227fd5674f 361
waby38 0:ff227fd5674f 362 DEBUG("BLE UARTService: ");
waby38 0:ff227fd5674f 363 /* Setup primary service. */
waby38 0:ff227fd5674f 364 UARTService uartService(ble);
waby38 0:ff227fd5674f 365 uartServicePtr = &uartService;
waby38 0:ff227fd5674f 366 DEBUG("Started\r\n");
waby38 0:ff227fd5674f 367
waby38 0:ff227fd5674f 368 /* setup advertising */
waby38 0:ff227fd5674f 369 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
waby38 0:ff227fd5674f 370 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
waby38 0:ff227fd5674f 371 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
davidDicko 1:2bddfc61380d 372 //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
waby38 0:ff227fd5674f 373 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
waby38 0:ff227fd5674f 374 ble.gap().setAdvertisingInterval(500); /* 500ms. */
waby38 0:ff227fd5674f 375 ble.gap().startAdvertising();
waby38 0:ff227fd5674f 376
waby38 0:ff227fd5674f 377 while (true) {
waby38 0:ff227fd5674f 378 ble.waitForEvent();
waby38 0:ff227fd5674f 379 }
waby38 0:ff227fd5674f 380 }
waby38 0:ff227fd5674f 381
waby38 0:ff227fd5674f 382 int main(void)
waby38 0:ff227fd5674f 383 {
waby38 3:60fe58ad8c7d 384 uint8_t i=0;
waby38 0:ff227fd5674f 385 led1=0;
waby38 3:60fe58ad8c7d 386 hum_temp->enable();
waby38 3:60fe58ad8c7d 387 press_temp->enable();
davidDicko 1:2bddfc61380d 388 uart_panel.baud(9600);
waby38 0:ff227fd5674f 389 uart1.baud(115200);
waby38 0:ff227fd5674f 390 uart1.attach(uartRx,Serial::RxIrq);
davidDicko 1:2bddfc61380d 391
waby38 3:60fe58ad8c7d 392 /* Init panel */
waby38 3:60fe58ad8c7d 393 while(strlen(panel_msg[i])){
waby38 3:60fe58ad8c7d 394 panel_sendmsg('1','A'+i,panel_msg[i]);
waby38 3:60fe58ad8c7d 395 i++;
waby38 3:60fe58ad8c7d 396 }
waby38 3:60fe58ad8c7d 397
waby38 3:60fe58ad8c7d 398 ticker.attach(periodicCallback, 2);
waby38 0:ff227fd5674f 399 BLE &ble = BLE::Instance();
waby38 0:ff227fd5674f 400 ble.init(bleInitComplete);
waby38 0:ff227fd5674f 401 }
waby38 0:ff227fd5674f 402