ExtensionUnitのテストプログラム

class ExtensionUnit : public RPC {
public:
    ExtensionUnit(int cam, int UnitID = 9, const char* name = NULL):RPC(name), _UnitID(UnitID) {
        _cam = reinterpret_cast<BaseUvc*>(cam);
    }
    
    int PanTilt(int pan, int tilt) {
        struct PanTiltR {
            int16_t pan;
            int16_t tilt;
        } ptr;
        ptr.pan = pan;
        ptr.tilt = tilt;
        _cs = 1;
        return _cam->Control(SET_CUR, _cs, _UnitID<<8, reinterpret_cast<uint8_t*>(&ptr), sizeof(PanTiltR));
    }
    
    int Reset(int pan, int tilt) {
        uint8_t param[1];
        param[0] = 0x00;
        if (pan) {
            param[0] |= 0x01;
        }
        if (tilt) {
            param[0] |= 0x02;
        }
        _cs = 2;
        return _cam->Control(SET_CUR, _cs, _UnitID<<8, param, sizeof(param)); 
    }

    void Control(Arguments *arg, Reply *r) {
        int unit = arg->getArg<int>();
        int cs = arg->getArg<int>();
        pc.printf("unit=%d cs=%d\n", unit, cs);
        uint8_t param[RPC_MAX_ARGS];
        int size = arg->argc-2;
        for(int i = 0; i < size; i++) {
            param[i] = arg->getArg<int>();
            pc.printf("param[%d]=%02X\n", i, param[i]); 
        }
        int rc = _cam->Control(SET_CUR, cs, unit<<8, param, size);
        r->putData<int>(rc);
    }
    
    virtual const struct rpc_method *get_rpc_methods() {
        static const rpc_method rpc_methods[] = {
            {"PanTilt", rpc_method_caller<int, ExtensionUnit, int, int, &ExtensionUnit::PanTilt>},
            {"Reset", rpc_method_caller<int, ExtensionUnit, int, int, &ExtensionUnit::Reset>},
            {"Control", rpc_method_caller<ExtensionUnit, &ExtensionUnit::Control>},
            RPC_METHOD_SUPER(RPC)
        };
        return rpc_methods;
    }
    
private:    
    int _UnitID;
    int _cs;
    BaseUvc* _cam;
};