An application to log WiFi SSIDs for position lookup testing
Dependencies: C027_Support SWO mbed-rtos mbed picojson
Fork of lpc4088_ebb_ublox_Cellular_PubNubDemo_rtos by
Revision 1:cac9b2960637, committed 2015-02-15
- Comitter:
- rosterloh84
- Date:
- Sun Feb 15 22:04:12 2015 +0000
- Parent:
- 0:713518ea5028
- Commit message:
- First working version. Lots to do still.
Changed in this revision
--- a/C027_Support.lib Wed Oct 01 11:39:10 2014 +0000 +++ b/C027_Support.lib Sun Feb 15 22:04:12 2015 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/teams/ublox/code/C027_Support/#f524fd9aa13d +http://mbed.org/teams/ublox/code/C027_Support/#74e4e0109a9e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ConfigurationProperties.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,33 @@
+#include "ConfigurationProperties.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+ConfigurationProperties::ConfigurationProperties(DeviceConfiguration& deviceConfiguration) :
+ _deviceConfiguration(deviceConfiguration)
+{
+}
+
+bool ConfigurationProperties::resetConfiguration()
+{
+ return (_deviceConfiguration.clear(), _deviceConfiguration.set("interval", CONFIGURATION_PROPERTY_INTERVAL));
+}
+
+bool ConfigurationProperties::validateProperties()
+{
+ return (readInterval() > 0);
+}
+
+int ConfigurationProperties::readInterval()
+{
+ const char *prop; int res, ln;
+
+ if ((prop = _deviceConfiguration.get("interval")) == NULL)
+ prop = CONFIGURATION_PROPERTY_INTERVAL;
+
+ ln = -1;
+ if ((sscanf(prop, "%d%n", &res, &ln) != 1) || (ln != strlen(prop)))
+ return 0;
+
+ return res;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ConfigurationProperties.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,20 @@
+#pragma once
+
+#include <stddef.h>
+#include "DeviceConfiguration.h"
+
+#define CONFIGURATION_PROPERTY_INTERVAL "300"
+
+class ConfigurationProperties
+{
+public:
+ ConfigurationProperties(DeviceConfiguration&);
+
+ bool resetConfiguration();
+ bool validateProperties();
+
+ int readInterval();
+
+private:
+ DeviceConfiguration& _deviceConfiguration;
+};
--- a/EALib.lib Wed Oct 01 11:39:10 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://mbed.org/users/embeddedartists/code/EALib/#b3a179cc3d88
--- a/LM75B.lib Wed Oct 01 11:39:10 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/neilt6/code/LM75B/#7ac462ba84ac
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MbedAgent.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,55 @@
+#include "MbedAgent.h"
+#include "rtos.h"
+
+MbedAgent::MbedAgent(DeviceIO& io, MDMSerial& mdm, DeviceInfo& deviceInfo, DeviceMemory& deviceMemory) :
+ _io(io),
+ _mdm(mdm),
+ _deviceInfo(deviceInfo),
+ _deviceMemory(deviceMemory),
+ _configurationProperties(_deviceConfiguration),
+ _signalQualityMeasurement(_deviceInfo),
+ _analogMeasurement(_io.analog1(), _io.analog2()),
+ _locationUpdate(_io.gpsTracker())
+{
+}
+
+bool MbedAgent::init()
+{
+ if ((!_signalQualityMeasurement.init()) ||
+ (!_analogMeasurement.init()) ||
+ (!_locationUpdate.init())) {
+ puts("Initialization failed.");
+ return false;
+ }
+ return true;
+}
+
+bool MbedAgent::run()
+{
+ // add some config setup if needed
+
+ loop();
+
+ return true;
+}
+
+void MbedAgent::loop()
+{
+ Timer timer; int interval;
+
+ timer.start();
+ while (true) {
+ timer.reset();
+
+ _signalQualityMeasurement.run();
+ _analogMeasurement.run();
+ _locationUpdate.run();
+
+ if ((interval = _configurationProperties.readInterval()) == 0)
+ break;
+
+ while (timer.read() < interval) {
+ Thread::yield();
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MbedAgent.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,35 @@
+#pragma once
+
+#include <stddef.h>
+#include "MDM.h"
+#include "DeviceIO.h"
+#include "DeviceInfo.h"
+#include "DeviceMemory.h"
+#include "DeviceConfiguration.h"
+#include "ConfigurationProperties.h"
+#include "SignalQualityMeasurement.h"
+#include "AnalogMeasurement.h"
+#include "LocationUpdate.h"
+
+class MbedAgent
+{
+public:
+ MbedAgent(DeviceIO&, MDMSerial&, DeviceInfo&, DeviceMemory&);
+
+ bool init();
+ bool run();
+
+protected:
+ void loop();
+
+private:
+ DeviceIO& _io;
+ MDMSerial& _mdm;
+ DeviceInfo& _deviceInfo;
+ DeviceMemory& _deviceMemory;
+ DeviceConfiguration _deviceConfiguration;
+ ConfigurationProperties _configurationProperties;
+ SignalQualityMeasurement _signalQualityMeasurement;
+ AnalogMeasurement _analogMeasurement;
+ LocationUpdate _locationUpdate;
+};
--- a/PubNub.lib Wed Oct 01 11:39:10 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/embeddedartists/code/PubNub/#55eb53c78b47
--- a/PubNubDemo.cpp Wed Oct 01 11:39:10 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,313 +0,0 @@
-#include <cstring>
-
-#include "mbed.h"
-#include "rtos.h"
-//#include "C12832.h"
-//#include "MMA7660.h"
-#include "MMA7455.h"
-#include "LM75B.h"
-
-#include "picojson.h"
-#include "PubNub.h"
-
-#include "sdram.h"
-
-//------------------------------------------------------------------------------------
-// You need to configure these cellular modem / SIM parameters.
-// These parameters are ignored for LISA-C200 variants and can be left NULL.
-//------------------------------------------------------------------------------------
-#include "MDM.h"
-//! Set your secret SIM pin here (e.g. "1234"). Check your SIM manual.
-#define SIMPIN NULL
-/*! The APN of your network operator SIM, sometimes it is "internet" check your
- contract with the network operator. You can also try to look-up your settings in
- google: https://www.google.de/search?q=APN+list */
-#define APN "online.telia.se"
-//! Set the user name for your APN, or NULL if not needed
-#define USERNAME NULL
-//! Set the password for your APN, or NULL if not needed
-#define PASSWORD NULL
-//------------------------------------------------------------------------------------
-
-/* Demo of PubNub + the mbed application board. */
-
-/* How to get things set up: */
-/* 1. Tune in at the PubNub Developer Console, with the following
- * keys (press Subscribe afterwards): */
-const char pubkey[] = "demo";
-const char subkey[] = "demo";
-//const char channel[] = "mbed";
-const char channel_pub[] = "mbed_data";
-const char channel_sub[] = "mbed_cmd";
-/* 2. Attach your mbed board to your computer. A folder should pop up like
- * if you plug in a USB memory stick. */
-/* 3. Open this example in the mbed web IDE and hit the Compile button. */
-/* 4. A download popup with a .bin file will appear; save it in the USB
- * mbed folder. */
-/* 5. Press reset button on the mbed to start things up. */
-
-/* You will see the board publish a "status" message that shows its
- * current temperature and physical tilt. The board's LCD should
- * print some progress messages regarding that. */
-/* You can make the board do things too, by sending messages like:
- * { "send_status": true }
- * { "lcd": "Hi there!" }
- * { "beep": true }
- * { "led": {"r": 0.5, "g": 1, "b": 0} }
- * Try it out! Paste these in the Message window and press the send icon.
- */
-
-Serial pc(USBTX, USBRX); // tx, rx
-//MMA7660 MMA(P0_27, P0_28);
-MMA7455 MMA(P0_27, P0_28);
-LM75B tmp(P0_27, P0_28, LM75B::ADDRESS_1);
-//C12832 lcd(D11, D13, D12, D7, D10);
-
-PwmOut led_r(p25); // RGB LED with 3 PWM outputs for dimmer control
-PwmOut led_g(p28);
-PwmOut led_b(p26);
-//PwmOut speaker(D6); // Speaker with PWM driver
-
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
-DigitalOut led4(LED4);
-
-
-bool forceStatusUpdate = true;
-
-Mutex stdio_mutex;
-
-#define safe_printf(...) do { \
- stdio_mutex.lock(); \
- pc.printf(__VA_ARGS__); \
- stdio_mutex.unlock(); \
- } while(0)
-
-#define safe_print_pnub_err(__prefix) do { \
- stdio_mutex.lock(); \
- if (pnub_err) { \
- pc.printf("%s: ERR, code = %d, line = %d\n", (__prefix), pnub_code, pnub_line); \
- pnub_err = false; \
- } \
- stdio_mutex.unlock(); \
- } while(0)
-
-void pnub_err_handler(PubNubRes code, int line) {
- stdio_mutex.lock();
- if (code != PNR_OK) {
- pc.printf("PbuNub:%d ERROR %d\n", line, code);
- }
- stdio_mutex.unlock();
-}
-
-void process_msg(PubNub &pn, const char *jsonmsg)
-{
- /* Use the picojson parser since we want to deal with complex messages.
- * If you are short on memory, you can find an example for parsing simple
- * JSON messages in the PubNub::subscribe() API docs. */
- picojson::value msg;
- std::string err = picojson::parse(msg, jsonmsg, jsonmsg + strlen(jsonmsg));
- do {
- if (!err.empty()) {
- safe_printf("JSON parse: %s \n", err.c_str());
- break;
- }
-
- if (msg.get("send_status").get<bool>()) {
- //status_msg(pn);
- forceStatusUpdate = true;
- safe_printf("force_update\n");
- break;
- }
- if (msg.get("lcd").is<std::string>()) {
- safe_printf("in: %s \n", msg.get("lcd").get<std::string>().c_str());
- break;
- }
- if (msg.get("beep").is<bool>()) {
- //speaker = msg.get("beep").get<bool>() ? 0.5 : 0;
- break;
- }
- if (msg.get("led").is<picojson::object>()) {
- picojson::value led = msg.get("led");
- safe_printf("Old RGB { %.3f, %.3f, %.3f }\n", led_r.read(), led_g.read(), led_b.read());
- if (led.get("r").is<double>()) led_r = 1.0 - led.get("r").get<double>();
- if (led.get("g").is<double>()) led_g = 1.0 - led.get("g").get<double>();
- if (led.get("b").is<double>()) led_b = 1.0 - led.get("b").get<double>();
- safe_printf("New RGB { %.3f, %.3f, %.3f }\n", led_r.read(), led_g.read(), led_b.read());
- break;
- }
- } while(0);
-}
-
-void publish_thread(void const *args)
-{
- PubNub pn(pubkey, subkey);
- Timer t;
- t.start();
- Timer tDbg;
- int nDbg = 0;
- float lastTemp = -3.75f;
- while (true) {
-
- /* Read sensors. */
- int m[3];
- MMA.read(m[0], m[1], m[2]);
- float temp = (float)tmp;
-
- /* Print on LCD. */
- safe_printf("cur: mx=%3d, my=%3d, mz=%3d, t=%.2f \n", m[0], m[1], m[2], temp);
-
- if (forceStatusUpdate || (temp != lastTemp)) {
- lastTemp = temp;
- forceStatusUpdate = false;
-
- /* Prepare JSON message. */
- char jsonmsg[128];
-// snprintf(jsonmsg, sizeof(jsonmsg),
-// "{\"status\":{\"mx\":%3d,\"my\":%3d,\"mz\":%3d,\"temp\":%.2f}}",
-// m[0], m[1], m[2], temp);
- snprintf(jsonmsg, sizeof(jsonmsg),
- "%%7B%%22status%%22:%%7B%%22mx%%22:%3d,%%22my%%22:%3d,%%22mz%%22:%3d,%%22temp%%22:%.2f%%7D%%7D",
- m[0], m[1], m[2], temp);
-
- /* Publish on PubNub. */
- safe_printf("before publishing\n");
- led_r = 0;
- tDbg.start();
-// PubNubRes ret = pn.publish(channel_pub, jsonmsg);
- PubNubRes ret = pn.publish_urlenc(channel_pub, jsonmsg);
- tDbg.stop();
- if (++nDbg == 10) {
- safe_printf("10 requests took %d ms, i.e %d ms/req\n", tDbg.read_ms(), tDbg.read_ms()/10);
- tDbg.reset();
- nDbg = 0;
- }
-
- if (ret != PNR_OK) {
- safe_printf("puberr: %d \n", ret);
- //safe_print_pnub_err("pub");
- forceStatusUpdate = true; // so that we can try again
- }
- led_r = 1;
- safe_printf("after publishing\n");
- }
-
- wait_ms(100);
- }
-}
-
-void subscribe_thread(void const *args)
-{
- PubNub pn(pubkey, subkey);
- while(true) {
- char *reply = NULL;
- PubNubRes ret = pn.subscribe(channel_sub, &reply);
- if (ret != PNR_OK) {
- safe_printf("suberr: %d \n", ret);
- //safe_print_pnub_err("sub");
- wait(1.0);
- continue;
- }
-
- if (reply) {
- safe_printf("recv(%s)\n", reply);
- process_msg(pn, reply);
- }
-
- wait(0.5); // avoid busy loop in bad situations
- }
-}
-
-/** Cause the mbed to flash the BLOD (Blue LEDs Of Death) sequence
- */
-void mbed_die(void)
-{
- led1 = led2 = 1; led3 = led4 = 0; // lights out
- while(1) {
- led1 = 1;
- led3 = 1;
- wait_ms(100);
- led2 = 1;
- led1 = 0;
- wait_ms(100);
- led4 = 0;
- led2 = 0;
- wait_ms(100);
- led3 = 0;
- led4 = 1;
- wait_ms(100);
- }
-}
-
-int main()
-{
- if (sdram_init()) {
- pc.printf("Failed to initialize SDRAM\n");
- }
-
- /* For debugging, you may find it useful to print memory usage
- * stats. AvailableMemory may be flaky, but the following is nice.
- * It will get printed to the USB serial port interface. */
- //printf("%d: ", __LINE__); __heapstats((__heapprt)fprintf, stdout);
-
- /* Generate a 800Hz tone using PWM hardware output */
- //speaker.period(1.0/800.0); // 800hz period
- led_r = led_g = led_b = 1.0; // lights out
- led1 = led2 = 1; led3 = led4 = 0; // lights out
-
- //lcd.cls();
- //lcd.locate(0,0);
-
- if (!tmp.open()) {
- pc.printf("Failed to open LM75 temperature sensor\n");
- }
-
-// if (!MMA.testConnection())
-// pc.printf("MMA error \n");
-
- // Initialize the accelerometer
- if (!MMA.setMode(MMA7455::ModeMeasurement)) {
- printf("Unable to set mode for MMA7455!\n");
- }
-
- // Calibrate it. It does not matter if it is on a level surface
- // as this test is only interested in relative values.
- if (!MMA.calibrate()) {
- printf("Failed to calibrate MMA7455!\n");
- }
-
- MDMRtos<MDMSerial> mdm;
- //mdm.setDebug(4); // enable this for debugging issues
- int i;
- for (i = 1; i <= 10; i++) {
- if (mdm.connect(SIMPIN, APN,USERNAME,PASSWORD)) {
- printf("Connected\n");
- mdm.setDebug(0); // disable debug again
- break;
- } else {
- printf("Attempt %2d to connect to the modem FAILED.\n", i);
- wait(1);
- mdm.setDebug(min(i, 4)); // to add more and more debug output
- }
- }
- if (i > 10) {
- printf("Failed to connect to the modem\n");
- mbed_die();
- }
-
- forceStatusUpdate = true;
- //status_msg(pn);
- // lcd.printf("pub... ");
-
- Thread t_p(publish_thread);
- Thread t_s(subscribe_thread);
-
- while (1) {
- Thread::wait(2000);
- safe_printf(".\n");
- }
-
- mdm.disconnect();
- mdm.powerOff();
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SWO.lib Sun Feb 15 22:04:12 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/wim/code/SWO/#e5af2e131b95
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceConfiguration.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,183 @@
+#include "DeviceConfiguration.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+DeviceConfiguration::DeviceConfiguration()
+{
+ size_t i;
+
+ for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
+ _items[i].key = NULL;
+ _items[i].value = NULL;
+ }
+}
+
+DeviceConfiguration::~DeviceConfiguration()
+{
+ clear();
+}
+
+bool DeviceConfiguration::read(const char *str)
+{
+ const char *ptr, *ptr2, *ptr3; size_t i, j, len1, len2;
+ DeviceConfiguration::KeyValue items[DEVICE_CONFIGURATION_SIZE];
+
+ for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
+ items[i].key = NULL;
+ items[i].value = NULL;
+ }
+
+ ptr = str;
+ i = 0;
+ while ((*ptr != '\0') && (i < DEVICE_CONFIGURATION_SIZE)) {
+ if (((ptr2 = strchr(ptr, '=')) == NULL) ||
+ ((ptr3 = strchr(ptr2+1, ';')) == NULL))
+ goto failure;
+
+ len1 = ptr2-ptr;
+ len2 = ptr3-ptr2 - 1;
+
+ if ((memchr(ptr, ';', len1) != NULL) ||
+ (memchr(ptr2+1, '=', len2) != NULL))
+ goto failure;
+
+ for (j = 0; j < DEVICE_CONFIGURATION_SIZE; j++) {
+ if ((items[j].key != NULL) && (strlen(items[j].key) == len1) && (strncmp(items[j].key, ptr, len1) == 0))
+ goto failure;
+ }
+
+ if ((items[i].key = (char*)malloc(len1+1)) == NULL)
+ goto failure;
+ if ((items[i].value = (char*)malloc(len2+1)) == NULL) {
+ free(items[i].key);
+ items[i].key = NULL;
+ goto failure;
+ }
+
+ strncpy(items[i].key, ptr, len1);
+ strncpy(items[i].value, ptr2+1, len2);
+ items[i].key[len1] = '\0';
+ items[i].value[len2] = '\0';
+
+ i++;
+ ptr = ptr3+1;
+ }
+
+ if (*ptr != '\0')
+ goto failure;
+
+ clear();
+ memcpy(_items, items, sizeof(DeviceConfiguration::KeyValue)*DEVICE_CONFIGURATION_SIZE);
+ return true;
+
+failure:
+ for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
+ if (items[i].key != NULL) {
+ free(items[i].key);
+ free(items[i].value);
+ }
+ }
+
+ return false;
+}
+
+bool DeviceConfiguration::write(char *buf, size_t len)
+{
+ char *ptr; size_t i; int ret, ln;
+
+ ptr = buf;
+ for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
+ if (_items[i].key == NULL)
+ continue;
+
+ ret = snprintf(ptr, len, "%s=%s;%n", _items[i].key, _items[i].value, &ln);
+ if ((ret < 0) || (ret >= len))
+ return false;
+
+ ptr += ln;
+ len -= ln;
+ }
+
+ return true;
+}
+
+bool DeviceConfiguration::set(const char *key, const char *value)
+{
+ KeyValue *item; size_t i;
+
+ if ((item = search(key)) == NULL) {
+ for (i = 0; (i < DEVICE_CONFIGURATION_SIZE) && (item == NULL); i++) {
+ if (_items[i].key == NULL)
+ item = &_items[i];
+ }
+ }
+
+ if (item == NULL)
+ return false;
+
+ if ((item->key = (char*)malloc(strlen(key)+1)) == NULL)
+ return false;
+ if ((item->value = (char*)malloc(strlen(value)+1)) == NULL) {
+ free(item->key);
+ item->key = NULL;
+ return false;
+ }
+
+ strcpy(item->key, key);
+ strcpy(item->value, value);
+ return true;
+}
+
+const char * DeviceConfiguration::get(const char *key)
+{
+ KeyValue *item;
+
+ if ((item = search(key)) == NULL)
+ return NULL;
+
+ return item->value;
+}
+
+bool DeviceConfiguration::unset(const char *key)
+{
+ KeyValue *item;
+
+ if ((item = search(key)) == NULL)
+ return false;
+
+ free(item->key);
+ free(item->value);
+ item->key = NULL;
+ item->value = NULL;
+ return true;
+}
+
+bool DeviceConfiguration::has(const char *key)
+{
+ return (search(key) != NULL);
+}
+
+void DeviceConfiguration::clear()
+{
+ size_t i;
+
+ for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
+ if (_items[i].key != NULL) {
+ free(_items[i].key);
+ free(_items[i].value);
+ }
+ }
+}
+
+DeviceConfiguration::KeyValue * DeviceConfiguration::search(const char *key)
+{
+ size_t i;
+
+ for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
+ if (strcmp(key, _items[i].key) == 0)
+ return &_items[i];
+ }
+
+ return NULL;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceConfiguration.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,33 @@
+#pragma once
+
+#include <stddef.h>
+#include <stdint.h>
+
+#define DEVICE_CONFIGURATION_SIZE 8
+
+class DeviceConfiguration
+{
+public:
+ DeviceConfiguration();
+ ~DeviceConfiguration();
+
+ bool read(const char*);
+ bool write(char*, size_t);
+
+ bool set(const char*, const char*);
+ const char * get(const char*);
+ bool unset(const char*);
+ bool has(const char*);
+ void clear();
+
+protected:
+ struct KeyValue {
+ char *key;
+ char *value;
+ };
+
+ KeyValue * search(const char*);
+
+private:
+ KeyValue _items[DEVICE_CONFIGURATION_SIZE];
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceFeedback.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,71 @@
+#include "DeviceFeedback.h"
+#include <stdlib.h>
+#include <string.h>
+
+#define MSG_SHOW_SUCCESS 1
+#define MSG_SHOW_FAILURE 2
+
+DeviceFeedback::DeviceFeedback(PwmOut led) :
+ _led(led),
+ _thread(DeviceFeedback::thread_func, this)
+{
+}
+
+void DeviceFeedback::showSuccess()
+{
+ sendMessage(MSG_SHOW_SUCCESS);
+}
+
+void DeviceFeedback::showFailure()
+{
+ sendMessage(MSG_SHOW_FAILURE);
+}
+
+void DeviceFeedback::sendMessage(uint8_t msg)
+{
+ uint8_t *msgPtr;
+
+ msgPtr = _mail.alloc();
+ *msgPtr = msg;
+ _mail.put(msgPtr);
+}
+
+void DeviceFeedback::thread()
+{
+ osEvent evt;
+ uint8_t *msg;
+
+ while (true) {
+ if ((evt = _mail.get(1000)).status == osEventMail) {
+ msg = (uint8_t*)evt.value.p;
+ switch (*msg) {
+ case MSG_SHOW_SUCCESS:
+ for (float i=2000.0; i<10000.0; i+=2000.0) {
+ _led.period(1.0/i);
+ _led = 0.5;
+ Thread::wait(200);
+ _led = 0.0;
+ Thread::wait(50);
+ }
+ break;
+ case MSG_SHOW_FAILURE:
+ for (float i=10000.0; i>2000.0; i-=2000.0) {
+ _led.period(1.0/i);
+ _led = 0.5;
+ Thread::wait(200);
+ _led = 0.0;
+ Thread::wait(50);
+ }
+ break;
+ }
+ _mail.free(msg);
+ }
+ }
+}
+
+void DeviceFeedback::thread_func(void const *arg)
+{
+ DeviceFeedback *that;
+ that = (DeviceFeedback*)arg;
+ that->thread();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceFeedback.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <stddef.h>
+#include "mbed.h"
+#include "rtos.h"
+
+/**
+ * Device Feedback handler
+ */
+class DeviceFeedback
+{
+public:
+ DeviceFeedback(PwmOut led);
+
+ void showSuccess();
+ void showFailure();
+
+protected:
+ void sendMessage(uint8_t);
+ void thread();
+ static void thread_func(void const*);
+
+private:
+ PwmOut _led;
+ Thread _thread;
+ Mail<uint8_t, 16> _mail;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceIO.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,46 @@
+#include "DeviceIO.h"
+
+#define DEF "\033[39m"
+#define GRE "\033[32m"
+#define CYA "\033[36m"
+
+DeviceIO::DeviceIO(GPSI2C& gps) :
+ _userButton(PC_13),
+ _analog1(A0),
+ _analog2(A1),
+ _led1(PA_5),
+ _gpsTracker(gps),
+ _deviceFeedback(_led1)
+{
+}
+
+bool DeviceIO::userButtonPressed()
+{
+ return _userButton;
+}
+
+GPSTracker& DeviceIO::gpsTracker()
+{
+ return _gpsTracker;
+}
+
+DeviceFeedback& DeviceIO::deviceFeedback()
+{
+ return _deviceFeedback;
+}
+
+AnalogIn& DeviceIO::analog1()
+{
+ return _analog1;
+}
+
+AnalogIn& DeviceIO::analog2()
+{
+ return _analog2;
+}
+
+void DeviceIO::debugPrint(const char *line)
+{
+ _debug.printf(GRE "io::debugPrint" DEF "\r\n");
+ _debug.printf(GRE "> " CYA "%s\r\n" DEF, line);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceIO.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "mbed.h"
+#include "GPS.h"
+#include "GPSTracker.h"
+#include "DeviceFeedback.h"
+#include "SWO.h"
+
+class DeviceIO
+{
+public:
+ DeviceIO(GPSI2C&);
+
+ bool userButtonPressed();
+ GPSTracker& gpsTracker();
+ DeviceFeedback& deviceFeedback();
+ AnalogIn& analog1();
+ AnalogIn& analog2();
+ void debugPrint(const char*);
+
+private:
+ DigitalIn _userButton;
+ AnalogIn _analog1;
+ AnalogIn _analog2;
+ PwmOut _led1;
+ GPSTracker _gpsTracker;
+ DeviceFeedback _deviceFeedback;
+ SWO_Channel _debug;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceInfo.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,56 @@
+#include "DeviceInfo.h"
+#include <stdlib.h>
+#include <string.h>
+
+DeviceInfo::DeviceInfo(MDMSerial& mdm, MDMParser::DevStatus& devStatus) :
+ _mdm(mdm)
+{
+ *_cellId = '\0';
+ memcpy(&_devStatus, &devStatus, sizeof(MDMParser::DevStatus));
+ memset(&_netStatus, 0, sizeof(MDMParser::NetStatus));
+ memset(&_signalQuality, 0, sizeof(DeviceInfo::SignalQuality));
+}
+
+const char * DeviceInfo::imsi()
+{
+ return _devStatus.imsi;
+}
+
+const char * DeviceInfo::imei()
+{
+ return _devStatus.imei;
+}
+
+const char * DeviceInfo::cellId()
+{
+ if (!refreshNetStatus())
+ return NULL;
+
+ if (snprintf(_cellId, sizeof(_cellId), "%X", _netStatus.ci) < 1)
+ return NULL;
+ return _cellId;
+}
+
+const char * DeviceInfo::iccid()
+{
+ return _devStatus.ccid;
+}
+
+DeviceInfo::SignalQuality * DeviceInfo::signalQuality()
+{
+ memset(&_signalQuality, 0, sizeof(DeviceInfo::SignalQuality));
+ if (!refreshNetStatus())
+ return NULL;
+
+ if ((_netStatus.rssi == 0) || (_netStatus.ber == 0))
+ return NULL;
+
+ _signalQuality.rssi = _netStatus.rssi;
+ _signalQuality.ber = _netStatus.ber;
+ return &_signalQuality;
+}
+
+bool DeviceInfo::refreshNetStatus()
+{
+ return _mdm.checkNetStatus(&_netStatus);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceInfo.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,32 @@
+#pragma once
+
+#include <stddef.h>
+#include <stdint.h>
+#include "MDM.h"
+
+class DeviceInfo
+{
+public:
+ DeviceInfo(MDMSerial& mdm, MDMParser::DevStatus& devStatus);
+
+ typedef struct {
+ int rssi; // RSSI in dBm
+ int ber; // BER in %
+ } SignalQuality;
+
+ const char * imsi();
+ const char * imei();
+ const char * cellId();
+ const char * iccid();
+ SignalQuality * signalQuality();
+
+protected:
+ bool refreshNetStatus();
+
+private:
+ MDMSerial& _mdm;
+ MDMParser::DevStatus _devStatus;
+ MDMParser::NetStatus _netStatus;
+ char _cellId[9];
+ SignalQuality _signalQuality;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceMemory.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,37 @@
+#include "DeviceMemory.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define CONFIGURATION_FILE "001_CONFIGURATION"
+
+DeviceMemory::DeviceMemory(MDMSerial& mdm) :
+ _mdm(mdm)
+{
+}
+
+bool DeviceMemory::loadConfiguration(char *cfg, size_t len)
+{
+ int res;
+
+ if ((res = _mdm.readFile(CONFIGURATION_FILE, cfg, len)) < 0)
+ return false;
+
+ cfg[(size_t)res] = '\0';
+ return true;
+}
+
+bool DeviceMemory::saveConfiguration(char *cfg)
+{
+ size_t len;
+
+ len = strlen(cfg);
+
+ resetConfiguration();
+ return (_mdm.writeFile(CONFIGURATION_FILE, cfg, len) == len);
+}
+
+bool DeviceMemory::resetConfiguration()
+{
+ return _mdm.delFile(CONFIGURATION_FILE);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/DeviceMemory.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <stddef.h>
+#include "MDM.h"
+
+/**
+ * Device Memory storage handler
+ */
+class DeviceMemory
+{
+public:
+ DeviceMemory(MDMSerial&);
+
+ /** loads configuration from persistent memory */
+ bool loadConfiguration(char*, size_t);
+
+ /** saves configuration to persistent memory */
+ bool saveConfiguration(char*);
+
+ /** removes configuration from persistent memory */
+ bool resetConfiguration();
+
+private:
+ MDMSerial& _mdm;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/GPSTracker.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,74 @@
+#include "GPSTracker.h"
+#include <stdlib.h>
+#include <string.h>
+
+GPSTracker::GPSTracker(GPSI2C& gps) :
+ _gps(gps),
+ _thread(GPSTracker::thread_func, this),
+ _positionSet(false)
+{
+}
+
+bool GPSTracker::position(GPSTracker::Position *position)
+{
+ bool result;
+
+ _mutex.lock();
+ if (_positionSet) {
+ memcpy(position, &_position, sizeof(GPSTracker::Position));
+ _positionSet = false;
+ result = true;
+ } else {
+ result = false;
+ }
+ _mutex.unlock();
+
+ return result;
+}
+
+void GPSTracker::thread()
+{
+ char buf[256], chr; // needs to be that big otherwise mdm isn't working
+ int ret, len, n;
+ double altitude, latitude, longitude;
+
+ while (true) {
+ ret = _gps.getMessage(buf, sizeof(buf));
+ if (ret <= 0) {
+ Thread::wait(100);
+ continue;
+ }
+
+ len = LENGTH(ret);
+ if ((PROTOCOL(ret) != GPSParser::NMEA) || (len <= 6))
+ continue;
+
+ // we're only interested in fixed GPS positions
+ // we are not interested in invalid data
+ if ((strncmp("$GPGGA", buf, 6) != 0) ||
+ (!_gps.getNmeaItem(6, buf, len, n, 10)) || (n == 0))
+ continue;
+
+ // get altitude, latitude and longitude
+ if ((!_gps.getNmeaAngle(2, buf, len, latitude)) ||
+ (!_gps.getNmeaAngle(4, buf, len, longitude)) ||
+ (!_gps.getNmeaItem(9, buf, len, altitude)) ||
+ (!_gps.getNmeaItem(10, buf, len, chr)) ||
+ (chr != 'M'))
+ continue;
+
+ _mutex.lock();
+ _position.altitude = altitude;
+ _position.latitude = latitude;
+ _position.longitude = longitude;
+ _positionSet = true;
+ _mutex.unlock();
+ }
+}
+
+void GPSTracker::thread_func(void const *arg)
+{
+ GPSTracker *that;
+ that = (GPSTracker*)arg;
+ that->thread();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/device/GPSTracker.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,42 @@
+#pragma once
+
+#include <stddef.h>
+#include "GPS.h"
+#include "rtos.h"
+
+/**
+ * A GPS tracker class providing access to the current position.
+ */
+class GPSTracker
+{
+public:
+ /**
+ * Initialize a new GPSTracker object.
+ * @param gps a previously initialized instance of the GPSI2C class
+ */
+ GPSTracker(GPSI2C&);
+
+ typedef struct {
+ double altitude; // altitude meters
+ double latitude; // latitude degrees
+ double longitude; // longitude degrees
+ } Position;
+
+ /**
+ * Retrieves and invalidates the current position.
+ * @param position a pointer of type Position where the current position is written to
+ * @return true on success, false otherwise
+ */
+ bool position(Position*);
+
+protected:
+ void thread();
+ static void thread_func(void const*);
+
+private:
+ GPSI2C _gps;
+ Thread _thread;
+ Mutex _mutex;
+ Position _position;
+ bool _positionSet;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,130 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "MDM.h"
+#include "GPS.h"
+#include "DeviceInfo.h"
+#include "DeviceMemory.h"
+#include "MbedAgent.h"
+#include "GPSTracker.h"
+#include "DeviceConfiguration.h"
+
+#include <stdio.h>
+
+// ----------------------------------------------------------------
+// Cellular modem / SIM parameters
+// ----------------------------------------------------------------
+#include "MDM.h"
+#define SIMPIN NULL //!< Set your secret SIM pin here (e.g. "1234"). Check your SIM manual.
+#define APN "internet" //!< The APN of your network operator SIM, sometimes it is "internet"
+#define USERNAME NULL //!< Set the user name for your APN, or NULL if not needed
+#define PASSWORD NULL //!< Set the password for your APN, or NULL if not needed
+
+// ----------------------------------------------------------------
+// PubNub Config
+// ----------------------------------------------------------------
+//#include "PubNub.h"
+//const char pubkey[] = "pub-c-e3a95948-182a-46fd-b5f3-52c184eb3c12";
+//const char subkey[] = "sub-c-0313f6b2-b2c0-11e4-ab0e-02ee2ddab7fe";
+//const char channel[] = "mbed";
+//const char channel_pub[] = "mbed_data";
+//const char channel_sub[] = "mbed_cmd";
+
+int main()
+{
+ MDMParser::DevStatus devStatus;
+ uint8_t status = 0;
+
+ MDMRtos<MDMSerial> mdm;
+ GPSI2C gps;
+
+ //mdm.setDebug(4);
+
+ if (!mdm.init(SIMPIN, &devStatus))
+ status = 1;
+ else if (!gps.init())
+ status = 2;
+
+ DeviceIO io(gps);
+
+ /** For debugging, you may find it useful to print memory usage
+ * stats. AvailableMemory may be flaky, but the following is nice.
+ * It will get printed to the USB serial port interface.
+ */
+ //io.debugPrint("%d: ", __LINE__); __heapstats((__heapprt)fprintf, stdout);
+
+ io.debugPrint("\r\nWiFi Scanner build " __DATE__ " " __TIME__ "\r\n");
+ //io.debugPrint("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);
+
+ switch (status) {
+ case 1:
+ io.debugPrint("MODEM INIT FAILURE. CHECK SIM");
+ break;
+ case 2:
+ io.debugPrint("GPS INIT FAILURE");
+ break;
+ }
+
+ if (status != 0)
+ goto error;
+
+ io.debugPrint("DEVICE INIT");
+
+ //io.debugPrint("REGISTER NETWORK. IMEI: %s", devStatus.imei);
+
+ if (!mdm.registerNet()) {
+ io.debugPrint("NETWORK REG ERROR");
+ goto error;
+ }
+
+ io.debugPrint("JOIN NETWORK");
+#ifdef SIM_APN
+ if (mdm.join(SIM_APN, SIM_USER, SIM_PASS) == NOIP) {
+#else
+ if (mdm.join() == NOIP) {
+#endif
+ io.debugPrint("NETWORK JOIN FAILURE");
+ goto error;
+ }
+
+ {
+ uint8_t tries;
+ DeviceInfo deviceInfo(mdm, devStatus);
+ DeviceMemory deviceMemory(mdm);
+
+ if (io.userButtonPressed()) {
+ if (deviceMemory.resetConfiguration())
+ io.deviceFeedback().showSuccess();
+ else
+ io.deviceFeedback().showFailure();
+ Thread::wait(1000);
+ return 0;
+ }
+
+ MbedAgent agent(io, mdm, deviceInfo, deviceMemory);
+
+ io.debugPrint("AGENT INIT");
+ if (!agent.init()) {
+ io.debugPrint("AGENT INIT FAILURE");
+ goto error;
+ }
+
+ tries = 3;
+ do {
+ io.debugPrint("AGENT RUN");
+ if (agent.run())
+ break;
+ } while (--tries > 0);
+
+ if (tries == 0) {
+ io.debugPrint("AGENT RUN FAILURE");
+ goto error;
+ }
+ }
+
+ mdm.disconnect();
+ return 0;
+
+error:
+ mdm.disconnect();
+ return 1;
+}
--- a/mbed-rtos.lib Wed Oct 01 11:39:10 2014 +0000 +++ b/mbed-rtos.lib Sun Feb 15 22:04:12 2015 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed-rtos/#631c0f1008c3 +http://mbed.org/users/mbed_official/code/mbed-rtos/#83e169389a69
--- a/mbed.bld Wed Oct 01 11:39:10 2014 +0000 +++ b/mbed.bld Sun Feb 15 22:04:12 2015 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1 \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/e188a91d3eaa \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/measurement/AnalogMeasurement.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,27 @@
+#include "AnalogMeasurement.h"
+
+AnalogMeasurement::AnalogMeasurement(AnalogIn& analog1, AnalogIn& analog2) :
+ _analog1(analog1),
+ _analog2(analog2)
+{
+ _init = false;
+}
+
+bool AnalogMeasurement::init()
+{
+ if (_init)
+ return false;
+
+ _init = true;
+ return true;
+}
+
+bool AnalogMeasurement::run()
+{
+ float analog1 = _analog1.read();
+ float analog2 = _analog2.read();
+
+ printf("A0: %.2f A1: %.2f", analog1, analog2);
+
+ return true;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/measurement/AnalogMeasurement.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "mbed.h"
+
+class AnalogMeasurement
+{
+public:
+ AnalogMeasurement(AnalogIn&, AnalogIn&);
+
+ bool init();
+ bool run();
+
+private:
+ bool _init;
+ AnalogIn& _analog1;
+ AnalogIn& _analog2;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/measurement/LocationUpdate.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,36 @@
+#include "LocationUpdate.h"
+
+LocationUpdate::LocationUpdate(GPSTracker& gpsTracker) :
+ _gpsTracker(gpsTracker)
+{
+ _init = false;
+}
+
+bool LocationUpdate::init()
+{
+ if (_init)
+ return false;
+
+ _init = true;
+ return true;
+}
+
+bool LocationUpdate::run()
+{
+ GPSTracker::Position position;
+
+ if (!_gpsTracker.position(&position)) {
+ puts("No GPS data available.");
+ return true;
+ }
+
+ puts("Starting measurement sending.");
+
+ float altitude = position.altitude;
+ float latitude = position.latitude;
+ float longitude = position.longitude;
+
+ printf("Lat: %9.7f Long: %9.7f Altitude %.2f", latitude, longitude, altitude);
+
+ return true;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/measurement/LocationUpdate.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "GPSTracker.h"
+
+class LocationUpdate
+{
+public:
+ LocationUpdate(GPSTracker&);
+
+ bool init();
+ bool run();
+
+private:
+ bool _init;
+ GPSTracker& _gpsTracker;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/measurement/SignalQualityMeasurement.cpp Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,31 @@
+#include "SignalQualityMeasurement.h"
+
+SignalQualityMeasurement::SignalQualityMeasurement(DeviceInfo& deviceInfo) :
+ _deviceInfo(deviceInfo)
+{
+ _init = false;
+}
+
+bool SignalQualityMeasurement::init()
+{
+ if (_init)
+ return false;
+
+ _init = true;
+ return true;
+}
+
+bool SignalQualityMeasurement::run()
+{
+ DeviceInfo::SignalQuality *signalQuality;
+
+ if ((signalQuality = _deviceInfo.signalQuality()) == NULL)
+ return false;
+
+ int rssi = signalQuality->rssi;
+ int ber = signalQuality->ber;
+
+ printf("RSSI: %d dBm BER: %d %", rssi, ber);
+
+ return true;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/measurement/SignalQualityMeasurement.h Sun Feb 15 22:04:12 2015 +0000
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "DeviceInfo.h"
+
+class SignalQualityMeasurement
+{
+public:
+ SignalQualityMeasurement(DeviceInfo&);
+
+ bool init();
+ bool run();
+
+private:
+ bool _init;
+ DeviceInfo& _deviceInfo;
+};
--- a/pubnub_acc.html Wed Oct 01 11:39:10 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-<html>
- <head>
-<!-- <script type="text/javascript" src="jscolor/jscolor.js"></script>-->
- <script type="text/javascript" src="https://www.google.com/jsapi"></script>
- <script type="text/javascript">
- var baseline = Math.round(new Date().getTime()/10); // current time as integer in 10ms resolution
- var temps = [['Time', 'Temp']];
- var accs = [['Time', 'X', 'Y', 'Z']];
- google.load("visualization", "1", {packages:["corechart"]});
- //google.setOnLoadCallback(drawChart);
- function drawChart() {
- /*var data = google.visualization.arrayToDataTable([
- ['Year', 'Sales', 'Expenses'],
- ['2004', 1000, 400],
- ['2005', 1170, 460],
- ['2006', 660, 1120],
- ['2007', 1030, 540]
- ]);*/
- var data = google.visualization.arrayToDataTable(temps);
-
- var options = {
- title: 'Temperature over time',
- vAxis: { title: "Degrees C" },
- hAxis: { title: "Time since first message (in seconds)" },
- curveType: 'function',
- legend: { position: 'none' },
- };
-
- var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
-
- chart.draw(data, options);
-
- // Acc chart
- var data = google.visualization.arrayToDataTable(accs);
-
- var options = {
- title: 'Acceleration over time',
- vAxis: { title: "Acc value", minValue: -60, maxValue: 60 },
- hAxis: { title: "Time since first message (in seconds)" },
- curveType: 'function',
- //legend: { position: 'none' },
- };
-
- var chart = new google.visualization.LineChart(document.getElementById('acc_chart_div'));
-
- chart.draw(data, options);
- }
- function addToChart(t, x, y, z) {
- var now = Math.round(new Date().getTime()/10); // current time as integer in 10ms resolution
- console.log(new Date().getTime()/10 + " " + (now - baseline) + " temp = " + t+ " acc {"+x+","+y+","+z+"}");
- temps[temps.length] = [ (now - baseline)/100, t ];
- accs[accs.length] = [ (now - baseline)/100, x, y, z];
- drawChart();
- }
- </script>
- <script src=http://cdn.pubnub.com/pubnub.min.js ></script>
- <script>
- var pubnub = PUBNUB.init({
- publish_key: 'pub-c-e4a8b6d6-7be2-4ef9-85b9-f6dfbed23f7d',
- subscribe_key: 'sub-c-83ad9d3a-3365-11e4-9846-02ee2ddab7fe'
- });
-
- function receiveMessage(message) {
- //console.log(message);
-
- var type = 0;
- try {
- var test = message.status.mx;
- type = 1;
- } catch (err) {
- // not a measurement status message from HW
- }
- try {
- var test = message.led.r;
- type = 2;
- } catch (err) {
- // not a set RGB color request from us
- }
-
- var messageLog = document.getElementById("messageLog");
- if (type == 1) {
- var listItem = document.createElement("li");
- var msg = "Acc X,Y,Z = {" + message.status.mx + ", " + message.status.my + ", " + message.status.mz + "} Temp = " + message.status.temp;
- var text = document.createTextNode(msg);
- listItem.appendChild(text);
- document.getElementById("messageList").appendChild(listItem);
- messageLog.scrollTop = messageLog.scrollHeight;
- addToChart(message.status.temp, message.status.mx, message.status.my, message.status.mz);
- } else if (type == 2) {
- var listItem = document.createElement("li");
- var msg = "Set RGB LED: {" + message.led.r + ", " + message.led.g + ", " + message.led.b + "}";
- var text = document.createTextNode(msg);
- listItem.appendChild(text);
- document.getElementById("messageList").appendChild(listItem);
- messageLog.scrollTop = messageLog.scrollHeight;
- //addToChart(message.status.temp);
- } else {
- // got an error, probably because message is not from mbed
- var listItem = document.createElement("li");
- var msg = "Unknwon RAW message: " + message;
- var text = document.createTextNode(msg);
- listItem.appendChild(text);
- document.getElementById("messageList").appendChild(listItem);
- messageLog.scrollTop = messageLog.scrollHeight;
- //addToChart(message.status.temp);
- }
- }
-
- /*function sendMessage(newcolor) {
- //var r = parseInt(newcolor.substr(0,2), 16)/255;
- //var g = parseInt(newcolor.substr(2,2), 16)/255;
- //var b = parseInt(newcolor.substr(4,2), 16)/255;
- //var msg = '{ "led": {"r": ' + r + ', "g": ' + g + ', "b": ' + b + '} }';
- //var msg = '{ "led": {"r": ' + newcolor.rgb[0] + ', "g": ' + newcolor.rgb[1] + ', "b": ' + newcolor.rgb[2] + '} }';
- var msg = { "led": {"r": newcolor.rgb[0], "g": newcolor.rgb[1], "b": newcolor.rgb[2]} };
- console.log("new color #" + newcolor + " => message " + msg.led.r+","+msg.led.g+","+msg.led.b);
- pubnub.publish({
- channel: 'mbed_cmd',//'hello_world',
- message: msg
- });
- }*/
- function sendColorMessage(r,g,b) {
- var msg = { "led": {"r": r, "g": g, "b": b} };
- console.log("message " + msg.led.r+","+msg.led.g+","+msg.led.b);
- pubnub.publish({
- channel: 'mbed_cmd',//'hello_world',
- message: msg
- });
- }
-
- pubnub.subscribe({
- channel: 'mbed_data',//'hello_world',
- message: receiveMessage
- });
-
-/* pubnub.unsubscribe({
- channel: 'a',
- message: function(m){console.log(m)}
- });*/
- </script>
- <style>
- li { font-style: monospace; }
- table,tr {border: none; }
- </style>
- </head>
- <body>
- <!--<img src="http://www.pubnub.com/static/images/illustrations/cloud-red.png">-->
-
- <table>
- <tr>
- <td valign="top">
- <table>
- <tr valign="top">
- <td><div id="chart_div" style="width: 800px; height: 400px;"></div></td>
- </tr>
- <tr valign="top">
- <td><div id="acc_chart_div" style="width: 800px; height: 400px;"></div></td>
- </tr>
- <!--<tr valign="top">
- <td>Change color on RGB LED to: <input class="color" onchange="sendMessage(this.color)"></td>
- </tr>-->
- <tr valign="top">
- <td>
- <input type="button" value="Set color to RED" onclick="sendColorMessage(1,0,0)">
- <input type="button" value="Set color to GREEN" onclick="sendColorMessage(0,1,0)">
- <input type="button" value="Set color to BLUE" onclick="sendColorMessage(0,0,1)">
- </td>
- </tr>
- </table>
- </td>
- <td>
- <p><b>Data from mbed:</b></p>
- <div id="messageLog" style="height: 600px; width: 350px; overflow:auto;">
- <ol id="messageList">
- <!-- This will be populated dynamically. -->
- </ol>
- </div>
- </td>
- </tr>
- <tr>
- <td>
- <!--<input class="color" onchange="sendMessage(this.color)">-->
- </td>
- </tr>
- </body>
-</html>
\ No newline at end of file
Richard Osterloh
