mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-30 21:02:32 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // 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
 | 
