]> mj.ucw.cz Git - ursary.git/blobdiff - nocturn.c
Document button assignment changes
[ursary.git] / nocturn.c
index 510fb33590178118743bbef1252c382e7f7d4df0..7353822fd5ee682edf679f61bf64e717ed57e785 100644 (file)
--- a/nocturn.c
+++ b/nocturn.c
@@ -229,9 +229,9 @@ static byte noct_button_light[16];
 static byte noct_ring_mode[8];         // RING_MODE_xxx
 static byte noct_ring_val[9];
 
-static uns noct_dirty_button;
-static uns noct_dirty_ring_mode;
-static uns noct_dirty_ring_val;
+static uint noct_dirty_button;
+static uint noct_dirty_ring_mode;
+static uint noct_dirty_ring_val;
 
 static struct libusb_transfer *noct_write_xfer;
 static bool noct_write_pending;
@@ -251,7 +251,7 @@ static void noct_write_done(struct libusb_transfer *xfer)
   noct_sched_write();
 }
 
-static void noct_do_write(uns cmd, uns arg)
+static void noct_do_write(uint cmd, uint arg)
 {
   DBG("USB: Submitting write %02x %02x", cmd, arg);
   ASSERT(!noct_write_pending);
@@ -270,7 +270,7 @@ static void noct_do_write(uns cmd, uns arg)
 
 static void noct_sched_write(void)
 {
-  if (noct_write_pending)
+  if (!usb_dev || noct_write_pending)
     return;
 
   if (noct_dirty_button)
@@ -328,6 +328,14 @@ void noct_set_button(int button, int val)
     }
 }
 
+void noct_clear(void)
+{
+  for (int i=0; i<=8; i++)
+    noct_set_ring(i, RING_MODE_LEFT, 0);
+  for (int i=0; i<16; i++)
+    noct_set_button(i, 0);
+}
+
 static void noct_write_init(void)
 {
   DBG("Noct: Write init");
@@ -386,6 +394,9 @@ static void noct_connect(struct main_timer *t)
   if ((err = libusb_open(found_dev, &usb_dev)) < 0)
     return noct_error(err, "libusb_open failed");
 
+  // In newer kernels, Nocturn is claimed by snd-usb-audio. Tell it to surrender the device.
+  libusb_detach_kernel_driver(usb_dev, 0);
+
   // There exist configurations 1 (high brightness) and 2 (power-save)
   if ((err = libusb_set_configuration(usb_dev, 2)) < 0)
     return noct_error(err, "libusb_set_configuration failed");
@@ -482,7 +493,6 @@ void noct_init(void)
   // Initialize libusb
   if ((err = libusb_init(&usb_ctx)) < 0)
     die("libusb_init failed: error %d", err);
-  libusb_set_debug(usb_ctx, 3);
 
   // Connect libusb to UCW mainloop