OSDN Git Service

MiMicVMの動作確認
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Sun, 24 Mar 2013 07:01:12 +0000 (07:01 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Sun, 24 Mar 2013 07:01:12 +0000 (07:01 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@203 47198e57-cb75-475f-84c4-a814cd6f29e0

13 files changed:
lib/src/net/httpd/mod/NyLPC_cModRemoteMcu.c
lib/src/net/httpd/mod/NyLPC_cModRemoteMcu.h
misc/MiMicVM/api.js/MiMicCore.js
misc/MiMicVM/api.js/demo/ad.html
misc/MiMicVM/api.js/demo/ad_port.html
misc/MiMicVM/api.js/demo/da.html
misc/MiMicVM/api.js/demo/led_blink.html
misc/MiMicVM/api.js/demo/memory_access.html
misc/MiMicVM/api.js/demo/naitive_call.html
misc/MiMicVM/api.js/demo/pwm.html
misc/MiMicVM/api.js/demo/pwm_port.html
misc/MiMicVM/api.js/test.html
projects/example/sample.net.simplehttpd/src/sketch.c

index dda29b2..3bba965 100644 (file)
@@ -32,7 +32,7 @@
 #include "NyLPC_cHttpmodUtils_protected.h"\r
 #include "../../../mimicvm/NyLPC_cMiMicVM_protected.h"\r
 \r
-\r
+#define APPLICATION_VERSION "MiMicRemoteMCU/1.3"\r
 #define MVM_VERSION "MiMicVM/1.0;Json/1.0"\r
 #define SIZE_OF_IBUF 256\r
 struct TModMiMicRemoteMcuHeader\r
@@ -79,6 +79,7 @@ struct TModMiMicRemoteMcuHeader
 \r
 \r
 static void mvm(NyLPC_TcHttpdConnection_t* i_connection,const struct TModMiMicRemoteMcuHeader* i_rqh);\r
+static void status(NyLPC_TcHttpdConnection_t* i_connection);\r
 \r
 \r
 static NyLPC_TBool messageHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const NyLPC_TChar* i_name,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)\r
@@ -161,7 +162,7 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                                out->content.mvm.vm_instruction.db_len=0;\r
                                out->content.mvm.vm_instruction.db_part=NULL;\r
                                NyLPC_TUInt32ArrayPtr_setBuf(&out->_binarray,out->content.mvm.vm_instruction.bc_buf,SIZE_OF_IBUF);\r
-                               out->content.mvm.o=QVAL_O_UNKNOWN;\r
+                               out->content.mvm.o=QVAL_O_JSON;\r
                                out->content.mvm.v=QVAL_V_UNKNOWN;\r
                                break;\r
                        default:\r
@@ -288,6 +289,8 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                                        //ERROR\r
                                        NyLPC_OnErrorGoto(ERROR);\r
                                }\r
+                               out->content.mvm.vm_instruction.db_len=((NyLPC_TUInt8*)(out->_binarray.ptr)-(NyLPC_TUInt8*)(out->content.mvm.vm_instruction.db_part))/sizeof(NyLPC_TUInt32);\r
+\r
                                //終端しているなら、次のクエリへ\r
                                out->_astate=ST_PARSE_QUERY_NAME;\r
                        }\r
@@ -383,6 +386,9 @@ NyLPC_TBool NyLPC_cModRemoteMcu_execute(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_TcH
        case CONTENT_ID_MVM:\r
                mvm(i_connection,&single_header);\r
                break;\r
+       case CONTENT_ID_STATUS:\r
+               status(i_connection);\r
+               break;\r
        default:\r
                NyLPC_OnErrorGoto(Error2);\r
        }\r
@@ -470,7 +476,23 @@ static void mvmsleep(struct NyLPC_TcMiMicVM_TEvent* i_eh,NyLPC_TUInt32 i_sleep_i
        NyLPC_cThread_sleep(i_sleep_in_msec);\r
 }\r
 \r
-\r
+/**\r
+ * RemoteMCUのステータスを返す。基本的にjson\r
+ * {\r
+ *     application:"[VERSION]"\r
+ * }\r
+ */\r
+static void status(NyLPC_TcHttpdConnection_t* i_connection)\r
+{\r
+       if(!NyLPC_cHttpdModUtils_sendJsonHeader(i_connection)){\r
+               return;\r
+       }\r
+       //JSONを書く。\r
+       if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"{\"application\":\""APPLICATION_VERSION";%s\"}",NyLPC_cMiMicEnv_PlatformName)){\r
+               return;\r
+       }\r
+       return;\r
+}\r
 /**\r
  * MimicVMの起動と,ResponseJSONの起動\r
  * @return\r
index d7240d4..8319fb6 100644 (file)
@@ -18,6 +18,11 @@ extern "C" {
 /**\r
  * URLが最大31文字までの、短いHttpリクエストを処理します。\r
  * このクラスは、NyLPC_TBasicHttpHeader_tにキャストできます。\r
+ *\r
+ * JSONAPIとして、以下のAPIを提供します。\r
+ * ./mvm.api?o=[json|xml]&v=1&bc=[:MIMICBC:]\r
+ * MiMicBCを実行します。\r
+ * oパラメータ省略時はjsonと解釈します。\r
  */\r
 typedef struct NyLPC_TcModRemoteMcu NyLPC_TcModRemoteMcu_t;\r
 \r
index 79a51d3..f86a01d 100644 (file)
@@ -11,7 +11,7 @@ var MiMicLib=
        /**\r
         * MiMicJsAPIのバージョン文字列。\r
         */\r
-       VERSION:"MiMicJsAPI/1.0.1",\r
+       VERSION:"MiMicJsAPI/1.0.2",\r
        /**\r
         * 現在の時刻を返す\r
         * @returns\r
@@ -35,7 +35,7 @@ var MiMicLib=
         * @function\r
         * @param {object} a\r
         * 判定対象のオブジェクト\r
-        * @return {Boolean}
+        * @return {Boolean}\r
         * aがarrayであれば、trueである。\r
         */\r
        isArray:function isArray(a){\r
@@ -315,21 +315,25 @@ var MiMicRemoteMcuInterface;
         * インスタンス生成直後は、MiMicRemoteMcuとの接続は断状態である。connect関数を実行して、接続する必要がある。\r
         * 通信仕様については、MiMicVM.pdf Appendix 1.MiMicVM HTTP Interfaceを参照すること。\r
         * @constructor\r
-        * @param {string} server\r
-        * 接続するMiMicRemoteMcuのホストアドレスを指定する。IPアドレス、ホスト名等。\r
-        * ex. “127.0.0.1” , “127.0.0.1:3939”\r
+        * @param {string} i_path\r
+        * 接続するMiMicRemoteMcuのホストパスを指定します。\r
+        * MiMicVersion 1.4以降はMiMicサーバの/mvm/に割り当てられています。\r
+        * ホストアドレスのみを指定した場合、"/mvm/"サフィックスを自動で追加します。\r
+        * ex.\r
+        * "127.0.0.1" =&lt; "127.0.0.1/mvm/"<br/>\r
+        * "127.0.0.1:3939/mvm/" =&lt; "127.0.0.1:3939/mvm/"\r
         * @example\r
         * //create a controlable MCU via network.\r
-        * var mcu=new MiMicRemoteMcuInterface(“192.168.0.39”);      \r
+        * var mcu=new MiMicRemoteMcuInterface(“192.168.0.39/mvm/”);         \r
         */\r
-       MiMicRemoteMcuInterface=function MiMicRemoteMcuInterface(server)\r
+       MiMicRemoteMcuInterface=function MiMicRemoteMcuInterface(i_path)\r
        {\r
-               this._mimic_host=server;\r
+               this._mimic_path=i_path+((i_path.indexOf("/")==-1)?"/mvm/":"");\r
        }\r
 \r
        MiMicRemoteMcuInterface.prototype=\r
        {\r
-               _mimic_host:null,\r
+               _mimic_path:null,\r
                _keep_alive:null,\r
                /**\r
                 * 最後にXhrレスポンスを得た時刻\r
@@ -490,7 +494,7 @@ var MiMicRemoteMcuInterface;
                                if(this._keep_alive==null){\r
                                        throw new MiMicException(EE.NG,"disconnected");\r
                                }\r
-                               var res=this._xhrGet("http://"+this._mimic_host+"/mvm.api?v=1&bc="+i_bc,false);\r
+                               var res=this._xhrGet("http://"+this._mimic_path+"mvm.api?v=1&bc="+i_bc,false);\r
                                if(res.status!=200){\r
                                        throw new MiMicException(EE.HTTP,"i_bc="+i_bc+",XHR.status="+res.status);\r
                                }\r
@@ -526,7 +530,7 @@ var MiMicRemoteMcuInterface;
                                function xhrStatus(i_is_async,i_cb)\r
                                {\r
                                        try{\r
-                                               return _t._xhrGet("http://"+_t._mimic_host+"/status.api",i_is_async,i_cb);\r
+                                               return _t._xhrGet("http://"+_t._mimic_path+"status.api",i_is_async,i_cb);\r
                                        }catch(e){\r
                                                return null;\r
                                        }\r
@@ -555,7 +559,7 @@ var MiMicRemoteMcuInterface;
                                //1回目の接続確認(同期接続)\r
                                var res=xhrStatus(false,null);\r
                                if((res==null) || (!_t._isOnline_parseResponse(res))){\r
-                                       throw new MiMicException("Bad response from "+this._mimic_host);\r
+                                       throw new MiMicException("Bad response from "+this._mimic_path);\r
                                }\r
                                //周期監視の開始\r
                                this._keep_alive={\r
index ad19d3f..d88a22a 100644 (file)
@@ -20,7 +20,7 @@ function scroll()
        \r
 }\r
 function init(){\r
-       var mcu=new LPCXpresso1769.Mcu("192.168.128.39");\r
+       var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
        var pin=mcu.getPin(LPCXpresso1769.P0[23],"AD");\r
        var i=0;\r
        setInterval(function(){\r
index 766f240..b5ed186 100644 (file)
@@ -22,7 +22,7 @@ function scroll()
        \r
 }\r
 function init(){\r
-       var mcu=new LPCXpresso1769.Mcu("192.168.128.39");\r
+       var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
        var port=mcu.getPeripheral("ADC").getPort(\r
                [LPCXpresso1769.P0[23],LPCXpresso1769.P0[24]]\r
                );\r
index b6cea45..807a746 100644 (file)
@@ -10,7 +10,7 @@ function init()
        var dacpin;\r
        \r
        try{\r
-               var     mcu=new LPCXpresso1769.Mcu("192.168.128.39",true);\r
+               var     mcu=new LPCXpresso1769.Mcu("192.168.0.39",true);\r
                var dac=mcu.getPeripheral("DAC");\r
                dacpin=dac.getPin(LPCXpresso1769.P0[26]);\r
        }catch(e){\r
index 6e8e9f5..4034b97 100644 (file)
@@ -4,11 +4,11 @@
 <script src="../LPCXPresso1769.All.js"></script>       \r
 <script type="text/javascript">\r
 function init(){\r
-       var mcu=new LPCXpresso1769.Mcu("192.168.128.39");\r
+       var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
        var pin=mcu.getPin(LPCXpresso1769.P0[22],"GPIO");\r
        pin.setOpt({dir:1,pin:{mode:1,od:0}});\r
        var i=0;\r
-//     setInterval(function(){pin.setValue((i++)%2);},1000);\r
+       setInterval(function(){pin.setValue((i++)%2);},1000);\r
 }      \r
 </script>\r
 </head>\r
index 5431581..369d900 100644 (file)
@@ -4,7 +4,7 @@
 <script src="../LPCXPresso1769.All.js"></script>       \r
 <script type="text/javascript">\r
 function init(){\r
-       var mcu=new LPCXpresso1769.Mcu("192.168.128.39");\r
+       var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
        var ma=new LPCXpresso1769.Memory(mcu);\r
        ma.write32(0x20080000,139);\r
        ma.write32([0x20080020,0x20080024],[239,339]);\r
index 7506584..88b03b1 100644 (file)
@@ -5,7 +5,7 @@
 <script type="text/javascript">\r
 \r
 function init(){\r
-       var mcu=new LPCXpresso1769.Mcu("192.168.128.39");\r
+       var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
        //create native call interface.\r
        var ni=new LPCXpresso1769.Ni(mcu);\r
        //create result value holder.\r
index c15440f..8facd50 100644 (file)
@@ -10,7 +10,7 @@ function init()
        var pwmpin;\r
        \r
        try{\r
-               var     mcu=new LPCXpresso1769.Mcu("192.168.128.39",true);\r
+               var     mcu=new LPCXpresso1769.Mcu("192.168.0.39",true);\r
                mcu.events.onActivateChanged=function(t){alert(t);};\r
                var pwm=mcu.getPeripheral("PWM",{freq:100});\r
                pwmpin=pwm.getPin(LPCXpresso1769.P2[0]);\r
index ee69745..e94e495 100644 (file)
@@ -6,7 +6,7 @@
 \r
 \r
 function init(){\r
-       var mcu=new LPCXpresso1769.Mcu("192.168.128.39");\r
+       var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
        var port=mcu.getPeripheral("PWM").getPort(\r
                [LPCXpresso1769.P2[0],LPCXpresso1769.P2[1]]\r
                );\r
index 99a54ed..4a6d1e3 100644 (file)
@@ -28,7 +28,7 @@
        }\r
 function init(){\r
 \r
-var mcu=new LPC1769.Mcu("192.168.128.39");\r
+var mcu=new LPC1769.Mcu("192.168.0.39");\r
 var gpiopin=mcu.getPin(LPC1769.P0[22],"GPIO");\r
 gpiopin.setOpt({dir:1,pin:{mode:1,od:0}});\r
 var i=0;\r
index c08211e..aa73c79 100644 (file)
@@ -6,7 +6,6 @@
 #include "NyLPC_uipService.h"\r
 #include "NyLPC_httpService.h"\r
 #include "NyLPC_utils.h"\r
-#include <stdio.h>\r
 \r
 #include "../net/NyLPC_cNet.h"\r
 #include "../net/httpd/NyLPC_cHttpd.h"\r
@@ -61,313 +60,3 @@ void loop(void)
 }\r
 \r
 \r
-#ifdef COMMENT\r
-\r
-\r
-//イーサネット用の初期化情報\r
-const struct NyLPC_TEthAddr ethaddr=NyLPC_TEthAddr_pack(0x02,0x01,0x02,0x03,0x04,0x05);\r
-const struct NyLPC_TIPv4Addr ipaddr=NyLPC_TIPv4Addr_pack(192,168,0,39);\r
-const struct NyLPC_TIPv4Addr netmask=NyLPC_TIPv4Addr_pack(255,255,255,0);\r
-const struct NyLPC_TIPv4Addr gateway=NyLPC_TIPv4Addr_pack(192,168,0,254);\r
-\r
-//TCP処理スレッドの定義\r
-#define SIZE_OF_RX 256\r
-#define NUM_OF_TH 7\r
-struct TProc{\r
-       NyLPC_TcThread_t th;\r
-       NyLPC_TcTcpSocket_t socket;\r
-       char rbuf[SIZE_OF_RX];\r
-}proc[NUM_OF_TH];\r
-\r
-//ROMFSの定義\r
-extern struct NyLPC_TRomFileData file_cat_jpg;\r
-extern struct NyLPC_TRomFileData file_index_html;\r
-NyLPC_TcRomFileSet_t rfs;\r
-const struct NyLPC_TRomFileData* rfsd[]={\r
-               &file_index_html,\r
-               &file_cat_jpg};\r
-\r
-//private 関数\r
-\r
-static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh);\r
-static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status);\r
-static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file);\r
-static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh);\r
-\r
-\r
-//スケッチ\r
-\r
-void setup(void)\r
-{\r
-       int i;\r
-       //uipサービス初期化。いろいろ利用可能に。\r
-       NyLPC_cUipService_initialize();\r
-//     for(i=0;i<NUM_OF_TH;i++){\r
-//             NyLPC_cThread_initialize(&(proc[i].th),200,NyLPC_TcThread_PRIORITY_IDLE);\r
-//             NyLPC_cTcpSocket_initialize(&(proc[i].socket),proc[i].rbuf,SIZE_OF_RX);\r
-//     }\r
-//     //ROMのファイルシステムを初期化\r
-//     NyLPC_cRomFileSet_initialize(&rfs,rfsd,2);\r
-\r
-}\r
-\r
-//ステータス用。\r
-static int num_of_reqest=0;\r
-static int num_of_error=0;\r
-static int num_of_connect=0;\r
-static int num_of_tx=0;\r
-\r
-//Httpのセッション関数\r
-static int server(void* p)\r
-{\r
-       struct TProc* proc=(struct TProc*)p;\r
-       NyLPC_TUInt16 ret;\r
-       const struct NyLPC_TRomFileData* rf;\r
-       NyLPC_TcHttpStream_t st;\r
-       struct NyLPC_THttpShortRequestHeader reqheader;\r
-       if(!NyLPC_cTcpSocket_accept(&(proc->socket),3000)){\r
-               return -1;\r
-       }\r
-       num_of_connect++;\r
-\r
-       //TCPのオープン\r
-       if(NyLPC_cHttpStream_initialize(&st,&(proc->socket))){\r
-               for(;;){\r
-                       ret=parseReqHeader(&st,&reqheader);\r
-                       num_of_reqest++;\r
-                       //コネクションが増えすぎたら持続性接続を停止するために上書き。\r
-                       if(num_of_connect>5){\r
-                               reqheader.super.connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;\r
-                       }\r
-                       if(ret!=200){\r
-                               //エラーならエラーレスポンスを生成。持続性接続しない。\r
-                               writeError(&st,&(reqheader.super),ret);\r
-                               num_of_error++;\r
-                               break;\r
-                       }\r
-                       //URLから判定。\r
-                       if(strncmp("/rf.api?",reqheader.url,8)==0){\r
-                               //ファイル検索\r
-                               rf=NyLPC_cRomFileSet_getFilaData(&rfs,reqheader.url+8);\r
-                               if(rf==NULL){\r
-                                       num_of_error++;\r
-                                       if(!writeError(&st,&(reqheader.super),404)){\r
-                                               break;\r
-                                       }\r
-                               }else{\r
-                                       if(!writeFile(&st,&(reqheader.super),rf)){\r
-                                               num_of_error++;\r
-                                               break;\r
-                                       }\r
-                               }\r
-                       }else if(strncmp("/status.json",reqheader.url,8)==0){\r
-                               if(!writeJson(&st,&(reqheader.super))){\r
-                                       break;\r
-                               }\r
-                               //httpdの状態を返す。\r
-                       }else{\r
-                               if(!writeFile(&st,&(reqheader.super),NyLPC_cRomFileSet_getFilaData(&rfs,"index.html"))){\r
-                                       num_of_error++;\r
-                                       break;\r
-                               }\r
-                       }\r
-\r
-               }\r
-               NyLPC_cHttpStream_finalize(&st);\r
-       }\r
-       //5秒以内に切断\r
-       NyLPC_cTcpSocket_close(&(proc->socket),5000);\r
-       num_of_connect--;\r
-       return 0;\r
-}\r
-\r
-\r
-void loop(void)\r
-{\r
-       NyLPC_TcIPv4Config_t config;\r
-       NyLPC_TcTcpListener_t listener;\r
-       int i;\r
-\r
-\r
-       NyLPC_cIPv4Config_initialzeForEthernet(&config,&ethaddr,1480);\r
-       NyLPC_cIPv4Config_setDefaultRoute(&config,&gateway);\r
-       NyLPC_cIPv4Config_setIp(&config,&ipaddr,&netmask);\r
-\r
-\r
-//     NyLPC_cTcpListener_initialize(&listener,80);\r
-       NyLPC_cUipService_start(&config);\r
-/*     for(;;){\r
-               //ターミネイト状態のタスクを検索\r
-               for(i=0;i<NUM_OF_TH;i++){\r
-                       if(NyLPC_cThread_isTerminated(&(proc[i].th))){\r
-                               //リスニング\r
-                               if(!NyLPC_cTcpListener_listen(&listener,&(proc[i].socket),5000)){\r
-                                       continue;\r
-                               }\r
-                               //タスク起動\r
-                               NyLPC_cThread_start(&(proc[i].th),server,&(proc[i]));\r
-                       }\r
-               }\r
-       }*/\r
-       for(;;){}\r
-}\r
-\r
-\r
-\r
-/**\r
- * リクエストヘッダのパーサ\r
- */\r
-static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh)\r
-{\r
-       NyLPC_TUInt16 ret=200;\r
-       NyLPC_TcHttpShortRequestHeaderParser_t hp;\r
-       NyLPC_cHttpShortRequestHeaderParser_initialize(&hp);\r
-\r
-       //ヘッダ解析\r
-       if(!NyLPC_cHttpShortRequestHeaderParser_parse(&hp,i_st,o_reqh)){\r
-               ret=NyLPC_cHttpBasicHeaderParser_getStatusCode(&hp.super);\r
-       }\r
-       //ヘッダの内容確認\r
-       if(o_reqh->super.type!=NyLPC_THttpHeaderType_REQUEST){\r
-               ret=400;\r
-       }\r
-       //GETだけネ\r
-       if(o_reqh->super.startline.req.method!=NyLPC_THttpMethodType_GET){\r
-               ret=405;\r
-       }\r
-       NyLPC_cHttpBasicHeaderParser_finalize(&hp);\r
-       return ret;\r
-}\r
-/**\r
- * エラーレスポンスのライタ。\r
- * 戻り値はpersistentConnectionが有効かどうか。\r
- */\r
-static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status)\r
-{\r
-       static const char* HTML_FORMAT="<html><h1>STATUS %d</h1><hr/>"NyLPC_cHttpdConfig_SERVER"</html>";\r
-       NyLPC_TcHttpHeaderWriter_t hw;\r
-       NyLPC_TcHttpBodyWriter_t bw;\r
-       //ヘッダライタの生成\r
-       if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       //ヘッダ書込み\r
-       if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
-               NyLPC_cHttpHeaderWriter_setClose(&hw);\r
-       }\r
-       //@bug HTTP/1.1未満のクライアントを考慮していない。\r
-       NyLPC_cHttpHeaderWriter_setChunked(&hw);\r
-       //ヘッダの基本情報出力\r
-       NyLPC_cHttpHeaderWriter_writeHeader(&hw,i_status);\r
-       //拡張メッセージヘッダの出力\r
-       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","text/html");\r
-\r
-       //ヘッダ書込み終わり。(最後だけチェック)\r
-       if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
-               NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-\r
-       //Bodyの書込み\r
-       NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
-       //チャンク転送設定\r
-       NyLPC_cHttpBodyWriter_setChunked(&bw);\r
-       NyLPC_cHttpBodyWriter_format(&bw,HTML_FORMAT,(NyLPC_TInt32)i_status);\r
-       //エラーチェック\r
-       if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
-               NyLPC_cHttpBodyWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpBodyWriter_finalize(&hw);\r
-       return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
-}\r
-\r
-/**\r
- * エラーレスポンスのライタ。\r
- * 戻り値はpersistentConnectionが有効かどうか。\r
- */\r
-static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh)\r
-{\r
-       static const char* JSON_FORMAT="{nr:%d,ne:%d,ac:%d,er:\"%d/%d/%d\",tx:%d}";\r
-       NyLPC_TcHttpHeaderWriter_t hw;\r
-       NyLPC_TcHttpBodyWriter_t bw;\r
-       //ヘッダライタの生成\r
-       if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       //ヘッダ書込み\r
-       if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
-               NyLPC_cHttpHeaderWriter_setClose(&hw);\r
-       }\r
-       //@bug HTTP/1.1未満のクライアントを考慮していない。\r
-       NyLPC_cHttpHeaderWriter_setChunked(&hw);\r
-       //ヘッダの基本情報出力\r
-       NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);\r
-       //拡張メッセージヘッダの出力\r
-       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","application/json");\r
-       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Access-Control-Allow-Origin","*");\r
-\r
-       //ヘッダ書込み終わり。(最後だけチェック)\r
-       if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
-               NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-\r
-       //Bodyの書込み\r
-       NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
-       //チャンク転送設定\r
-       NyLPC_cHttpBodyWriter_setChunked(&bw);\r
-       NyLPC_cHttpBodyWriter_format(&bw,JSON_FORMAT,\r
-               (NyLPC_TInt32)num_of_reqest,(NyLPC_TInt32)num_of_error,(NyLPC_TInt32)num_of_connect,\r
-               NyLPC_assert_counter,NyLPC_abort_counter,NyLPC_debug_counter,dbg_getNumofUsedTx());\r
-       //エラーチェック\r
-       if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
-               NyLPC_cHttpBodyWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpBodyWriter_finalize(&hw);\r
-       return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
-}\r
-/**\r
- * ROMファイルのレスポンスライタ。\r
- * 戻り値はpersistentConnectionが有効かどうか。\r
- */\r
-static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file)\r
-{\r
-       NyLPC_TcHttpHeaderWriter_t hw;\r
-       NyLPC_TcHttpBodyWriter_t bw;\r
-       //ヘッダライタの生成\r
-       if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       //ヘッダ書込み\r
-       if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
-               NyLPC_cHttpHeaderWriter_setClose(&hw);\r
-       }\r
-       NyLPC_cHttpHeaderWriter_setContentLength(&hw,i_file->size);\r
-       //ヘッダの基本情報出力\r
-       NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);\r
-       //拡張メッセージヘッダの出力\r
-       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type",i_file->content_type);\r
-\r
-       //ヘッダ書込み終わり。(最後だけチェック)\r
-       if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
-               NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-\r
-       //Bodyの書込み\r
-       NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
-       NyLPC_cHttpBodyWriter_write(&bw,i_file->data,i_file->size);\r
-       //エラーチェック\r
-       if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
-               NyLPC_cHttpBodyWriter_finalize(&hw);\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       NyLPC_cHttpBodyWriter_finalize(&hw);\r
-       return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
-}\r
-#endif\r