Minecraft extension
Dependencies: NySDFileSystem libMiMic mbed-rtos mbed registers
Fork of MiMicSimpleHttpd by
What is this?
This application works as a converter of the electronic circuit and Redstone circuit.
Getting started
http://nyatla.jp/mimic/wp/?p=617
main.cpp@7:7720763e8918, 2013-08-12 (annotated)
- Committer:
- nyatla
- Date:
- Mon Aug 12 10:11:50 2013 +0000
- Revision:
- 7:7720763e8918
- Parent:
- 6:5909618469f8
Update libMiMic; support UPnP
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nyatla | 0:ec1e45489427 | 1 | #include "mimic.h" |
nyatla | 5:00daa91538bc | 2 | #include "mbed.h" |
nyatla | 5:00daa91538bc | 3 | #include "InOut.h" |
nyatla | 7:7720763e8918 | 4 | #include "fsdata.h" |
nyatla | 7:7720763e8918 | 5 | |
nyatla | 5:00daa91538bc | 6 | LocalFileSystem2 lf("local"); |
nyatla | 0:ec1e45489427 | 7 | |
nyatla | 0:ec1e45489427 | 8 | |
nyatla | 5:00daa91538bc | 9 | class RedIoPin: public InOut |
nyatla | 5:00daa91538bc | 10 | { |
nyatla | 5:00daa91538bc | 11 | private: |
nyatla | 6:5909618469f8 | 12 | bool _v_pin; |
nyatla | 6:5909618469f8 | 13 | bool _v_rs; |
nyatla | 5:00daa91538bc | 14 | public: |
nyatla | 5:00daa91538bc | 15 | RedIoPin(char pin):InOut(pin,0) |
nyatla | 5:00daa91538bc | 16 | { |
nyatla | 5:00daa91538bc | 17 | //pull down |
nyatla | 5:00daa91538bc | 18 | this->mode(1);//pull down |
nyatla | 6:5909618469f8 | 19 | //read from pin |
nyatla | 6:5909618469f8 | 20 | this->setDirection(true); |
nyatla | 5:00daa91538bc | 21 | this->write(0); |
nyatla | 6:5909618469f8 | 22 | this->setDirection(false); |
nyatla | 6:5909618469f8 | 23 | //initialize pin and rs |
nyatla | 6:5909618469f8 | 24 | this->_v_pin=this->read()!=0; |
nyatla | 6:5909618469f8 | 25 | this->_v_rs=false; |
nyatla | 5:00daa91538bc | 26 | } |
nyatla | 5:00daa91538bc | 27 | /** |
nyatla | 5:00daa91538bc | 28 | * set RedStoneValue RedStone value |
nyatla | 6:5909618469f8 | 29 | * @param v |
nyatla | 6:5909618469f8 | 30 | * red stone value |
nyatla | 5:00daa91538bc | 31 | * @return |
nyatla | 6:5909618469f8 | 32 | * current pin value |
nyatla | 5:00daa91538bc | 33 | */ |
nyatla | 5:00daa91538bc | 34 | bool setRedValue(int v) |
nyatla | 5:00daa91538bc | 35 | { |
nyatla | 6:5909618469f8 | 36 | //update red stone pattern |
nyatla | 6:5909618469f8 | 37 | this->_v_rs=(v!=0); |
nyatla | 6:5909618469f8 | 38 | |
nyatla | 6:5909618469f8 | 39 | //check pin value |
nyatla | 6:5909618469f8 | 40 | this->setDirection(true); |
nyatla | 6:5909618469f8 | 41 | this->write(0); |
nyatla | 5:00daa91538bc | 42 | this->setDirection(false); |
nyatla | 6:5909618469f8 | 43 | this->_v_pin=(this->read()!=0); |
nyatla | 6:5909618469f8 | 44 | |
nyatla | 6:5909618469f8 | 45 | //mix two values |
nyatla | 6:5909618469f8 | 46 | if(this->_v_pin){ |
nyatla | 6:5909618469f8 | 47 | // set pin to Lv=H,dir=in |
nyatla | 6:5909618469f8 | 48 | if(this->_v_rs){ |
nyatla | 6:5909618469f8 | 49 | //pin==1 && rs==1 |
nyatla | 6:5909618469f8 | 50 | this->setDirection(true); |
nyatla | 6:5909618469f8 | 51 | this->write(1); |
nyatla | 6:5909618469f8 | 52 | }else{ |
nyatla | 6:5909618469f8 | 53 | //pin==1 && rs==0 |
nyatla | 6:5909618469f8 | 54 | this->write(0); |
nyatla | 6:5909618469f8 | 55 | } |
nyatla | 5:00daa91538bc | 56 | }else{ |
nyatla | 6:5909618469f8 | 57 | if(this->_v_rs){ |
nyatla | 6:5909618469f8 | 58 | //pin==0 && rs==1 |
nyatla | 6:5909618469f8 | 59 | this->setDirection(true); |
nyatla | 6:5909618469f8 | 60 | this->write(1); |
nyatla | 6:5909618469f8 | 61 | }else{ |
nyatla | 6:5909618469f8 | 62 | //pin==0 && rs==0 |
nyatla | 6:5909618469f8 | 63 | this->write(0); |
nyatla | 6:5909618469f8 | 64 | } |
nyatla | 5:00daa91538bc | 65 | } |
nyatla | 6:5909618469f8 | 66 | //actual pin value |
nyatla | 6:5909618469f8 | 67 | return this->_v_pin; |
nyatla | 5:00daa91538bc | 68 | } |
nyatla | 5:00daa91538bc | 69 | }; |
nyatla | 5:00daa91538bc | 70 | class RedIo |
nyatla | 5:00daa91538bc | 71 | { |
nyatla | 5:00daa91538bc | 72 | public: |
nyatla | 5:00daa91538bc | 73 | RedIoPin* io[30]; |
nyatla | 5:00daa91538bc | 74 | RedIo() |
nyatla | 5:00daa91538bc | 75 | { |
nyatla | 5:00daa91538bc | 76 | 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}; |
nyatla | 5:00daa91538bc | 77 | for(int i=0;i<30;i++){ |
nyatla | 5:00daa91538bc | 78 | this->io[i]=new RedIoPin(d[i]); |
nyatla | 5:00daa91538bc | 79 | } |
nyatla | 5:00daa91538bc | 80 | } |
nyatla | 5:00daa91538bc | 81 | virtual ~RedIo() |
nyatla | 5:00daa91538bc | 82 | { |
nyatla | 5:00daa91538bc | 83 | for(int i=0;i<30;i++){ |
nyatla | 5:00daa91538bc | 84 | delete this->io[i]; |
nyatla | 5:00daa91538bc | 85 | } |
nyatla | 5:00daa91538bc | 86 | } |
nyatla | 5:00daa91538bc | 87 | unsigned int update(unsigned int v) |
nyatla | 5:00daa91538bc | 88 | { |
nyatla | 5:00daa91538bc | 89 | unsigned int ret=0; |
nyatla | 5:00daa91538bc | 90 | for(int i=0;i<30;i++){ |
nyatla | 5:00daa91538bc | 91 | ret=ret<<1; |
nyatla | 6:5909618469f8 | 92 | ret=ret | ((this->io[29-i]->setRedValue((v>>(29-i))&0x00000001))?1:0); |
nyatla | 5:00daa91538bc | 93 | } |
nyatla | 5:00daa91538bc | 94 | return ret; |
nyatla | 5:00daa91538bc | 95 | } |
nyatla | 5:00daa91538bc | 96 | }; |
nyatla | 0:ec1e45489427 | 97 | |
nyatla | 7:7720763e8918 | 98 | Net* net; |
nyatla | 7:7720763e8918 | 99 | |
nyatla | 7:7720763e8918 | 100 | class RedWireBridge:public MiMic::Httpd |
nyatla | 0:ec1e45489427 | 101 | { |
nyatla | 0:ec1e45489427 | 102 | private: |
nyatla | 0:ec1e45489427 | 103 | ModUrl modurl; //basic URL parser |
nyatla | 7:7720763e8918 | 104 | ModRomFiles modromfs; //ROM file module |
nyatla | 7:7720763e8918 | 105 | ModUPnPDevice modupnp; |
nyatla | 5:00daa91538bc | 106 | RedIo rsio; |
nyatla | 0:ec1e45489427 | 107 | public: |
nyatla | 7:7720763e8918 | 108 | RedWireBridge(NetConfig& i_cfg):Httpd(i_cfg.getHttpPort()) |
nyatla | 0:ec1e45489427 | 109 | { |
nyatla | 7:7720763e8918 | 110 | this->modromfs.setParam("rom",FSDATA,3); |
nyatla | 7:7720763e8918 | 111 | //bind upnp service to module. |
nyatla | 7:7720763e8918 | 112 | this->modupnp.setParam(*net); |
nyatla | 0:ec1e45489427 | 113 | } |
nyatla | 0:ec1e45489427 | 114 | virtual void onRequest(HttpdConnection& i_connection) |
nyatla | 0:ec1e45489427 | 115 | { |
nyatla | 5:00daa91538bc | 116 | char url[64]; |
nyatla | 0:ec1e45489427 | 117 | int method; |
nyatla | 7:7720763e8918 | 118 | //try to ModRomFS module. for icon,images. |
nyatla | 7:7720763e8918 | 119 | if(this->modromfs.execute(i_connection)){ |
nyatla | 7:7720763e8918 | 120 | return; |
nyatla | 7:7720763e8918 | 121 | } |
nyatla | 7:7720763e8918 | 122 | //try to UPnP service. for descriptions. |
nyatla | 7:7720763e8918 | 123 | if(this->modupnp.execute(i_connection)){ |
nyatla | 7:7720763e8918 | 124 | return; |
nyatla | 7:7720763e8918 | 125 | } |
nyatla | 7:7720763e8918 | 126 | //rsb CGI |
nyatla | 7:7720763e8918 | 127 | |
nyatla | 5:00daa91538bc | 128 | |
nyatla | 2:28fd59d6be76 | 129 | //call ModUrl module. |
nyatla | 5:00daa91538bc | 130 | if(!this->modurl.execute(i_connection,url,64,&method)){ |
nyatla | 5:00daa91538bc | 131 | i_connection.sendHeader(400,"text/html",NULL); |
nyatla | 5:00daa91538bc | 132 | i_connection.sendBodyF("<html><body>Bad Request.</body></html>",url); |
nyatla | 0:ec1e45489427 | 133 | return; |
nyatla | 0:ec1e45489427 | 134 | } |
nyatla | 5:00daa91538bc | 135 | UrlReader r(url); |
nyatla | 5:00daa91538bc | 136 | if(!r.isPathEqual("/rsb/")){ |
nyatla | 5:00daa91538bc | 137 | i_connection.sendHeader(403,"text/html",NULL); |
nyatla | 5:00daa91538bc | 138 | i_connection.sendBodyF("<html><body>Path must be '/rsb/?p=[:unsigned int:]'</body></html>",url); |
nyatla | 5:00daa91538bc | 139 | return; |
nyatla | 5:00daa91538bc | 140 | } |
nyatla | 5:00daa91538bc | 141 | unsigned int rsv; |
nyatla | 5:00daa91538bc | 142 | if(!r.getQueryUInt("p",rsv)){ |
nyatla | 5:00daa91538bc | 143 | i_connection.sendHeader(400,"text/html",NULL); |
nyatla | 5:00daa91538bc | 144 | i_connection.sendBodyF("<html><body>p val must be unsigned int</body></html>",url); |
nyatla | 5:00daa91538bc | 145 | return; |
nyatla | 5:00daa91538bc | 146 | } |
nyatla | 5:00daa91538bc | 147 | i_connection.sendHeader(200,"text/html",NULL); |
nyatla | 5:00daa91538bc | 148 | i_connection.sendBodyF("%u",rsio.update(rsv)); |
nyatla | 0:ec1e45489427 | 149 | return; |
nyatla | 0:ec1e45489427 | 150 | } |
nyatla | 0:ec1e45489427 | 151 | }; |
nyatla | 0:ec1e45489427 | 152 | |
nyatla | 0:ec1e45489427 | 153 | int main() |
nyatla | 0:ec1e45489427 | 154 | { |
nyatla | 7:7720763e8918 | 155 | net=new Net(); //create a net instance. |
nyatla | 0:ec1e45489427 | 156 | NetConfig cfg; //create network configulation |
nyatla | 7:7720763e8918 | 157 | //Prepare configulation. |
nyatla | 7:7720763e8918 | 158 | cfg.setUPnPIcon(64,64,8,"image/png","/rom/icon.png");//set upnp icon address |
nyatla | 7:7720763e8918 | 159 | cfg.setUPnPUdn(0x0c9720e0,0x031e,0x11e3,0); //set application timebase-uuid time and sequence field. |
nyatla | 7:7720763e8918 | 160 | cfg.setFriendlyName("RedWireBridge"); //set friendly name |
nyatla | 7:7720763e8918 | 161 | cfg.setUPnPPresentationURL("/rom/index.html"); //set presentationURL |
nyatla | 7:7720763e8918 | 162 | cfg.setZeroconf(true);//AutoIP enable |
nyatla | 7:7720763e8918 | 163 | |
nyatla | 5:00daa91538bc | 164 | //try to override setting by local file. |
nyatla | 5:00daa91538bc | 165 | cfg.loadFromFile("/local/mimic.cfg"); |
nyatla | 5:00daa91538bc | 166 | |
nyatla | 7:7720763e8918 | 167 | RedWireBridge httpd(cfg); //create a httpd instance. |
nyatla | 7:7720763e8918 | 168 | net->start(cfg); |
nyatla | 0:ec1e45489427 | 169 | httpd.loop(); //start httpd loop. |
nyatla | 0:ec1e45489427 | 170 | return 0; |
nyatla | 0:ec1e45489427 | 171 | } |