Basic output of force sensor data to serial, in form "value1/n"

Dependencies:   mbed BLE_API nRF51822

Committer:
jstroud
Date:
Tue Nov 25 04:57:36 2014 +0000
Revision:
6:dac42d8a8752
Parent:
5:19acba8bb777
Updated code with non-blocking sensor reading, fixed bluetooth, added "sleep when not connected to BLE" feature; ; Serial output format: "132" where 1 is sensor number, 32 is value from 0 - 99 of force sensor 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jstroud 0:44196fc76b4f 1 #include "mbed.h"
pgao 3:d37edebcc9e6 2 #include "BLEDevice.h"
pgao 3:d37edebcc9e6 3 #include <string>
pgao 3:d37edebcc9e6 4 #include "UARTService.h"
jstroud 0:44196fc76b4f 5
pgao 3:d37edebcc9e6 6 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
pgao 3:d37edebcc9e6 7 * it will have an impact on code-size and power consumption. */
jstroud 0:44196fc76b4f 8 Serial pc(USBTX, USBRX);
pgao 3:d37edebcc9e6 9
pgao 3:d37edebcc9e6 10 #if NEED_CONSOLE_OUTPUT
pgao 3:d37edebcc9e6 11 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
pgao 3:d37edebcc9e6 12 #else
pgao 3:d37edebcc9e6 13 #define DEBUG(...) /* nothing */
pgao 3:d37edebcc9e6 14 #endif /* #if NEED_CONSOLE_OUTPUT */
pgao 3:d37edebcc9e6 15
pgao 3:d37edebcc9e6 16 BLEDevice ble;
pgao 3:d37edebcc9e6 17 DigitalOut led1(LED1);
pgao 3:d37edebcc9e6 18 DigitalOut led2(LED2);
pgao 3:d37edebcc9e6 19
jstroud 1:d80d9ec38f57 20 AnalogIn strut1Force(P0_1);
jstroud 1:d80d9ec38f57 21 AnalogIn strut2Force(P0_2);
jstroud 1:d80d9ec38f57 22 AnalogIn strut3Force(P0_3);
pgao 3:d37edebcc9e6 23 AnalogIn strut4Force(P0_4);
jstroud 5:19acba8bb777 24 AnalogIn seatForce(P0_5);
jstroud 5:19acba8bb777 25 AnalogIn cupBottomForce(P0_6);
jstroud 5:19acba8bb777 26 AnalogIn sensors[6] = {strut1Force, strut2Force, strut3Force, strut4Force, seatForce, cupBottomForce};
jstroud 6:dac42d8a8752 27
jstroud 6:dac42d8a8752 28 static volatile bool triggerSensorPolling = false;
jstroud 6:dac42d8a8752 29
jstroud 6:dac42d8a8752 30 float sensorValues[6];
jstroud 6:dac42d8a8752 31
jstroud 6:dac42d8a8752 32 char buffer[6];
pgao 3:d37edebcc9e6 33
pgao 3:d37edebcc9e6 34 UARTService *uartServicePtr;
pgao 3:d37edebcc9e6 35
pgao 3:d37edebcc9e6 36 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
pgao 3:d37edebcc9e6 37 {
pgao 3:d37edebcc9e6 38 DEBUG("Disconnected!\n\r");
pgao 3:d37edebcc9e6 39 DEBUG("Restarting the advertising process\n\r");
pgao 3:d37edebcc9e6 40 ble.startAdvertising();
pgao 3:d37edebcc9e6 41 }
pgao 3:d37edebcc9e6 42
jstroud 6:dac42d8a8752 43
pgao 3:d37edebcc9e6 44 void onDataWritten(const GattCharacteristicWriteCBParams *params)
pgao 3:d37edebcc9e6 45 {
jstroud 6:dac42d8a8752 46 //doSomething
jstroud 6:dac42d8a8752 47 /*
pgao 3:d37edebcc9e6 48 if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) {
pgao 3:d37edebcc9e6 49 uint16_t bytesRead = params->len;
pgao 3:d37edebcc9e6 50 DEBUG("received %u bytes\n\r", bytesRead);
pgao 3:d37edebcc9e6 51 DEBUG("first byte received: %u\n\r", params->data[0]);
pgao 3:d37edebcc9e6 52 if (params->data[0] == '1') {
pgao 3:d37edebcc9e6 53 led2 = 1;
pgao 3:d37edebcc9e6 54 powerSwitch = 1;
pgao 3:d37edebcc9e6 55 } else if (params->data[0] == '0') {
pgao 3:d37edebcc9e6 56 led2 = 0;
pgao 3:d37edebcc9e6 57 powerSwitch = 0;
pgao 3:d37edebcc9e6 58 }
jstroud 5:19acba8bb777 59 char buffer[4];
jstroud 5:19acba8bb777 60 DEBUG("%1.2f,%1.2f,%1.2f,%1.2f,%1.2f,%1.2f\n", strut1Force.read(), strut2Force.read(), strut3Force.read(), strut4Force.read(), seatForce.read(), cupBottomForce.read());
pgao 3:d37edebcc9e6 61 // sprintf(buffer, "%1.2f,%1.2f,%1.2f,%1.2f\n", strut1Force.read(), strut2Force.read(), strut3Force.read(), strut4Force.read());
jstroud 6:dac42d8a8752 62 //ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t *)buffer, sizeof(&buffer));
jstroud 5:19acba8bb777 63 for(int i=0; i <= 5; i++)
jstroud 5:19acba8bb777 64 {
jstroud 6:dac42d8a8752 65 sprintf(buffer, "%1.2f\n", sensors[i].read());
jstroud 5:19acba8bb777 66 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t *)buffer, sizeof(&buffer));
jstroud 5:19acba8bb777 67 }
pgao 3:d37edebcc9e6 68 }
jstroud 6:dac42d8a8752 69 */
pgao 3:d37edebcc9e6 70 }
pgao 3:d37edebcc9e6 71
pgao 3:d37edebcc9e6 72 void periodicCallback(void)
pgao 3:d37edebcc9e6 73 {
pgao 3:d37edebcc9e6 74 led1 = !led1;
jstroud 6:dac42d8a8752 75 triggerSensorPolling = true;
pgao 3:d37edebcc9e6 76 }
jstroud 0:44196fc76b4f 77
jstroud 0:44196fc76b4f 78 int main(void)
jstroud 0:44196fc76b4f 79 {
jstroud 5:19acba8bb777 80
pgao 3:d37edebcc9e6 81 led1 = 1;
pgao 3:d37edebcc9e6 82 led2 = 0;
pgao 3:d37edebcc9e6 83 Ticker ticker;
pgao 3:d37edebcc9e6 84 ticker.attach(periodicCallback, 1);
pgao 3:d37edebcc9e6 85
pgao 3:d37edebcc9e6 86 DEBUG("Initialising the nRF51822\n\r");
pgao 3:d37edebcc9e6 87 ble.init();
pgao 3:d37edebcc9e6 88 ble.onDisconnection(disconnectionCallback);
pgao 3:d37edebcc9e6 89 ble.onDataWritten(onDataWritten); // called when someone writes to me
pgao 3:d37edebcc9e6 90
pgao 3:d37edebcc9e6 91 /* setup advertising */
pgao 3:d37edebcc9e6 92 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
pgao 3:d37edebcc9e6 93 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
pgao 3:d37edebcc9e6 94 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
pgao 3:d37edebcc9e6 95 (const uint8_t *)"pgao", sizeof("pgao") - 1);
pgao 3:d37edebcc9e6 96 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
pgao 3:d37edebcc9e6 97 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
pgao 3:d37edebcc9e6 98
pgao 3:d37edebcc9e6 99 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
pgao 3:d37edebcc9e6 100 ble.startAdvertising();
pgao 3:d37edebcc9e6 101
pgao 3:d37edebcc9e6 102 UARTService uartService(ble);
pgao 3:d37edebcc9e6 103 uartServicePtr = &uartService;
pgao 3:d37edebcc9e6 104
jstroud 0:44196fc76b4f 105 while (true) {
jstroud 6:dac42d8a8752 106 if(triggerSensorPolling /*&& ble.getGapState().connected*/ && uartServicePtr != NULL) {
jstroud 6:dac42d8a8752 107 triggerSensorPolling = false;
jstroud 6:dac42d8a8752 108
jstroud 6:dac42d8a8752 109 for(int i = 0; i < 6; i++) {
jstroud 6:dac42d8a8752 110 sensorValues[i] = sensors[i].read()*100;
jstroud 6:dac42d8a8752 111 if(sensorValues[i] == 100) sensorValues[i] = 99;
jstroud 6:dac42d8a8752 112
jstroud 6:dac42d8a8752 113 sprintf(buffer, "%d%2.0f", i,sensorValues[i]);
jstroud 6:dac42d8a8752 114 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t *)buffer, sizeof(&buffer));
jstroud 6:dac42d8a8752 115 }
jstroud 6:dac42d8a8752 116 DEBUG("trying to write values:\n%1.2f,%1.2f,%1.2f,%1.2f,%1.2f,%1.2f\n", strut1Force.read(), strut2Force.read(), strut3Force.read(), strut4Force.read(), seatForce.read(), cupBottomForce.read());
jstroud 6:dac42d8a8752 117
jstroud 6:dac42d8a8752 118 // do something
jstroud 6:dac42d8a8752 119 }
pgao 3:d37edebcc9e6 120 ble.waitForEvent();
jstroud 0:44196fc76b4f 121 }
jstroud 0:44196fc76b4f 122 }
pgao 3:d37edebcc9e6 123
jstroud 0:44196fc76b4f 124