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;
};