Code snipet

Dependencies:   NySDFileSystem libMiMic mbed-rtos mbed

Fork of AsyncHttpdSample by Ryo Iizuka

Revision:
5:00daa91538bc
Parent:
2:28fd59d6be76
Child:
6:bcf3fe4d0ba1
--- a/main.cpp	Tue May 14 13:14:42 2013 +0000
+++ b/main.cpp	Thu May 16 16:07:17 2013 +0000
@@ -1,37 +1,106 @@
 #include "mimic.h"
-
+#include "mbed.h"
+#include "InOut.h"
+LocalFileSystem2 lf("local");
 
 
-/**
- * MiMic RemoteMCU httpd.<br/>
- * <p>Service list</p>
- * <pre>
- * /rom/ - romfs
- * /setup/ - MiMic configulation REST API.
- * /local/ - mbed LocalFileSystem
- * /mvm/   - MiMicVM REST API
- * </pre>
- */
+class RedIoPin: public InOut
+{
+private:
+    int _v;
+public:
+    RedIoPin(char pin):InOut(pin,0)
+    {
+        //pull down
+        this->mode(1);//pull down
+        this->_v=0;
+        this->write(0);
+    }
+    /**
+     * set RedStoneValue RedStone value
+     * @return
+     * red stone value.
+     */
+    bool setRedValue(int v)
+    {
+        //read real pin status,direction=in
+        this->setDirection(false);
+        if(this->read()!=0)
+        {   //real pin==1:out=1,in=0
+            this->_v=1;
+            this->write(0);
+        }else{
+            //real pin==0: direction=out,out=redstone value
+            this->setDirection(true);
+            int  vt=v!=0?1:0;
+            this->write(vt);
+            this->_v=vt;
+        }
+        return this->_v;
+    }
+};
+class RedIo
+{
+public:
+    RedIoPin* io[30];
+    RedIo()
+    {
+        const char d[]={LED1,LED2,LED3,LED4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};
+        for(int i=0;i<30;i++){
+            this->io[i]=new RedIoPin(d[i]);
+        }
+    }
+    virtual ~RedIo()
+    {
+        for(int i=0;i<30;i++){
+            delete this->io[i];
+        }
+    }
+    unsigned int update(unsigned int v)
+    {
+        unsigned int ret=0;
+        for(int i=0;i<30;i++){
+            ret=ret<<1;
+            ret=ret | (this->io[29-i]->setRedValue((v>>(29-i))&0x00000001)?1:0);
+        }
+        return ret;
+    }
+};
 
 class MiMicRemoteMcu:public MiMic::Httpd
 {
 private:
     ModUrl modurl; //basic URL parser
+    RedIo rsio;
 public:
     MiMicRemoteMcu():Httpd(80)
     {
     }
     virtual void onRequest(HttpdConnection& i_connection)
     {
-        char url[32];
+        char url[64];
         int method;
+        
         //call ModUrl module.
-        if(this->modurl.execute(i_connection,url,32,&method)){
-            //send 200 OK and requested URL
-            i_connection.sendHeader(200,"text/html",NULL);
-            i_connection.sendBodyF("<html><body>Your Request path is %s.</body></html>",url);
+        if(!this->modurl.execute(i_connection,url,64,&method)){
+            i_connection.sendHeader(400,"text/html",NULL);
+            i_connection.sendBodyF("<html><body>Bad Request.</body></html>",url);
             return;
         }
+        UrlReader r(url);
+        if(!r.isPathEqual("/rsb/")){
+            i_connection.sendHeader(403,"text/html",NULL);
+            i_connection.sendBodyF("<html><body>Path must be '/rsb/?p=[:unsigned int:]'</body></html>",url);
+            return;
+        }
+        unsigned int rsv;
+        if(!r.getQueryUInt("p",rsv)){
+            i_connection.sendHeader(400,"text/html",NULL);
+            i_connection.sendBodyF("<html><body>p val must be unsigned int</body></html>",url);
+            return;
+        }
+        i_connection.sendHeader(200,"text/html",NULL);
+        i_connection.sendBodyF("%u",rsio.update(rsv));
         return;
     }
 };
@@ -39,6 +108,9 @@
 int main()
 {
     NetConfig cfg; //create network configulation
+    //try to override setting by local file.
+    cfg.loadFromFile("/local/mimic.cfg");
+
     Net net(cfg);  //create a net instance.
     MiMicRemoteMcu httpd; //create a httpd instance.
     httpd.loop();  //start httpd loop.