+void noct_set_ring(int ring, int mode, int val)
+{
+ ASSERT(ring >= 0 && ring <= 8);
+ ASSERT(val >= 0 && val <= 0x7f);
+ ASSERT(mode >= 0 && mode <= 5);
+ ASSERT(ring < 8 || !mode);
+ if (noct_ring_mode[ring] != mode)
+ {
+ noct_ring_mode[ring] = mode;
+ noct_dirty_ring_mode |= 1U << ring;
+ noct_dirty_ring_val |= 1U << ring; // HW needs to re-send the value
+ }
+ if (noct_ring_val[ring] != val)
+ {
+ noct_ring_val[ring] = val;
+ noct_dirty_ring_val |= 1U << ring;
+ }
+ noct_sched_write();
+}
+
+void noct_set_button(int button, int val)
+{
+ ASSERT(button >= 0 && button < 16);
+ ASSERT(val == 0 || val == 1);
+ if (noct_button_light[button] != val)
+ {
+ noct_button_light[button] = val;
+ noct_dirty_button |= 1U << button;
+ noct_sched_write();
+ }
+}
+
+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);
+}
+