/** * cd_sensor_init: **/ static void cd_sensor_init (CdSensor *sensor) { sensor->priv = CD_SENSOR_GET_PRIVATE (sensor); sensor->priv->state = CD_SENSOR_STATE_IDLE; sensor->priv->mode = CD_SENSOR_CAP_UNKNOWN; #ifdef HAVE_GUSB sensor->priv->usb_ctx = g_usb_context_new (NULL); sensor->priv->device_list = g_usb_device_list_new (sensor->priv->usb_ctx); #endif sensor->priv->options = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_variant_unref); sensor->priv->metadata = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); }
int main (int argc, char *argv[]) { gboolean ret; GError *error = NULL; GMainLoop *loop = NULL; GUsbContext *ctx; GUsbDevice *device = NULL; int retval = 0; GUsbDeviceList *list = NULL; ChDeviceQueue *device_queue; /* setup usb */ g_type_init (); ctx = g_usb_context_new (&error); if (ctx == NULL) { g_warning ("Cannot connect to USB : %s", error->message); g_error_free (error); retval = 1; goto out; } list = g_usb_device_list_new (ctx); device_queue = ch_device_queue_new (); ret = connect_device (list, &device, &error); if (!ret) { g_warning ("Cannot connect to device : %s", error->message); g_error_free (error); retval = 1; goto out; } /* reset device so it boots back into bootloader mode */ g_warning ("Switching to bootloader mode\n"); ch_device_queue_reset (device_queue, device); ret = ch_device_queue_process (device_queue, CH_DEVICE_QUEUE_PROCESS_FLAGS_NONE, NULL, &error); if (!ret) { g_warning ("Failed to reboot : %s", error->message); g_error_free (error); retval = 1; goto out; } /* wait for device to re-appear */ loop = g_main_loop_new (NULL, FALSE); g_timeout_add (5000, quit_loop_cb, loop); g_main_loop_run (loop); g_object_unref (device); ret = connect_device (list, &device, &error); if (!ret) { g_warning ("Cannot connect to device : %s", error->message); g_error_free (error); retval = 1; goto out; } /* boot into firmware mode */ g_warning ("Switching to firmware mode\n"); ch_device_queue_boot_flash (device_queue, device); ret = ch_device_queue_process (device_queue, CH_DEVICE_QUEUE_PROCESS_FLAGS_NONE, NULL, &error); if (!ret) { g_warning ("Failed to boot into firmware mode : %s", error->message); g_error_free (error); retval = 1; goto out; } /* wait for device to re-appear */ g_timeout_add (5000, quit_loop_cb, loop); g_main_loop_run (loop); g_object_unref (device); ret = connect_device (list, &device, &error); if (!ret) { g_warning ("Cannot connect to device : %s", error->message); g_error_free (error); retval = 1; goto out; } /* turn on LEDs */ g_warning ("Turning on LEDs\n"); ch_device_queue_set_leds (device_queue, device, 3, 0, 0, 0); ret = ch_device_queue_process (device_queue, CH_DEVICE_QUEUE_PROCESS_FLAGS_NONE, NULL, &error); if (!ret) { g_warning ("Failed to turn on LEDs : %s", error->message); g_error_free (error); retval = 1; goto out; } /* success */ g_warning ("ALL OKAY\n"); out: if (loop != NULL) g_main_loop_unref (loop); if (ctx != NULL) g_object_unref (ctx); if (device_queue != NULL) g_object_unref (device_queue); if (device != NULL) g_object_unref (device); if (list != NULL) g_object_unref (list); return retval; }