Jun Furutani / libMiMic

Fork of libMiMic by Ryo Iizuka

Committer:
nyatla
Date:
Fri Jul 04 14:28:46 2014 +0000
Revision:
85:416f8bbbdf54
Parent:
78:8cdb8fc7eda8
RPC???I2C/Slave/Memory/Serial???; ?????????????RPC????????;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 77:8651d3c19a55 1 #include "mod/ModJsonRpc.h"
nyatla 77:8651d3c19a55 2 #include "MbedJsApi.h"
nyatla 77:8651d3c19a55 3 #include "mbed.h"
nyatla 77:8651d3c19a55 4 namespace MiMic
nyatla 77:8651d3c19a55 5 {
nyatla 77:8651d3c19a55 6
nyatla 77:8651d3c19a55 7 /**
nyatla 77:8651d3c19a55 8 * JSONRPCハンドラのベースクラス。
nyatla 77:8651d3c19a55 9 * よく使う関数群を定義します。
nyatla 77:8651d3c19a55 10 */
nyatla 77:8651d3c19a55 11 class RpcHandlerBase
nyatla 77:8651d3c19a55 12 {
nyatla 77:8651d3c19a55 13 public:
nyatla 77:8651d3c19a55 14 /**
nyatla 77:8651d3c19a55 15 * MiMicRPCの定義するピンIDをmbedピンIDへ変換します。
nyatla 77:8651d3c19a55 16 * ターゲットごとに実装します。
nyatla 77:8651d3c19a55 17 */
nyatla 77:8651d3c19a55 18 static PinName pinId2PinName(unsigned int i_id);
nyatla 77:8651d3c19a55 19 static PinMode pinmodeId2PinMode(unsigned int i_id);
nyatla 77:8651d3c19a55 20 static PortName portId2PortName(unsigned int i_id);
nyatla 77:8651d3c19a55 21
nyatla 77:8651d3c19a55 22 /**
nyatla 77:8651d3c19a55 23 * Websocketコネクションに同期したオブジェクトリストにnewオブジェクトを登録します。
nyatla 77:8651d3c19a55 24 * 登録するオブジェクトは、{@link BasicRpcObject}でラップする必要があります。
nyatla 77:8651d3c19a55 25 */
nyatla 77:8651d3c19a55 26 static void addNewObjectBatch(ModJsonRpc* i_mod,unsigned int i_id,ModJsonRpc::BasicRpcObject* i_new_object)
nyatla 77:8651d3c19a55 27 {
nyatla 77:8651d3c19a55 28 int i=i_mod->addObject(i_new_object);
nyatla 77:8651d3c19a55 29 if(i<0){
nyatla 77:8651d3c19a55 30 delete i_new_object;
nyatla 77:8651d3c19a55 31 i_mod->putError(i_id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 32 return;
nyatla 77:8651d3c19a55 33 }
nyatla 77:8651d3c19a55 34 i_mod->putResult(i_id,"%d",i);
nyatla 77:8651d3c19a55 35 return;
nyatla 77:8651d3c19a55 36 }
nyatla 77:8651d3c19a55 37 /** i_idx番目のRPCパラメータをiidとしてインスタンスを取得します。*/
nyatla 77:8651d3c19a55 38 static void* getObjectBatch(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,int i_idx=0)
nyatla 77:8651d3c19a55 39 {
nyatla 77:8651d3c19a55 40 NyLPC_TInt32 v;
nyatla 77:8651d3c19a55 41 if(!NyLPC_TJsonRpcParserResult_getInt32(i_rpc,i_idx,&v)){
nyatla 77:8651d3c19a55 42 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 43 return NULL;
nyatla 77:8651d3c19a55 44 }
nyatla 77:8651d3c19a55 45 void* ret=i_mod->getObject(v);
nyatla 77:8651d3c19a55 46 if(ret==NULL){
nyatla 77:8651d3c19a55 47 i_mod->putError(i_rpc->method.id,ModJsonRpc::INTERNAL_ERROR);
nyatla 77:8651d3c19a55 48 return NULL;
nyatla 77:8651d3c19a55 49 }
nyatla 77:8651d3c19a55 50 return ret;
nyatla 77:8651d3c19a55 51 }
nyatla 77:8651d3c19a55 52
nyatla 77:8651d3c19a55 53 /** u...パラメータをN個のPinIDと解釈して返す。失敗した場合は終了処理も行う。
nyatla 77:8651d3c19a55 54 */
nyatla 77:8651d3c19a55 55 static bool getParamsAsPin(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,PinName* o_pins,int i_num_of_pins)
nyatla 77:8651d3c19a55 56 {
nyatla 77:8651d3c19a55 57 for(int i=0;i<i_num_of_pins;i++){
nyatla 77:8651d3c19a55 58 NyLPC_TUInt32 p;
nyatla 77:8651d3c19a55 59 if(!NyLPC_TJsonRpcParserResult_getUInt32(i_rpc,i,&p)){
nyatla 77:8651d3c19a55 60 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 61 return false;
nyatla 77:8651d3c19a55 62 }
nyatla 77:8651d3c19a55 63 o_pins[i]=pinId2PinName(p);
nyatla 77:8651d3c19a55 64 }
nyatla 77:8651d3c19a55 65 return true;
nyatla 77:8651d3c19a55 66 }
nyatla 85:416f8bbbdf54 67 static bool getParamByte(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,unsigned char &o_val,int i_idx)
nyatla 85:416f8bbbdf54 68 {
nyatla 85:416f8bbbdf54 69 if(!NyLPC_TJsonRpcParserResult_getByte(i_rpc,i_idx,(NyLPC_TUInt8*)&o_val)){
nyatla 85:416f8bbbdf54 70 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 85:416f8bbbdf54 71 return false;
nyatla 85:416f8bbbdf54 72 }
nyatla 85:416f8bbbdf54 73 return true;
nyatla 85:416f8bbbdf54 74 }
nyatla 85:416f8bbbdf54 75 static bool getParamByteArray(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,const unsigned char* &o_val,unsigned char &o_len,int i_idx)
nyatla 85:416f8bbbdf54 76 {
nyatla 85:416f8bbbdf54 77 if(!NyLPC_TJsonRpcParserResult_getByteArray(i_rpc,i_idx,(const NyLPC_TUInt8**)&o_val,&o_len)){
nyatla 85:416f8bbbdf54 78 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 85:416f8bbbdf54 79 return false;
nyatla 85:416f8bbbdf54 80 }
nyatla 85:416f8bbbdf54 81 return true;
nyatla 85:416f8bbbdf54 82 }
nyatla 85:416f8bbbdf54 83 static bool getParamString(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,const char* &o_val,int i_idx)
nyatla 85:416f8bbbdf54 84 {
nyatla 85:416f8bbbdf54 85 if(!NyLPC_TJsonRpcParserResult_getStr(i_rpc,i_idx,(const NyLPC_TChar**)&o_val,NULL)){
nyatla 85:416f8bbbdf54 86 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 85:416f8bbbdf54 87 return false;
nyatla 85:416f8bbbdf54 88 }
nyatla 85:416f8bbbdf54 89 return true;
nyatla 85:416f8bbbdf54 90 }
nyatla 77:8651d3c19a55 91 static bool getParamInt(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,int& o_val,int i_idx)
nyatla 77:8651d3c19a55 92 {
nyatla 77:8651d3c19a55 93 if(!NyLPC_TJsonRpcParserResult_getInt32(i_rpc,i_idx,((NyLPC_TInt32*)&o_val))){
nyatla 77:8651d3c19a55 94 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 95 return false;
nyatla 77:8651d3c19a55 96 }
nyatla 77:8651d3c19a55 97 return true;
nyatla 77:8651d3c19a55 98 }
nyatla 77:8651d3c19a55 99 static bool getParamUInt(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,unsigned int& o_val,int i_idx)
nyatla 77:8651d3c19a55 100 {
nyatla 77:8651d3c19a55 101 if(!NyLPC_TJsonRpcParserResult_getUInt32(i_rpc,i_idx,((NyLPC_TUInt32*)&o_val))){
nyatla 77:8651d3c19a55 102 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 103 return false;
nyatla 77:8651d3c19a55 104 }
nyatla 77:8651d3c19a55 105 return true;
nyatla 77:8651d3c19a55 106 }
nyatla 77:8651d3c19a55 107 static bool getParamsInt(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,int* o_val,int i_num_ofparams,int i_start=0)
nyatla 77:8651d3c19a55 108 {
nyatla 77:8651d3c19a55 109 for(int i=0;i<i_num_ofparams;i++){
nyatla 77:8651d3c19a55 110 if(!NyLPC_TJsonRpcParserResult_getInt32(i_rpc,i_start+i,(NyLPC_TInt32*)(o_val+i))){
nyatla 77:8651d3c19a55 111 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 112 return false;
nyatla 77:8651d3c19a55 113 }
nyatla 77:8651d3c19a55 114 }
nyatla 77:8651d3c19a55 115 return true;
nyatla 77:8651d3c19a55 116 }
nyatla 77:8651d3c19a55 117 static bool getParamsUInt(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,unsigned int* o_val,int i_num_ofparams,int i_start=0)
nyatla 77:8651d3c19a55 118 {
nyatla 77:8651d3c19a55 119 for(int i=0;i<i_num_ofparams;i++){
nyatla 77:8651d3c19a55 120 if(!NyLPC_TJsonRpcParserResult_getUInt32(i_rpc,i_start+i,(NyLPC_TUInt32*)(o_val+i))){
nyatla 77:8651d3c19a55 121 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 122 return false;
nyatla 77:8651d3c19a55 123 }
nyatla 77:8651d3c19a55 124 }
nyatla 77:8651d3c19a55 125 return true;
nyatla 77:8651d3c19a55 126 }
nyatla 77:8651d3c19a55 127
nyatla 77:8651d3c19a55 128 };
nyatla 77:8651d3c19a55 129
nyatla 77:8651d3c19a55 130 }