26 static constexpr uint32_t kUartFullSpeedPadsHz = 200000;
28 enum class Message : uint8_t {
31 SET_COLOUR_FOR_TWO_COLUMNS = 1,
36 SET_DEBOUNCE_TIME = 18,
37 SET_REFRESH_TIME = 19,
39 SET_GOLD_KNOB_0_INDICATORS = 20,
40 SET_GOLD_KNOB_1_INDICATORS = 21,
41 RESEND_BUTTON_STATES = 22,
42 SET_FLASH_LENGTH = 23,
43 SET_PAD_FLASHING = 24,
48 UPDATE_SEVEN_SEGMENT_DISPLAY = 224,
53 SET_SCROLL_LEFT = 236,
55 SET_SCROLL_RIGHT_FULL,
58 DONE_SENDING_ROWS = 240,
61 SET_SCROLL_DOWN = 242,
63 SET_DIMMER_INTERVAL = 243,
64 SET_MIN_INTERRUPT_INTERVAL = 244,
65 REQUEST_FIRMWARE_VERSION = 245,
81 UNKNOWN_BOOT_RESPONSE = 129,
84 FIRMWARE_VERSION_NEXT = 245,
85 UNKNOWN_OLED_RELATED_COMMAND = 246,
90 NO_PRESSES_HAPPENING = 254,
92 static constexpr Response kPadAndButtonMessagesEnd{180};
97 static void setupForPads() { uartSetBaudRate(UART_CHANNEL_PIC, kUartFullSpeedPadsHz); }
108 send(util::to_underlying(Message::SET_COLOUR_FOR_TWO_COLUMNS) + idx);
109 for (
const RGB& colour : colours) {
121 static void setDebounce(uint8_t time_ms) {
send(Message::SET_DEBOUNCE_TIME, time_ms); }
129 static void setGoldKnobIndicator(
bool which,
const std::array<uint8_t, kNumGoldKnobIndicatorLEDs>& indicator) {
130 Message knob = which ? Message::SET_GOLD_KNOB_1_INDICATORS : Message::SET_GOLD_KNOB_0_INDICATORS;
131 send(knob, indicator);
134 static void setLEDOff(
size_t idx) {
send(util::to_underlying(Message::SET_LED_OFF) + idx); }
135 static void setLEDOn(
size_t idx) {
send(util::to_underlying(Message::SET_LED_ON) + idx); }
142 static void setMinInterruptInterval(uint8_t time_ms) {
send(Message::SET_MIN_INTERRUPT_INTERVAL, time_ms); }
143 static void setFlashLength(uint8_t time_ms) {
send(Message::SET_FLASH_LENGTH, time_ms); }
145 static void setUARTSpeed() {
146 uint8_t speed = 4000000.0f / kUartFullSpeedPadsHz - 0.5f;
147 send(Message::SET_UART_SPEED, speed);
150 static void flashMainPad(
size_t idx) {
send(util::to_underlying(Message::SET_PAD_FLASHING) + idx); }
159 send(util::to_underlying(Message::SET_FLASH_COLOR) + colour_idx);
163 static void update7SEG(
const std::array<uint8_t, kNumericDisplayLength>& display) {
164 send(Message::UPDATE_SEVEN_SEGMENT_DISPLAY, display);
167 static void enableOLED() {
send(Message::ENABLE_OLED); }
168 static void selectOLED() {
send(Message::SELECT_OLED); }
169 static void deselectOLED() {
send(Message::DESELECT_OLED); }
170 static void setDCLow() {
send(Message::SET_DC_LOW); }
171 static void setDCHigh() {
send(Message::SET_DC_HIGH); }
173 static void requestFirmwareVersion() {
send(Message::REQUEST_FIRMWARE_VERSION); }
175 static void sendColour(
const RGB& colour) {
send(colour); }
177 static void setRefreshTime(uint8_t time_ms) {
send(Message::SET_REFRESH_TIME, time_ms); }
178 static void setDimmerInterval(uint8_t interval) {
send(Message::SET_DIMMER_INTERVAL, interval); }
188 send(util::to_underlying(Message::SET_SCROLL_ROW) + idx);
192 static void setupHorizontalScroll(uint8_t bitflags) {
193 send(util::to_underlying(Message::SET_SCROLL_LEFT) + bitflags);
196 static void doVerticalScroll(
bool direction,
const std::array<RGB, kDisplayWidth + kSideBarWidth>& colours) {
197 Message msg = direction ? Message::SET_SCROLL_UP : Message::SET_SCROLL_DOWN;
201 static void doneSendingRows() {
send(Message::DONE_SENDING_ROWS); }
206 static void flush() { uartFlushIfNotSending(UART_ITEM_PIC); }
212 while (!(DMACn(PIC_TX_DMA_CHANNEL).CHSTAT_n & (1 << 6))) {}
222 uartGetChar(UART_ITEM_PIC, (
char*)&value);
231 uint16_t timeWaitBegan = *TCNT[TIMER_SYSTEM_FAST];
232 while ((uint16_t)(*TCNT[TIMER_SYSTEM_FAST] - timeWaitBegan) < timeout) {
234 if (value != Response::NONE) {
238 return Response::NONE;
248 static int32_t
read(uint32_t timeout, std::function<int32_t(
Response)> handler) {
249 uint16_t timeWaitBegan = *TCNT[TIMER_SYSTEM_FAST];
251 while ((uint16_t)(*TCNT[TIMER_SYSTEM_FAST] - timeWaitBegan) < timeout) {
264 template <
typename... Bytes>
265 inline static void send(Message msg, Bytes... bytes) {
267 for (
const uint8_t
byte : {bytes...}) {
275 template <
typename T,
size_t size>
276 inline static void send(Message msg,
const std::array<T, size>& bytes) {
278 for (
auto byte : bytes) {
286 inline static void send(Message msg) {
send(util::to_underlying(msg)); }
300 inline static void send(uint8_t msg) {
301 intptr_t writePos = uartItems[UART_ITEM_PIC].txBufferWritePos;
302 volatile char* uncached_tx_buf = (
volatile char*)(picTxBuffer + UNCACHED_MIRROR_OFFSET);
303 uncached_tx_buf[writePos] = msg;
304 uartItems[UART_ITEM_PIC].txBufferWritePos += 1;
305 uartItems[UART_ITEM_PIC].txBufferWritePos &= (PIC_TX_BUFFER_SIZE - 1);
static void setGoldKnobIndicator(bool which, const std::array< uint8_t, kNumGoldKnobIndicatorLEDs > &indicator)
This sets the indicator for the gold knobs,.
Definition pic.h:129