Example program for simple-mbed-client, connecting a device to mbed Device Connector.
Dependencies: C12832 FXOS8700Q simple-mbed-client
Fork of simple-mbed-client-example by
Diff: source/main.cpp
- Revision:
- 44:5a1db9f98f5f
- Parent:
- 40:6c039d073c0b
- Child:
- 45:cc5199df4b43
--- a/source/main.cpp Tue Mar 21 13:04:50 2017 +0100 +++ b/source/main.cpp Sat Apr 15 15:15:00 2017 +0000 @@ -2,90 +2,117 @@ #include "security.h" #include "easy-connect.h" #include "simple-mbed-client.h" +#include "C12832.h" +#include "FXOS8700Q.h" +// Using Arduino pin notation +C12832 lcd(D11, D13, D12, D7, D10); + +I2C i2c(PTE25, PTE24); +FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1); +FXOS8700QMagnetometer mag(i2c, FXOS8700CQ_SLAVE_ADDR1); + +Serial pc(USBTX, USBRX); SimpleMbedClient client; -// Declare peripherals -DigitalOut connectivityLed(LED2); // Blinks while connecting, turns solid when connected -DigitalOut augmentedLed(LED1, BUILTIN_LED_OFF); // LED that can be controlled through Connector -InterruptIn btn(MBED_CONF_APP_BUTTON); // Button that sends it's count to Connector +DigitalOut led(LED1); +DigitalOut blinkLed(LED2); +InterruptIn btn(MBED_CONF_APP_BUTTON); +Semaphore updates(0); -Ticker connectivityTicker; - -// Callback function when the pattern resource is updated void patternUpdated(string v) { printf("New pattern: %s\n", v.c_str()); } -// Define resources here. They act as normal variables, but are exposed to the internet... +void lcdTextUpdated(string v) { + if (v.length() > 30) { + v.erase(v.begin() + 30, v.end()); + } + printf("New text is %s\r\n", v.c_str()); + + lcd.cls(); + lcd.locate(0, 3); + lcd.printf(v.c_str()); +} + SimpleResourceInt btn_count = client.define_resource("button/0/clicks", 0, M2MBase::GET_ALLOWED); SimpleResourceString pattern = client.define_resource("led/0/pattern", "500:500:500:500:500:500:500", &patternUpdated); +SimpleResourceString lcd_text = client.define_resource("lcd/0/text", + "Hello from the cloud", M2MBase::GET_PUT_ALLOWED, true, &lcdTextUpdated); + void fall() { - btn_count = btn_count + 1; - printf("Button count is now %d\r\n", static_cast<int>(btn_count)); + updates.release(); } -void toggleConnectivityLed() { - connectivityLed = !connectivityLed; +void toggleLed() { + led = !led; } void registered() { - printf("Registered\r\n"); - - connectivityTicker.detach(); - connectivityLed = BUILTIN_LED_ON; + pc.printf("Registered\r\n"); +} +void unregistered() { + pc.printf("Unregistered\r\n"); } -void play(void* args) { - connectivityLed = BUILTIN_LED_OFF; +SimpleResourceInt aX = client.define_resource("accel/0/x", 0, M2MBase::GET_ALLOWED); +SimpleResourceInt aY = client.define_resource("accel/0/y", 0, M2MBase::GET_ALLOWED); +SimpleResourceInt aZ = client.define_resource("accel/0/z", 0, M2MBase::GET_ALLOWED); - // Parse the pattern string, and toggle the LED in that pattern - string s = static_cast<string>(pattern); - size_t i = 0; - size_t pos = s.find(':'); - while (pos != string::npos) { - wait_ms(atoi(s.substr(i, pos - i).c_str())); - augmentedLed = !augmentedLed; +void readAccel() { + acc.enable(); + + motion_data_counts_t acc_data; - i = ++pos; - pos = s.find(':', pos); + while (1) { + acc.getAxis(acc_data); - if (pos == string::npos) { - wait_ms(atoi(s.substr(i, s.length()).c_str())); - augmentedLed = !augmentedLed; - } + aX = acc_data.x; + aY = acc_data.y; + aZ = acc_data.z; + + pc.printf("ACC: X=%d Y=%d Z=%d\r\n", acc_data.x, acc_data.y, acc_data.z); + wait_ms(2000); } - - augmentedLed = BUILTIN_LED_OFF; - connectivityLed = BUILTIN_LED_ON; } int main() { - // SimpleClient gives us an event queue which we can use, running on a separate thread (see https://docs.mbed.com/docs/mbed-os-handbook/en/5.1/concepts/events/) - EventQueue* eventQueue = client.eventQueue(); + pc.baud(115200); - // Handle interrupts on the eventQueue - so we don't do things in interrupt context - btn.fall(eventQueue->event(&fall)); + lcdTextUpdated(static_cast<string>(lcd_text).c_str()); - // Toggle the built-in LED every second (until we're connected, see `registered` function) - connectivityTicker.attach(eventQueue->event(&toggleConnectivityLed), 1.0f); + Thread accelThread; + accelThread.start(&readAccel); - // Functions can be executed through mbed Device Connector via POST calls (also defer to the event thread, so we never block) - client.define_function("led/0/play", eventQueue->event(&play)); + btn.fall(&fall); - // Connect to the internet (see mbed_app.json for the connectivity method) + Ticker t; + t.attach(&toggleLed, 1.0f); + NetworkInterface* network = easy_connect(true); if (!network) { return 1; } - // Connect to mbed Device Connector - struct MbedClientOptions opts = client.get_default_options(); // opts contains information like the DeviceType + struct MbedClientOptions opts = client.get_default_options(); + opts.ServerAddress = MBED_SERVER_ADDRESS; + opts.DeviceType = "JansAccel"; bool setup = client.setup(opts, network); if (!setup) { printf("Client setup failed\n"); return 1; } + client.on_registered(®istered); + client.on_unregistered(&unregistered); + + while (1) { + int v = updates.wait(25000); + if (v == 1) { + btn_count = btn_count + 1; + printf("Button count is now %d\n", static_cast<int>(btn_count)); + } + //client.keep_alive(); + } }