Jun Furutani / libMiMic

Fork of libMiMic by Ryo Iizuka

Committer:
nyatla
Date:
Mon Jun 23 04:45:57 2014 +0000
Revision:
78:8cdb8fc7eda8
Parent:
77:8651d3c19a55
Child:
85:416f8bbbdf54
mbed??????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 77:8651d3c19a55 67 static bool getParamInt(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,int& o_val,int i_idx)
nyatla 77:8651d3c19a55 68 {
nyatla 77:8651d3c19a55 69 if(!NyLPC_TJsonRpcParserResult_getInt32(i_rpc,i_idx,((NyLPC_TInt32*)&o_val))){
nyatla 77:8651d3c19a55 70 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 71 return false;
nyatla 77:8651d3c19a55 72 }
nyatla 77:8651d3c19a55 73 return true;
nyatla 77:8651d3c19a55 74 }
nyatla 77:8651d3c19a55 75 static bool getParamUInt(ModJsonRpc* i_mod,const union NyLPC_TJsonRpcParserResult* i_rpc,unsigned int& o_val,int i_idx)
nyatla 77:8651d3c19a55 76 {
nyatla 77:8651d3c19a55 77 if(!NyLPC_TJsonRpcParserResult_getUInt32(i_rpc,i_idx,((NyLPC_TUInt32*)&o_val))){
nyatla 77:8651d3c19a55 78 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 79 return false;
nyatla 77:8651d3c19a55 80 }
nyatla 77:8651d3c19a55 81 return true;
nyatla 77:8651d3c19a55 82 }
nyatla 77:8651d3c19a55 83 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 84 {
nyatla 77:8651d3c19a55 85 for(int i=0;i<i_num_ofparams;i++){
nyatla 77:8651d3c19a55 86 if(!NyLPC_TJsonRpcParserResult_getInt32(i_rpc,i_start+i,(NyLPC_TInt32*)(o_val+i))){
nyatla 77:8651d3c19a55 87 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 88 return false;
nyatla 77:8651d3c19a55 89 }
nyatla 77:8651d3c19a55 90 }
nyatla 77:8651d3c19a55 91 return true;
nyatla 77:8651d3c19a55 92 }
nyatla 77:8651d3c19a55 93 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 94 {
nyatla 77:8651d3c19a55 95 for(int i=0;i<i_num_ofparams;i++){
nyatla 77:8651d3c19a55 96 if(!NyLPC_TJsonRpcParserResult_getUInt32(i_rpc,i_start+i,(NyLPC_TUInt32*)(o_val+i))){
nyatla 77:8651d3c19a55 97 i_mod->putError(i_rpc->method.id,ModJsonRpc::INVALID_PARAMS);
nyatla 77:8651d3c19a55 98 return false;
nyatla 77:8651d3c19a55 99 }
nyatla 77:8651d3c19a55 100 }
nyatla 77:8651d3c19a55 101 return true;
nyatla 77:8651d3c19a55 102 }
nyatla 77:8651d3c19a55 103
nyatla 77:8651d3c19a55 104 };
nyatla 77:8651d3c19a55 105
nyatla 77:8651d3c19a55 106 }