mbedデバイスから直接gluinサーバに接続するサンプルです。サーボモータをGluinに接続します。メモリの関係から現在、Ethernet専用になっています。

Dependencies:   DxClinet EthernetInterface WebSocketClient mbed-rtos mbed

Fork of PwmOut_HelloWorld by mbed official

Revision:
1:200a677fb4c5
Parent:
0:50d2b9c62765
--- a/main.cpp	Tue Feb 12 15:10:53 2013 +0000
+++ b/main.cpp	Sat Feb 14 00:29:02 2015 +0000
@@ -1,12 +1,146 @@
 #include "mbed.h"
+#include "EthernetInterface.h"
+#include "Websocket.h"
+#include "DxClient.h"
+
+#define PULSE_ON 0.0011 
+#define PULSE_OFF 0.0018 
+#define PULSE_NU 0.0015 
+
+#define GLUINSERVER "ws://xxx.yyy.zzz/dx"
+
+PwmOut servo(p21);
+AnalogIn noise(p15);
+
+DigitalOut  led_connect(LED1);
+DigitalOut  led_error(LED2);
+
+bool last_ctrl = false;
+bool bUpdate = false;
+
+extern "C" void mbed_mac_address(char *mac);
+
  
-PwmOut led(LED1);
+static bool device_get( dx_props *props)
+{
+    printf("device_get is called, but do nothing\n");
+    return false;
+}
+static bool device_set( dx_props *props)
+{
+    printf("device_set is called\n");
+    
+    if (props->numofprops>0) {
+        printf("%s: %s\n", props->props[0].name, props->props[0].b_val?"true":"false");
+    
+        bool ctrl = props->props[0].b_val;
+        if (last_ctrl != ctrl) {
+            if (ctrl) {
+                servo.pulsewidth(PULSE_ON); // servo position determined by a pulsewidth between 1-2ms
+                wait(0.5f);
+                servo.pulsewidth(PULSE_NU); // servo position determined by a pulsewidth between 1-2ms
+            } else {
+                servo.pulsewidth(PULSE_OFF); // servo position determined by a pulsewidth between 1-2ms
+                wait(0.5f);
+                servo.pulsewidth(PULSE_NU); // servo position determined by a pulsewidth between 1-2ms
+            }
+            last_ctrl = ctrl;
+            bUpdate = true;
+        }
+        return true;
+    }
+    return false;
+}
+
  
-int main() {
-    while(1) {
-        for(float p = 0.0f; p < 1.0f; p += 0.1f) {
-            led = p;
-            wait(0.1);
+int main() 
+{
+    // init servo
+    servo.period(0.020);          // servo requires a 20ms period
+    servo.pulsewidth(PULSE_NU); // servo position determined by a pulsewidth between 1-2ms
+
+    led_connect = 0;
+    led_error = 0;
+    
+    // ethernet initialize   
+    EthernetInterface ethernet;
+    ethernet.init();    // connect with DHCP
+    int ret_val = ethernet.connect();
+    if (0 == ret_val) {
+        printf("IP Address: %s\n", ethernet.getIPAddress());
+    } else {
+        error("ethernet failed to connect: %d.\n", ret_val);
+        led_error = 1;
+    }
+
+    //  get mac address for generationg deviceid
+    char mac[6];
+    char deviceid[32];
+    mbed_mac_address(mac);
+    sprintf( deviceid, "device-%02X-%02X-%02X-%02X-%02X-%02X", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] );
+    printf( "deviceid: %s\n", deviceid );
+
+   
+    // connect to server
+    bool res; 
+    DxClient dxc(GLUINSERVER, deviceid, noise.read_u16());
+    
+    dxc.set_user("USER","PASS");
+    dxc.set_device_description("manipulator to control Swithes");
+    dxc.set_device_name("manipulator");
+    dxc.set_get_requset_handler( device_get );
+    dxc.set_set_requset_handler( device_set );
+    res = dxc.connect();
+    if (!res) {
+        led_error = 1;
+        return -1;
+    }
+    led_connect = 1;
+    
+    //  device registration
+    dx_props props;
+    
+    props.numofprops = 1;
+    props.props = (dx_prop*)malloc( sizeof(dx_prop) * props.numofprops );
+    sprintf( props.props[0].name, "manipulator" );
+    props.props[0].type = DX_BOOLEAN;
+    props.props[0].mode = DX_WRITEONLY;
+    props.props[0].direction = DX_UPDOWN;
+    props.props[0].b_val = false;
+    
+    res = dxc.register_device( &props );
+    if (!res) {
+        return -1;
+    }
+    
+    while(1){
+        //  send sensor values periodically
+        for(int i=0;i<0x7fffffff;i++) {
+    
+            // pool message from server for set and get request
+            dxc.handle_messages();
+            if (bUpdate) {
+                props.props[0].b_val = last_ctrl;
+                dxc.update_device(&props);
+                bUpdate = false;
+            }
+            wait(0.1f);
+    
+            // send keep alive message at a inverval        
+            if (i%30==0) {
+                dxc.keepalive_device();
+            }
         }
     }
-}
\ No newline at end of file
+    
+    res = dxc.deregister_device();
+
+    free( props.props );
+    
+    dxc.deregister_device();
+    dxc.close();
+    ethernet.disconnect();
+
+    while(true);
+}
+