X-Git-Url: https://git.ao2.it/libam7xxx.git/blobdiff_plain/8799de17e84b701462fc2299a78f41958fe82b43..c0fca96074d59d085e3299edad94583f7592f5bf:/src/am7xxx.c diff --git a/src/am7xxx.c b/src/am7xxx.c index 3c7c5b4..4ac2461 100644 --- a/src/am7xxx.c +++ b/src/am7xxx.c @@ -79,6 +79,7 @@ struct am7xxx_usb_device_descriptor { }; static int default_set_power_mode(am7xxx_device *dev, am7xxx_power_mode power); +static int picopix_set_power_mode(am7xxx_device *dev, am7xxx_power_mode power); static int default_set_zoom_mode(am7xxx_device *dev, am7xxx_zoom_mode zoom); #define DEFAULT_OPS { \ @@ -125,6 +126,9 @@ static const struct am7xxx_usb_device_descriptor supported_devices[] = { .product_id = 0x0016, .configuration = 2, .interface_number = 0, + .ops = { + .set_power_mode = picopix_set_power_mode, + }, }, { .name = "Philips/Sagemcom PicoPix 2330", @@ -163,6 +167,9 @@ typedef enum { AM7XXX_PACKET_TYPE_IMAGE = 0x02, AM7XXX_PACKET_TYPE_POWER = 0x04, AM7XXX_PACKET_TYPE_ZOOM = 0x05, + AM7XXX_PACKET_TYPE_PICOPIX_POWER_LOW = 0x15, + AM7XXX_PACKET_TYPE_PICOPIX_POWER_MEDIUM = 0x16, + AM7XXX_PACKET_TYPE_PICOPIX_POWER_HIGH = 0x17, } am7xxx_packet_type; struct am7xxx_generic_header { @@ -228,6 +235,18 @@ struct am7xxx_header { #ifdef DEBUG +static void debug_dump_generic_header(am7xxx_context *ctx, struct am7xxx_generic_header *g) +{ + if (ctx == NULL || g == NULL) + return; + + debug(ctx, "Generic header:\n"); + debug(ctx, "\tfield0: 0x%08x (%u)\n", g->field0, g->field0); + debug(ctx, "\tfield1: 0x%08x (%u)\n", g->field1, g->field1); + debug(ctx, "\tfield2: 0x%08x (%u)\n", g->field2, g->field2); + debug(ctx, "\tfield3: 0x%08x (%u)\n", g->field3, g->field3); +} + static void debug_dump_devinfo_header(am7xxx_context *ctx, struct am7xxx_devinfo_header *d) { if (ctx == NULL || d == NULL) @@ -306,7 +325,8 @@ static void debug_dump_header(am7xxx_context *ctx, struct am7xxx_header *h) break; default: - debug(ctx, "Packet type not supported!\n"); + debug(ctx, "Parsing data not supported for this packet type!\n"); + debug_dump_generic_header(ctx, &(h->header_data.data)); break; } debug(ctx, "END\n\n"); @@ -877,6 +897,26 @@ static int default_set_power_mode(am7xxx_device *dev, am7xxx_power_mode power) return 0; } +static int picopix_set_power_mode(am7xxx_device *dev, am7xxx_power_mode power) +{ + switch(power) { + case AM7XXX_POWER_LOW: + return send_command(dev, AM7XXX_PACKET_TYPE_PICOPIX_POWER_LOW); + + case AM7XXX_POWER_MIDDLE: + return send_command(dev, AM7XXX_PACKET_TYPE_PICOPIX_POWER_MEDIUM); + + case AM7XXX_POWER_HIGH: + return send_command(dev, AM7XXX_PACKET_TYPE_PICOPIX_POWER_HIGH); + + case AM7XXX_POWER_OFF: + case AM7XXX_POWER_TURBO: + default: + error(dev->ctx, "Unsupported power mode.\n"); + return -EINVAL; + }; +} + static int default_set_zoom_mode(am7xxx_device *dev, am7xxx_zoom_mode zoom) { int ret;