via_test.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2022 Jason Williams (@wilba)
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. // This is a test harness for VIA custom UI.
  4. //
  5. // It handles channel IDs 0-7, value IDs 0-7.
  6. //
  7. // It's useful for testing custom UI on a PCB without compiling in
  8. // features, especially features that will cause firmware to freeze
  9. // if the PCB doesn't have support.
  10. //
  11. // To use:
  12. // - add `SRC = keyboards/wilba_tech/via_test.c` to rules.mk
  13. // - add `#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 128` to config.h
  14. // (or change to match CHANNELS*VALUES*2)
  15. #include "quantum.h"
  16. #include "via.h"
  17. #ifdef VIA_ENABLE
  18. #define CHANNELS 8
  19. #define VALUES 8
  20. uint8_t g_value[CHANNELS][VALUES][2];
  21. void values_init(void)
  22. {
  23. for ( uint8_t channel_id = 0; channel_id < CHANNELS; channel_id++ ) {
  24. for ( uint8_t value_id = 0; value_id < VALUES; value_id++ ) {
  25. g_value[channel_id][value_id][0] = 0x00;
  26. g_value[channel_id][value_id][1] = 0x00;
  27. }
  28. }
  29. }
  30. void values_load(void)
  31. {
  32. eeprom_read_block( g_value, ((void*)VIA_EEPROM_CUSTOM_CONFIG_ADDR), VIA_EEPROM_CUSTOM_CONFIG_SIZE );
  33. }
  34. void values_save(void)
  35. {
  36. eeprom_update_block( g_value, ((void*)VIA_EEPROM_CUSTOM_CONFIG_ADDR), VIA_EEPROM_CUSTOM_CONFIG_SIZE );
  37. }
  38. // We do this to test if VIA is sending save commands per channel
  39. // Not relevant for real situations
  40. void values_save_on_channel(uint8_t channel_id)
  41. {
  42. uint16_t offset = channel_id * VALUES * 2;
  43. eeprom_update_block( ((void*)g_value) + offset,
  44. ((void*)VIA_EEPROM_CUSTOM_CONFIG_ADDR) + offset,
  45. VALUES * 2 );
  46. }
  47. void via_init_kb(void)
  48. {
  49. values_init();
  50. // If the EEPROM has the magic, the data is good.
  51. // OK to load from EEPROM
  52. if (via_eeprom_is_valid()) {
  53. values_load();
  54. } else {
  55. values_save();
  56. // DO NOT set EEPROM valid here, let caller do this
  57. }
  58. }
  59. void set_value( uint8_t channel_id, uint8_t *data )
  60. {
  61. // data = [ value_id, value_data ]
  62. uint8_t *value_id = &(data[0]);
  63. uint8_t *value_data = &(data[1]);
  64. if ( *value_id >= 0 && *value_id < VALUES ) {
  65. g_value[channel_id][*value_id][0] = value_data[0];
  66. g_value[channel_id][*value_id][1] = value_data[1];
  67. }
  68. }
  69. void get_value( uint8_t channel_id, uint8_t *data )
  70. {
  71. // data = [ value_id, value_data ]
  72. uint8_t *value_id = &(data[0]);
  73. uint8_t *value_data = &(data[1]);
  74. if ( *value_id >= 0 && *value_id < VALUES ) {
  75. value_data[0] = g_value[channel_id][*value_id][0];
  76. value_data[1] = g_value[channel_id][*value_id][1];
  77. }
  78. }
  79. void via_custom_value_command(uint8_t *data, uint8_t length) {
  80. // data = [ command_id, channel_id, value_id, value_data ]
  81. uint8_t *command_id = &(data[0]);
  82. uint8_t *channel_id = &(data[1]);
  83. uint8_t *value_id_and_data = &(data[2]);
  84. if ( *channel_id >= 0 && *channel_id < CHANNELS ) {
  85. switch ( *command_id )
  86. {
  87. case id_custom_set_value:
  88. {
  89. set_value(*channel_id,value_id_and_data);
  90. break;
  91. }
  92. case id_custom_get_value:
  93. {
  94. get_value(*channel_id,value_id_and_data);
  95. break;
  96. }
  97. case id_custom_save:
  98. {
  99. //for ( uint8_t i=0; i<CHANNELS; i++) {
  100. values_save_on_channel(*channel_id);
  101. //}
  102. break;
  103. }
  104. default:
  105. {
  106. // Unhandled message.
  107. *command_id = id_unhandled;
  108. break;
  109. }
  110. }
  111. return;
  112. }
  113. else {
  114. *command_id = id_unhandled;
  115. }
  116. // DO NOT call raw_hid_send(data,length) here, let caller do this
  117. }
  118. #endif // VIA_ENABLE