aboutsummaryrefslogtreecommitdiffhomepage
path: root/backends/visca.c
diff options
context:
space:
mode:
Diffstat (limited to 'backends/visca.c')
-rw-r--r--backends/visca.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/backends/visca.c b/backends/visca.c
index d408b80..32f11c9 100644
--- a/backends/visca.c
+++ b/backends/visca.c
@@ -8,6 +8,7 @@
/* TODO
* VISCA server
* Rate limiting
+ * Inquiry
*/
MM_PLUGIN_API int init(){
@@ -175,6 +176,13 @@ static size_t ptz_set_ptspeed(instance* inst, channel* c, channel_value* v, uint
return 0;
}
+static size_t ptz_set_stop(instance* inst, channel* c, channel_value* v, uint8_t* msg){
+ ptz_instance_data* data = (ptz_instance_data*) inst->impl;
+ msg[4] = data->panspeed;
+ msg[5] = data->tiltspeed;
+ return ptz_channels[stop].bytes;
+}
+
static size_t ptz_set_zoom(instance* inst, channel* c, channel_value* v, uint8_t* msg){
uint16_t position = ((ptz_channels[zoom].max - ptz_channels[zoom].min) * v->normalised) + ptz_channels[zoom].min - ptz_channels[zoom].offset;
msg[4] = ((position & 0xF000) >> 12);
@@ -193,6 +201,24 @@ static size_t ptz_set_focus(instance* inst, channel* c, channel_value* v, uint8_
return ptz_channels[focus].bytes;
}
+static size_t ptz_set_focus_mode(instance* inst, channel* c, channel_value* v, uint8_t* msg){
+ msg[4] = (v->normalised > 0.9) ? 2 : 3;
+ return ptz_channels[focus_mode].bytes;
+}
+
+static size_t ptz_set_wb_mode(instance* inst, channel* c, channel_value* v, uint8_t* msg){
+ msg[4] = (v->normalised > 0.9) ? 0 : 5;
+ return ptz_channels[wb_mode].bytes;
+}
+
+static size_t ptz_set_wb(instance* inst, channel* c, channel_value* v, uint8_t* msg){
+ uint8_t command = c->ident & 0xFF;
+ uint8_t value = ((ptz_channels[command].max - ptz_channels[command].min) * v->normalised) + ptz_channels[command].min - ptz_channels[command].offset;
+ msg[6] = value >> 4;
+ msg[7] = value & 0x0F;
+ return ptz_channels[command].bytes;
+}
+
static size_t ptz_set_memory(instance* inst, channel* c, channel_value* v, uint8_t* msg){
if(v->normalised < 0.9){
return 0;
@@ -223,6 +249,8 @@ static int ptz_set(instance* inst, size_t num, channel** c, channel_value* v){
if(ptz_channels[command].bytes){
memcpy(tx, ptz_channels[command].pattern, ptz_channels[command].bytes);
+ //if no handler function set, assume a parameterless command and send verbatim
+ bytes = ptz_channels[command].bytes;
}
tx[0] = 0x80 | (data->cam_address & 0xF);