summaryrefslogtreecommitdiffstats
path: root/keyboards/wilba_tech/via_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/wilba_tech/via_test.c')
-rw-r--r--keyboards/wilba_tech/via_test.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/keyboards/wilba_tech/via_test.c b/keyboards/wilba_tech/via_test.c
new file mode 100644
index 0000000000..6a74df5164
--- /dev/null
+++ b/keyboards/wilba_tech/via_test.c
@@ -0,0 +1,133 @@
+// Copyright 2022 Jason Williams (@wilba)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+// This is a test harness for VIA custom UI.
+//
+// It handles channel IDs 0-7, value IDs 0-7.
+//
+// It's useful for testing custom UI on a PCB without compiling in
+// features, especially features that will cause firmware to freeze
+// if the PCB doesn't have support.
+//
+// To use:
+// - add `SRC = keyboards/wilba_tech/via_test.c` to rules.mk
+// - add `#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 128` to config.h
+// (or change to match CHANNELS*VALUES*2)
+
+#include "quantum.h"
+#include "via.h"
+
+#ifdef VIA_ENABLE
+
+#define CHANNELS 8
+#define VALUES 8
+uint8_t g_value[CHANNELS][VALUES][2];
+
+void values_init(void)
+{
+ for ( uint8_t channel_id = 0; channel_id < CHANNELS; channel_id++ ) {
+ for ( uint8_t value_id = 0; value_id < VALUES; value_id++ ) {
+ g_value[channel_id][value_id][0] = 0x00;
+ g_value[channel_id][value_id][1] = 0x00;
+ }
+ }
+}
+
+void values_load(void)
+{
+ eeprom_read_block( g_value, ((void*)VIA_EEPROM_CUSTOM_CONFIG_ADDR), VIA_EEPROM_CUSTOM_CONFIG_SIZE );
+}
+
+void values_save(void)
+{
+ eeprom_update_block( g_value, ((void*)VIA_EEPROM_CUSTOM_CONFIG_ADDR), VIA_EEPROM_CUSTOM_CONFIG_SIZE );
+}
+
+// We do this to test if VIA is sending save commands per channel
+// Not relevant for real situations
+void values_save_on_channel(uint8_t channel_id)
+{
+ uint16_t offset = channel_id * VALUES * 2;
+ eeprom_update_block( ((void*)g_value) + offset,
+ ((void*)VIA_EEPROM_CUSTOM_CONFIG_ADDR) + offset,
+ VALUES * 2 );
+}
+
+void via_init_kb(void)
+{
+ values_init();
+
+ // If the EEPROM has the magic, the data is good.
+ // OK to load from EEPROM
+ if (via_eeprom_is_valid()) {
+ values_load();
+ } else {
+ values_save();
+ // DO NOT set EEPROM valid here, let caller do this
+ }
+}
+
+void set_value( uint8_t channel_id, uint8_t *data )
+{
+ // data = [ value_id, value_data ]
+ uint8_t *value_id = &(data[0]);
+ uint8_t *value_data = &(data[1]);
+ if ( *value_id >= 0 && *value_id < VALUES ) {
+ g_value[channel_id][*value_id][0] = value_data[0];
+ g_value[channel_id][*value_id][1] = value_data[1];
+ }
+}
+
+void get_value( uint8_t channel_id, uint8_t *data )
+{
+ // data = [ value_id, value_data ]
+ uint8_t *value_id = &(data[0]);
+ uint8_t *value_data = &(data[1]);
+ if ( *value_id >= 0 && *value_id < VALUES ) {
+ value_data[0] = g_value[channel_id][*value_id][0];
+ value_data[1] = g_value[channel_id][*value_id][1];
+ }
+}
+
+void via_custom_value_command(uint8_t *data, uint8_t length) {
+ // data = [ command_id, channel_id, value_id, value_data ]
+ uint8_t *command_id = &(data[0]);
+ uint8_t *channel_id = &(data[1]);
+ uint8_t *value_id_and_data = &(data[2]);
+
+ if ( *channel_id >= 0 && *channel_id < CHANNELS ) {
+ switch ( *command_id )
+ {
+ case id_custom_set_value:
+ {
+ set_value(*channel_id,value_id_and_data);
+ break;
+ }
+ case id_custom_get_value:
+ {
+ get_value(*channel_id,value_id_and_data);
+ break;
+ }
+ case id_custom_save:
+ {
+ //for ( uint8_t i=0; i<CHANNELS; i++) {
+ values_save_on_channel(*channel_id);
+ //}
+ break;
+ }
+ default:
+ {
+ // Unhandled message.
+ *command_id = id_unhandled;
+ break;
+ }
+ }
+ return;
+ }
+ else {
+ *command_id = id_unhandled;
+ }
+
+ // DO NOT call raw_hid_send(data,length) here, let caller do this
+}
+#endif // VIA_ENABLE \ No newline at end of file