Merge branch 'powermode-PicoPix2055'
[libam7xxx.git] / src / am7xxx.c
index 3c7c5b4..4ac2461 100644 (file)
@@ -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;