Tema SCPI Negru Rares-Razvan
Dependencies: BLE_API mbed nRF51822
Fork of nRF51822_TemperatureEx by
Diff: main.cpp
- Revision:
- 12:7772974713ac
- Parent:
- 11:baafa4f7a15e
- Child:
- 13:bd15c17003e7
diff -r baafa4f7a15e -r 7772974713ac main.cpp --- a/main.cpp Fri May 06 18:14:18 2016 +0000 +++ b/main.cpp Sat Oct 08 10:30:15 2016 +0000 @@ -21,17 +21,17 @@ * The application works with the BLEController iOS/Android App. * Type something from the Terminal to send * to the BLEController App or vice verse. - * Characteristics received from App will print on Terminal. * Read read_me.md file for more informations about the extended feature */ #include "ble/BLE.h" -//#include "LowPowerTicker.h" #include <myData.h> #include <Gap.h> -//#include "ble_flash.h" #include "ble_flash.c" +#include "BatteryService.h" + +BLE ble; #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */ #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */ @@ -41,9 +41,9 @@ #define MyASSERT(cond , serialpc, errVal) assert_error_app((bool)cond, serialpc, (uint16_t)errVal, __LINE__, __FILE__) -BLE ble; +Serial pc(USBTX, USBRX); -Serial pc(USBTX, USBRX); +uint8_t batteryLevel=100; // The Nordic UART Service static const uint8_t uart_base_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E}; @@ -51,16 +51,20 @@ static const uint8_t uart_rx_uuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E}; static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71}; -static const int8_t txPower = 0xCD; +static const int8_t txPower = 0x1E; +BatteryService *batteryService = NULL; -uint8_t txPayload[TXRX_BUF_LEN] = {0, p28}; +uint8_t txPayload[TXRX_BUF_LEN] = {0,}; uint8_t rxPayload[TXRX_BUF_LEN] = {0,}; +char myBuf[TXRX_BUF_LEN]; +uint16_t len; static uint8_t rx_buf[TXRX_BUF_LEN]; static uint8_t rx_len=0; static uint32_t gTimeInstant = 1; // TimerTick Resolution, in seconds + bool g_bIsConnected = false; bool g_bIsAdvertising = false; bool g_bConnDisabled = false; @@ -68,22 +72,21 @@ static myDataLog_t g_MyData; uint8_t g_MyDataIdx=0; + + // pins connected for measuring + DigitalOut led(LED1); -PwmOut buzzer(p15); -InterruptIn event(p29); // button -AnalogIn VP3(A3); -AnalogIn VP4(A4); -AnalogIn VP5(A5); -AnalogIn* VP[3]= {&VP3,&VP4,&VP5}; -#define NUM_OF_READINGS (4u) -myPayload_t g_currMeasures; // last measurements +// voltage for the termic resistor +AnalogIn Vin(A5); + +myPayload_t g_currMeasures2; // last measurements Timeout timeout_err; // timeout for buzz on error Ticker periodicActions; - +bool bNewSample = false; mdatetime_manager_t g_myDateTimeVar; - +uint8_t gBatteryValue=0; GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE); GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); @@ -92,6 +95,17 @@ GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *)); +void at_timeout_err() +{ + // stop buzz + +} + +void alarm(){ + + //timeout_err.attach(&at_timeout_err, 2); +} + void sendRadioMsg(const uint8_t* buf, uint16_t length) { uint8_t retVal; @@ -119,11 +133,6 @@ g_bIsAdvertising = false; } -void at_timeout_err() -{ - // stop buzz - buzz_int(&buzzer, 0,0); -} void connectionUpdate(connection_update_t option) { if (g_bConnDisabled == false) { @@ -158,9 +167,8 @@ } } } -void write_data_to_flash(uint32_t *tick) +void write_data_to_flash(uint32_t *tick, myPayload_t * currMeasures) { - uint32_t retVal=0; uint8_t page_num=0; if (g_MyDataIdx==0) { @@ -168,26 +176,29 @@ connectionUpdate(eStartAdvertising); // time and date used to initialize the g_MyData variable memcpy(&g_MyData.startData.datetime,&g_myDateTimeVar.currentDateTime, sizeof(mdate_time_t)); - memcpy(&g_MyData.startData.data,&g_currMeasures, sizeof(myPayload_t)); + memcpy(&g_MyData.startData.data,currMeasures, sizeof(myPayload_t)); } else { // it should be logged here the time difference from last record... g_MyData.myData[g_MyDataIdx-1].minutes = (uint16_t)(*tick*gTimeInstant / 60); g_MyData.myData[g_MyDataIdx-1].seconds = (*tick*gTimeInstant% 60); - memcpy(&g_MyData.myData[g_MyDataIdx-1].data,&g_currMeasures, sizeof(myPayload_t)); + memcpy(&g_MyData.myData[g_MyDataIdx-1].data,currMeasures, sizeof(myPayload_t)); } *tick = 0; - if (g_MyDataIdx==(MAXBUFFER-5)) { + if (g_MyDataIdx==(MAXBUFFER-3)) { //initiate disconnection connectionUpdate(eDisconnect); } if (g_MyDataIdx == MAXBUFFER) { // write2Flash the current page num + //connectionUpdate(eDisconnect); + page_num=flash_currPage(); // write2Flash the current page data - retVal=ble_flash_page_write(page_num, (uint32_t*)&(g_MyData), 251u); - pc.printf("retValWr: %d, Pg:%d, Min: %d \r\n",retVal, page_num,g_myDateTimeVar.currentDateTime.minutes); + ble_flash_page_write(page_num, (uint32_t*)&(g_MyData), 251u); + memset(&g_MyData,0,sizeof(myDataLog_t)); + //pc.printf("retValWr: %d, Pg:%d, Min: %d \r\n",retVal, page_num,g_myDateTimeVar.currentDateTime.minutes); flash_go_nextPage(); } g_MyDataIdx = (g_MyDataIdx+1)%(MAXBUFFER+1); @@ -196,11 +207,9 @@ void on_error_radioMsg() { - char myBuf[TXRX_BUF_LEN]; - sprintf(myBuf,"%s","WrongSyntax"); - buzz_int(&buzzer,5,3); - timeout_err.attach(&at_timeout_err, 2); + //buzz_int(&buzzer,5,3); + //timeout_err.attach(&at_timeout_err, 2); sendRadioMsg((uint8_t*)&myBuf[0], 12); } @@ -215,89 +224,155 @@ memcpy((uint32_t*)&initialData, p_curr_addr, 6*sizeof(uint32_t)); pdate = &initialData.startData.datetime; pc.printf("20%2d_%2d_%2d H:%2d P:%4x\r",pdate->year, pdate->month, pdate->day, pdate->hours, p_curr_addr); - pc.printf("%2d:%2d;%3d;%3d;%3d \r",pdate->minutes, pdate->seconds, initialData.startData.data.light, initialData.startData.data.gndV, initialData.startData.data.temp); - pc.printf("%2d:%2d;%3d;%3d;%3d;%2d\r",initialData.myData.minutes, initialData.myData.seconds, initialData.myData.data.light, initialData.myData.data.gndV, initialData.myData.data.temp); + pc.printf("%2d:%2d;%3d;%3d;%3d;\r",pdate->minutes, pdate->seconds, initialData.startData.data.x, initialData.startData.data.y, initialData.startData.data.z); + pc.printf("%2d:%2d;%3d;%3d;%3d;%3d\r",initialData.myData.minutes, initialData.myData.seconds, initialData.myData.data.x, initialData.myData.data.y, initialData.myData.data.z,initialData.myData.data.temp); p_curr_addr += 6; for (i=0; i<49; i++) { memcpy((uint32_t*)&dataOut, p_curr_addr, 5*sizeof(uint32_t)); - pc.printf("%2d:%2d;%3d;%3d;%3d;%2d\r",dataOut[0].minutes, dataOut[0].seconds, dataOut[0].data.light, dataOut[0].data.gndV, dataOut[0].data.temp, i); - pc.printf("%2d:%2d;%3d;%3d;%3d\r",dataOut[1].minutes, dataOut[1].seconds, dataOut[1].data.light, dataOut[1].data.gndV, dataOut[1].data.temp); + pc.printf("%2d:%2d;%3d;%3d;%3d;%3d\r",dataOut[0].minutes, dataOut[0].seconds, dataOut[0].data.x, dataOut[0].data.y, dataOut[0].data.z,dataOut[0].data.temp); + pc.printf("%2d:%2d;%3d;%3d;%3d;%3d\r",dataOut[1].minutes, dataOut[1].seconds, dataOut[1].data.x, dataOut[1].data.y, dataOut[1].data.z,dataOut[1].data.temp); p_curr_addr += 5; } } -int update_measurements() -{ - int retVal; - static myPayload_t prevMeasures=(myPayload_t) { - 0, 0, 0, 0, 0 - }; +int sign(int nr){ + int retVal=0; + if (nr>0) retVal=1; + else if (nr<0) retVal=-1; + + return retVal; +} + +float read_real_value(void){ + uint32_t wrk,reg0,reg1,reg2; + reg0 = NRF_ADC->ENABLE; // save register value + reg1 = NRF_ADC->CONFIG; // save register value + reg2 = NRF_ADC->RESULT; // save register value + NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled; + NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) | + (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) | + (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) | + (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) | + (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos); + NRF_ADC->EVENTS_END = 0; + NRF_ADC->TASKS_START = 1; + while (!NRF_ADC->EVENTS_END) {;} + wrk = NRF_ADC->RESULT; // 10 bit result + NRF_ADC->ENABLE = reg0; // recover register value + NRF_ADC->CONFIG = reg1; // recover register value + NRF_ADC->RESULT = reg2; // recover register value + NRF_ADC->EVENTS_END = 0; + return ((float)wrk / 1024 * 1.2 * 3.0); +} - g_currMeasures = (myPayload_t) { - VP[0]->read_u16(), VP[2]->read_u16(), VP[1]->read_u16(), led, 0 - }; - retVal = memcmp(&g_currMeasures,&prevMeasures,sizeof(myPayload_t)); - memcpy(&prevMeasures,&g_currMeasures,sizeof(myPayload_t)); - return retVal; +uint8_t read100(void) +{ + float wrk_vdd, v0p= 2.7 ,v100p= 3.3; + wrk_vdd = read_real_value(); + /*if (wrk_vdd <= v0p){ + return 0; + } else if (wrk_vdd >= v100p){ + led = 0; + return 100; + } */ + led = 1; + wrk_vdd = (wrk_vdd - v0p) / (v100p - v0p); + return (uint8_t)(wrk_vdd * 100); } +void update_measurements() +{ + uint32_t resistance; + int32_t tempValue; + + // use Vin.read() o read the voltage from the AI5 pin + // fell free to the fill code in this function .... + // aditionally you can declare globals variables at the begining of the file or in myData.h + + + + + + // print on the bluetooth communication the value of Temperature computed in Celsius degrees + sprintf(myBuf,"T:%3d.%2d;%d;\r", tempValue/100,tempValue%100,resistance); + len = 20; + sendRadioMsg((uint8_t *)myBuf, len); +} + + void at_eachInstant() { static uint32_t tick=0; - int retVal; + //const uint8_t sizeB= 3*sizeof(uint16_t); + //static myPayload_t prevMeasures2=(myPayload_t) { 0, 0, 0, 0}; // update time update_time(&g_myDateTimeVar, gTimeInstant); - + //sendRadioMsg("Tick\r", 5); + batteryService->updateBatteryLevel(read100()); //update measurements - retVal = update_measurements(); - + if (g_bIsConnected==true){ + update_measurements(); + } + if (g_LogActive==true){ // if there are changes in data save - if ((retVal!=0)&&(g_LogActive==true)) { - write_data_to_flash(&tick); + //g_currMeasures2.temp = Temp.read_u16(); + //if (memcmp(&prevMeasures2, &g_currMeasures2, sizeB)!=0) + if (bNewSample == true) + //if (update_measurements()==1) + { + bNewSample = false; + write_data_to_flash(&tick, &g_currMeasures2); + //memcpy(&prevMeasures2,&g_currMeasures2,sizeB); + // + //write_data_to_flash(&tick, &g_currMeasures2); + } + tick++; } - tick++; } + // Radio commands decode void decode(uint8_t * buffer, uint16_t length) { - uint16_t len; - char myBuf[TXRX_BUF_LEN]; - switch (buffer[0]) { - case 'i': {// Analog Input Read Request + case 'r': {// Read Operations switch (buffer[1]) { case '0': { // display all inputs - sprintf(myBuf,"All:%3d,%3d,%3d,%2d", g_currMeasures.light,g_currMeasures.gndV,g_currMeasures.temp,g_currMeasures.led_on); - len = 18; + sprintf(myBuf,"Id1:%d,%d,%d,%d\r\n", g_currMeasures2.x,g_currMeasures2.y,g_currMeasures2.z,g_currMeasures2.temp); + len = 20; break; } case '1': { - sprintf(myBuf,"Input 1 = %3d", g_currMeasures.light); - len = 13; + sprintf(myBuf,"Id2:%d,%d,%d\r\n", g_currMeasures2.x,g_currMeasures2.y,g_currMeasures2.z); + len = 20; break; } case '2': { - sprintf(myBuf,"Input 2 = %3d", g_currMeasures.gndV); - len = 13; + sprintf(myBuf,"V:%2.3f\r\n", read_real_value()); + len = 11; break; } case '3': { - sprintf(myBuf,"Input 3 = %3d", g_currMeasures.temp); - len = 13; + sprintf(myBuf,"T = %3d\r\n", g_currMeasures2.temp); + len = 10; break; } - case '4': { - sprintf(myBuf,"Input 4 = %2d", g_currMeasures.led_on); - len = 12; + case '4':{ + // sprintf(myBuf,"F1=%2d\r\n",FILTER_COEF1); + len = 7; + break; + } + case '5':{ + //sprintf(myBuf,"Acc=%2d\r\n",gAccAmp); + len = 8; break; } default: { - sprintf(myBuf,"All:%3d,%3d,%3d,%2d", g_currMeasures.light,g_currMeasures.gndV,g_currMeasures.temp,g_currMeasures.led_on); - len = 18; + sprintf(myBuf,"Nothing \r\n"); + len = 10; break; } } @@ -315,18 +390,24 @@ } sendRadioMsg((uint8_t *)myBuf, len); break; - } - case 's': {// buzzer - if (((buffer[1]>'9')||(buffer[1]<'0'))||((buffer[2]>'9')||(buffer[2]<'0'))) { - MyASSERT(true,&pc, buffer[1]); // notify on serial interface - on_error_radioMsg(); // notify on radio - break; - } else { - buzz_int(&buzzer, (buffer[1]-'0'),(buffer[2]-'0')); - sprintf(myBuf,"%s:%f","S",buzzer.read()); - len= 7; + } + case 'i':{ // Insert data values + switch (buffer[1]){ + case 'f':{ + memcpy(myBuf,&buffer[2],2); + //FILTER_COEF1=atoi(myBuf); // TODO check if it is a number + break; + } + case 'a':{ + memcpy(myBuf,&buffer[2],2); + //gAccAmp = atoi(myBuf); + break; + } + + default: { + // on_error_radioMsg(); // notify on radio + } } - sendRadioMsg((uint8_t *)myBuf, len); break; } case 'd': @@ -385,13 +466,25 @@ len = 12; sendRadioMsg((uint8_t *)myBuf, len); g_LogActive = true; + break; } case '3': { // stop measuring + //measureSampling.detach(); sprintf(myBuf,"Stop Meas"); len = 11; sendRadioMsg((uint8_t *)myBuf, len); g_LogActive = false; + ble_flash_page_write(flash_currPage(), (uint32_t*)&(g_MyData), 251u); + memset(&g_MyData,0,sizeof(myDataLog_t)); + flash_go_nextPage(); + break; + } + case '4':{ + break; + } + case '5':{ // read one measure + break; } default: { @@ -551,23 +644,29 @@ ble.onDisconnection(disconnectionCallback); ble.onConnection(connectionCallback); ble.onDataWritten(WrittenHandler); - event.rise(&button); - + //event.rise(&button); + + + //event.rise(&accInt1); pc.baud(19200); pc.printf("SimpleChat Init \r\n"); - + + //mma1 = Adafruit_MMA8451(); + //mma2 = Adafruit_MMA8451(); + //init_Acc(); + pc.attach( uartCB , pc.RxIrq); // setup advertising ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, - (const uint8_t *)"MyBleVT", sizeof("MyBleVT") - 1); + (const uint8_t *)"BleTp", sizeof("BleTp") - 1); ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid)); //ble.accumulateAdvertisingPayload(GapAdvertisingData::TX_POWER_LEVEL,(const uint8_t *)txPower, sizeof(txPower)); ble.setTxPower(txPower); // 100ms; in multiples of 0.625ms. - ble.setAdvertisingInterval(160); + ble.setAdvertisingInterval(320); /* // activate radio notifications - usefull for flashwrite void (*ptrFunc)(bool); @@ -576,9 +675,12 @@ //ble.onRadioNotification(ptrFunc); */ ble.addService(uartService); + batteryService = new BatteryService(ble, batteryLevel); ble.startAdvertising(); - pc.printf("Advertising Start \r\n"); - periodicActions.attach(&at_eachInstant,gTimeInstant); + pc.printf("Advertising Start \r\n"); + periodicActions.attach(&at_eachInstant,gTimeInstant); + gBatteryValue = read100(); + while(1) { ble.waitForEvent(); }