added files
This commit is contained in:
parent
3ec13d81e7
commit
f7de54fc6f
3031 changed files with 1961060 additions and 0 deletions
446
hid-dials/Src/main.c
Normal file
446
hid-dials/Src/main.c
Normal file
|
|
@ -0,0 +1,446 @@
|
|||
|
||||
#include "main.h"
|
||||
#include "usb_device.h"
|
||||
#include "usbd_hid.h"
|
||||
|
||||
#define HID_MEDIA_REPORT 2
|
||||
#define HYSTERESIS 200
|
||||
|
||||
ADC_HandleTypeDef hadc;
|
||||
DMA_HandleTypeDef hdma_adc;
|
||||
|
||||
PCD_HandleTypeDef hpcd_USB_FS;
|
||||
|
||||
void SystemClock_Config(void);
|
||||
static void MX_GPIO_Init(void);
|
||||
static void MX_DMA_Init(void);
|
||||
static void MX_ADC_Init(void);
|
||||
static void MX_USB_PCD_Init(void);
|
||||
|
||||
void sendVolDown(void);
|
||||
void sendVolUp(void);
|
||||
|
||||
struct key_t
|
||||
{
|
||||
uint8_t id;
|
||||
uint8_t modifier;
|
||||
uint8_t reserved;
|
||||
uint8_t keycode[6];
|
||||
} key;
|
||||
|
||||
uint16_t ADCreg[8];
|
||||
uint16_t ADCval[8];
|
||||
uint16_t ADClast[8];
|
||||
|
||||
int main(void)
|
||||
{
|
||||
HAL_Init();
|
||||
|
||||
SystemClock_Config();
|
||||
|
||||
MX_GPIO_Init();
|
||||
MX_DMA_Init();
|
||||
MX_ADC_Init();
|
||||
MX_USB_HID_INIT();
|
||||
|
||||
HAL_ADC_Start_DMA(&hadc, ADCreg, 8);
|
||||
|
||||
while (1)
|
||||
{
|
||||
|
||||
|
||||
for(int i = 0; i < 8; i++){
|
||||
ADCval[i] = ADCreg[i];
|
||||
if(ADCval[i] - ADClast[i] > 2000 || ADClast[i] - ADCval[i] > 2000 ) ADClast[i] = ADCval[i];
|
||||
}
|
||||
|
||||
// Volume Dial 8
|
||||
if(ADCval[0] >= ADClast[0] + HYSTERESIS){
|
||||
sendVolUp();
|
||||
ADClast[0] = ADCval[0];
|
||||
} else if(ADCval[0] <= ADClast[0] - HYSTERESIS){
|
||||
sendVolDown();
|
||||
ADClast[0] = ADCval[0];
|
||||
}
|
||||
|
||||
// Dial 1
|
||||
if(ADCval[1] >= ADClast[1] + HYSTERESIS){
|
||||
} else if(ADCval[1] <= ADClast[1] - HYSTERESIS){
|
||||
}
|
||||
|
||||
// SwitchLayer
|
||||
if(ADCval[2] >= ADClast[2] + HYSTERESIS){
|
||||
sendChar('v');
|
||||
ADClast[2] = ADCval[2];
|
||||
} else if(ADCval[2] <= ADClast[2] - HYSTERESIS){
|
||||
sendChar('v');
|
||||
ADClast[2] = ADCval[2];
|
||||
}
|
||||
|
||||
// RotatePart Dial 3
|
||||
if(ADCval[3] >= ADClast[3] + HYSTERESIS){
|
||||
sendChar('R');
|
||||
ADClast[3] = ADCval[3];
|
||||
} else if(ADCval[3] <= ADClast[3] - HYSTERESIS){
|
||||
sendChar('r');
|
||||
ADClast[3] = ADCval[3];
|
||||
}
|
||||
|
||||
// Grid Dial 4
|
||||
if(ADCval[4] >= ADClast[4] + HYSTERESIS){
|
||||
sendChar('n');
|
||||
ADClast[4] = ADCval[4];
|
||||
} else if(ADCval[4] <= ADClast[4] - HYSTERESIS){
|
||||
sendChar('N');
|
||||
ADClast[4] = ADCval[4];
|
||||
}
|
||||
|
||||
// via
|
||||
if(ADCval[5] >= ADClast[5] + HYSTERESIS){
|
||||
} else if(ADCval[5] <= ADClast[5] - HYSTERESIS){
|
||||
}
|
||||
|
||||
// Trackwidth Dial 6
|
||||
if(ADCval[6] >= ADClast[6] + HYSTERESIS){
|
||||
sendChar('w');
|
||||
ADClast[6] = ADCval[6];
|
||||
} else if(ADCval[6] <= ADClast[6] - HYSTERESIS){
|
||||
sendChar('W');
|
||||
ADClast[6] = ADCval[6];
|
||||
}
|
||||
|
||||
// zoom
|
||||
if(ADCval[7] >= ADClast[7] + HYSTERESIS){
|
||||
sendCharWrong(0x3a);
|
||||
ADClast[7] = ADCval[7];
|
||||
} else if(ADCval[7] <= ADClast[7] - HYSTERESIS){
|
||||
sendCharWrong(0x3b);
|
||||
ADClast[7] = ADCval[7];
|
||||
}
|
||||
|
||||
HAL_Delay(10);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const uint8_t _asciimap[128] =
|
||||
{
|
||||
0x00, // NUL
|
||||
0x00, // SOH
|
||||
0x00, // STX
|
||||
0x00, // ETX
|
||||
0x00, // EOT
|
||||
0x00, // ENQ
|
||||
0x00, // ACK
|
||||
0x00, // BEL
|
||||
0x2a, // BS Backspace
|
||||
0x2b, // TAB Tab
|
||||
0x28, // LF Enter
|
||||
0x00, // VT
|
||||
0x00, // FF
|
||||
0x00, // CR
|
||||
0x00, // SO
|
||||
0x00, // SI
|
||||
0x00, // DEL
|
||||
0x00, // DC1
|
||||
0x00, // DC2
|
||||
0x00, // DC3
|
||||
0x00, // DC4
|
||||
0x00, // NAK
|
||||
0x00, // SYN
|
||||
0x00, // ETB
|
||||
0x00, // CAN
|
||||
0x00, // EM
|
||||
0x00, // SUB
|
||||
0x00, // ESC
|
||||
0x00, // FS
|
||||
0x00, // GS
|
||||
0x00, // RS
|
||||
0x00, // US
|
||||
|
||||
0x2c, // ' '
|
||||
0x1e|0x80, // !
|
||||
0x34|0x80, // "
|
||||
0x20|0x80, // #
|
||||
0x21|0x80, // $
|
||||
0x22|0x80, // %
|
||||
0x24|0x80, // &
|
||||
0x34, // '
|
||||
0x26|0x80, // (
|
||||
0x27|0x80, // )
|
||||
0x25|0x80, // *
|
||||
0x2e|0x80, // +
|
||||
0x36, // ,
|
||||
0x2d, // -
|
||||
0x37, // .
|
||||
0x38, // /
|
||||
0x27, // 0
|
||||
0x1e, // 1
|
||||
0x1f, // 2
|
||||
0x20, // 3
|
||||
0x21, // 4
|
||||
0x22, // 5
|
||||
0x23, // 6
|
||||
0x24, // 7
|
||||
0x25, // 8
|
||||
0x26, // 9
|
||||
0x33|0x80, // :
|
||||
0x33, // ;
|
||||
0x36|0x80, // <
|
||||
0x2e, // =
|
||||
0x37|0x80, // >
|
||||
0x38|0x80, // ?
|
||||
0x1f|0x80, // @
|
||||
0x04|0x80, // A
|
||||
0x05|0x80, // B
|
||||
0x06|0x80, // C
|
||||
0x07|0x80, // D
|
||||
0x08|0x80, // E
|
||||
0x09|0x80, // F
|
||||
0x0a|0x80, // G
|
||||
0x0b|0x80, // H
|
||||
0x0c|0x80, // I
|
||||
0x0d|0x80, // J
|
||||
0x0e|0x80, // K
|
||||
0x0f|0x80, // L
|
||||
0x10|0x80, // M
|
||||
0x11|0x80, // N
|
||||
0x12|0x80, // O
|
||||
0x13|0x80, // P
|
||||
0x14|0x80, // Q
|
||||
0x15|0x80, // R
|
||||
0x16|0x80, // S
|
||||
0x17|0x80, // T
|
||||
0x18|0x80, // U
|
||||
0x19|0x80, // V
|
||||
0x1a|0x80, // W
|
||||
0x1b|0x80, // X
|
||||
0x1c|0x80, // Y
|
||||
0x1d|0x80, // Z
|
||||
0x2f, // [
|
||||
0x31, // bslash
|
||||
0x30, // ]
|
||||
0x23|0x80, // ^
|
||||
0x2d|0x80, // _
|
||||
0x35, // `
|
||||
0x04, // a
|
||||
0x05, // b
|
||||
0x06, // c
|
||||
0x07, // d
|
||||
0x08, // e
|
||||
0x09, // f
|
||||
0x0a, // g
|
||||
0x0b, // h
|
||||
0x0c, // i
|
||||
0x0d, // j
|
||||
0x0e, // k
|
||||
0x0f, // l
|
||||
0x10, // m
|
||||
0x11, // n
|
||||
0x12, // o
|
||||
0x13, // p
|
||||
0x14, // q
|
||||
0x15, // r
|
||||
0x16, // s
|
||||
0x17, // t
|
||||
0x18, // u
|
||||
0x19, // v
|
||||
0x1a, // w
|
||||
0x1b, // x
|
||||
0x1c, // y
|
||||
0x1d, // z
|
||||
0x2f|0x80, // {
|
||||
0x31|0x80, // |
|
||||
0x30|0x80, // }
|
||||
0x35|0x80, // ~
|
||||
0 // DEL
|
||||
};
|
||||
|
||||
|
||||
void sendChar(uint8_t ch){
|
||||
if( ch > 128 ) ch -=128;
|
||||
|
||||
key.id = 1;
|
||||
key.keycode[0]=_asciimap[ch]&0x7F;
|
||||
key.keycode[1]=0;
|
||||
|
||||
if ( _asciimap[ch] & 0x80) key.modifier |= 0x02;
|
||||
|
||||
for(int i=0; i< 4;i++){
|
||||
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&key, sizeof(key));
|
||||
HAL_Delay(10);
|
||||
}
|
||||
memset(key.keycode, 0 , sizeof(key.keycode));
|
||||
key.modifier = 0;
|
||||
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&key, sizeof(key));
|
||||
HAL_Delay(10);
|
||||
}
|
||||
|
||||
void sendCharWrong(uint8_t ch){
|
||||
key.id = 1;
|
||||
key.keycode[0]=ch&0x7F;
|
||||
key.keycode[1]=0;
|
||||
|
||||
if ( _asciimap[ch] & 0x80) key.modifier |= 0x02;
|
||||
|
||||
for(int i=0; i< 4;i++){
|
||||
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&key, sizeof(key));
|
||||
HAL_Delay(10);
|
||||
}
|
||||
memset(key.keycode, 0 , sizeof(key.keycode));
|
||||
key.modifier = 0;
|
||||
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&key, sizeof(key));
|
||||
HAL_Delay(10);
|
||||
}
|
||||
|
||||
void sendVolUp(){
|
||||
uint8_t report[3];
|
||||
report[0]= HID_MEDIA_REPORT;
|
||||
report[1]= 0xE9;
|
||||
report[2]= 0x00;
|
||||
USBD_HID_SendReport(&hUsbDeviceFS, report, 3);
|
||||
HAL_Delay(10);
|
||||
|
||||
report[0]= HID_MEDIA_REPORT;
|
||||
report[1]= 0x00;
|
||||
report[2]= 0x00;
|
||||
USBD_HID_SendReport(&hUsbDeviceFS, report, 3);
|
||||
}
|
||||
|
||||
void sendVolDown(){
|
||||
uint8_t report[3];
|
||||
report[0]= HID_MEDIA_REPORT;
|
||||
report[1]= 0xEA;
|
||||
report[2]= 0x00;
|
||||
USBD_HID_SendReport(&hUsbDeviceFS, report, 3);
|
||||
HAL_Delay(10);
|
||||
|
||||
report[0]= HID_MEDIA_REPORT;
|
||||
report[1]= 0x00;
|
||||
report[2]= 0x00;
|
||||
USBD_HID_SendReport(&hUsbDeviceFS, report, 3);
|
||||
}
|
||||
|
||||
void SystemClock_Config(void)
|
||||
{
|
||||
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
|
||||
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
|
||||
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
|
||||
|
||||
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_HSI48;
|
||||
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
|
||||
RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
|
||||
RCC_OscInitStruct.HSI14CalibrationValue = 16;
|
||||
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
|
||||
HAL_RCC_OscConfig(&RCC_OscInitStruct);
|
||||
|
||||
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|
||||
|RCC_CLOCKTYPE_PCLK1;
|
||||
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI48;
|
||||
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
||||
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
|
||||
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
|
||||
|
||||
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
|
||||
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
|
||||
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
|
||||
|
||||
}
|
||||
|
||||
static void MX_ADC_Init(void)
|
||||
{
|
||||
|
||||
ADC_ChannelConfTypeDef sConfig = {0};
|
||||
|
||||
hadc.Instance = ADC1;
|
||||
hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
|
||||
hadc.Init.Resolution = ADC_RESOLUTION_12B;
|
||||
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||||
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
|
||||
hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
|
||||
hadc.Init.LowPowerAutoWait = DISABLE;
|
||||
hadc.Init.LowPowerAutoPowerOff = DISABLE;
|
||||
hadc.Init.ContinuousConvMode = ENABLE;
|
||||
hadc.Init.DiscontinuousConvMode = DISABLE;
|
||||
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
||||
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
||||
hadc.Init.DMAContinuousRequests = ENABLE;
|
||||
hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
|
||||
HAL_ADC_Init(&hadc);
|
||||
|
||||
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
|
||||
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
|
||||
sConfig.Channel = ADC_CHANNEL_1;
|
||||
HAL_ADC_ConfigChannel(&hadc, &sConfig);
|
||||
|
||||
sConfig.Channel = ADC_CHANNEL_2;
|
||||
HAL_ADC_ConfigChannel(&hadc, &sConfig);
|
||||
|
||||
sConfig.Channel = ADC_CHANNEL_3;
|
||||
HAL_ADC_ConfigChannel(&hadc, &sConfig);
|
||||
|
||||
sConfig.Channel = ADC_CHANNEL_4;
|
||||
HAL_ADC_ConfigChannel(&hadc, &sConfig);
|
||||
|
||||
sConfig.Channel = ADC_CHANNEL_5;
|
||||
HAL_ADC_ConfigChannel(&hadc, &sConfig);
|
||||
|
||||
sConfig.Channel = ADC_CHANNEL_6;
|
||||
HAL_ADC_ConfigChannel(&hadc, &sConfig);
|
||||
|
||||
sConfig.Channel = ADC_CHANNEL_7;
|
||||
HAL_ADC_ConfigChannel(&hadc, &sConfig);
|
||||
|
||||
sConfig.Channel = ADC_CHANNEL_8;
|
||||
HAL_ADC_ConfigChannel(&hadc, &sConfig);
|
||||
}
|
||||
|
||||
static void MX_USB_PCD_Init(void)
|
||||
{
|
||||
|
||||
hpcd_USB_FS.Instance = USB;
|
||||
hpcd_USB_FS.Init.dev_endpoints = 8;
|
||||
hpcd_USB_FS.Init.speed = PCD_SPEED_FULL;
|
||||
hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
|
||||
hpcd_USB_FS.Init.low_power_enable = DISABLE;
|
||||
hpcd_USB_FS.Init.lpm_enable = DISABLE;
|
||||
hpcd_USB_FS.Init.battery_charging_enable = DISABLE;
|
||||
HAL_PCD_Init(&hpcd_USB_FS);
|
||||
}
|
||||
|
||||
|
||||
static void MX_DMA_Init(void)
|
||||
{
|
||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||
|
||||
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
|
||||
}
|
||||
|
||||
|
||||
static void MX_GPIO_Init(void)
|
||||
{
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
|
||||
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_13;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
}
|
||||
|
||||
void Error_Handler(void)
|
||||
{
|
||||
while(1){
|
||||
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);
|
||||
HAL_Delay(100);
|
||||
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
|
||||
HAL_Delay(100);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue