int buttonsUpdate(const Event** eventTriggered) { int result = EVENT_NONE; uint32_t buttonChange = buttonsState ^ buttonsNewState; if (buttonChange) { debugSetOverlayHex(0, buttonsNewState); uint32_t buttonsNewOn = buttonsNewState & buttonChange; if (buttonsNewOn) { for (size_t i = 0; i < activeMappingCount; i++) { if (activeMapping[i].buttonMask == buttonsNewOn && activeMapping[i].eventOffset) { *eventTriggered = (const Event*) GET_FLASH_PTR(activeMapping[i].eventOffset); result = (*eventTriggered)->type; break; } } } buttonsState = buttonsNewState; } return result; }
/** Main routine for d12, poll interrupts and check suspend state. **/ void d12_main(void) { while (d12_is_irq()) { uint8_t irq[2]; d12_read_cmd(D12_CMD_READ_INT_REG, irq, 2); uint8_t i; for (i = 0; i < sizeof(event_list) / sizeof(usb_event_list_t); i++) { const usb_event_list_t *event = event_list + i; if (irq[0] & GET_FLASH(&(event->mask))) { void (*function)(uint8_t); function = GET_FLASH_PTR(&(event->function)); function(GET_FLASH(&(event->param))); } } } // d12_suspend_handler(); }
/** Answer a GET_DESCRIPTOR request on ep0. **/ void d12_get_descriptor(usb_setup_request_t *setup_pkt) { tx_ptr = NULL; tx_bytes = 0; d12_flags &= ~D12_FLAG_FLASH; uint8_t value = setup_pkt->wValue >> 8; switch (value) { case USB_DESCRIPTOR_DEVICE: tx_ptr = (uint8_t *)&usb_device_descriptor; tx_bytes = sizeof(usb_device_descriptor); d12_flags |= D12_FLAG_FLASH; break; case USB_DESCRIPTOR_CONFIGURATION: tx_ptr = (uint8_t *)&usb_configuration_descriptor; tx_bytes = sizeof(usb_configuration_descriptor); d12_flags |= D12_FLAG_FLASH; break; case USB_DESCRIPTOR_STRING: { uint8_t i; for (i = 0; i < sizeof(usb_string_list) / sizeof(usb_string_list_t); i++) { const usb_string_list_t *list = usb_string_list + i; if (pgm_read_byte(&list->index) == (setup_pkt->wValue & 0xFF)) { tx_ptr = GET_FLASH_PTR(&list->str); tx_bytes = pgm_read_byte(&list->size); d12_flags |= D12_FLAG_FLASH; } } break; } } if (tx_bytes) { if (tx_bytes > setup_pkt->wLength) tx_bytes = setup_pkt->wLength; d12_write_ep0_buf(); } else { d12_stall_ep0(); } }