#include "rawhid.h" uint8_t hid_anim_data[32]; // See rawhid.h for prococol documentation void raw_hid_receive(uint8_t *data, uint8_t length) { uint8_t cmd = data[0]; switch (cmd) { case CMD_HELLO: ergodox_right_led_1_on(); _delay_ms(50); ergodox_right_led_1_off(); hid_send_state(); break; #ifdef RGB_MATRIX_DATAPOINTER_ENABLED case CMD_ANIM_DATA: cmd_animation(data, length); break; #endif default: break; } } void hid_send_state() { uint8_t packet[RAW_EPSIZE] = { CMD_SEND_STATE }; if (rgb_matrix_get_flags() != LED_FLAG_ALL) { // RGB matrix is disabled packet[1] = 0x00; } else { uint8_t mode = rgb_matrix_get_mode(); switch (mode) { case RGB_MATRIX_CUSTOM_FFT_ANIM: // FFT Animation is active packet[1] = 0x02; break; default: // Normal animation is active packet[1] = 0x01; break; } } // Note that all sent packets MUST be // RAW_EPSIZE long. raw_hid_send(packet, RAW_EPSIZE); } #ifdef RGB_MATRIX_DATAPOINTER_ENABLED void cmd_animation(uint8_t *data, uint8_t length) { switch (data[1]) { case CMD_ANIM_DATA_fft: // Only read data if animation is in fft mode if (rgb_matrix_get_mode() == RGB_MATRIX_CUSTOM_FFT_ANIM) { // rgb_matrix_anim_data is set to NULL at animation init. if (rgb_matrix_anim_data == NULL) { rgb_matrix_anim_data = hid_anim_data; } // Copy data into rgb matrix array memcpy( hid_anim_data, data + 2, sizeof(uint8_t) + 10 ); } else { // If not in fft mode and we receive fft data, send a state packet so host stops sending data. hid_send_state(); } break; } } #endif