summaryrefslogtreecommitdiff
path: root/hid-dials/Src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'hid-dials/Src/main.c')
-rw-r--r--hid-dials/Src/main.c338
1 files changed, 110 insertions, 228 deletions
diff --git a/hid-dials/Src/main.c b/hid-dials/Src/main.c
index 58c40ad..0aa694f 100644
--- a/hid-dials/Src/main.c
+++ b/hid-dials/Src/main.c
@@ -1,4 +1,6 @@
+#include <stdbool.h>
+
#include "main.h"
#include "usb_device.h"
#include "usbd_hid.h"
@@ -13,12 +15,13 @@ 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);
+enum keybits {
+ KEYBITS_VOL_UP = 0x20,
+ KEYBITS_VOL_DOWN = 0x40,
+};
+
+void sendKeybits(uint8_t keybits);
struct key_t
{
@@ -32,94 +35,69 @@ uint16_t ADCreg[8];
uint16_t ADCval[8];
uint16_t ADClast[8];
+/* FIXME debug remove */
+TIM_TypeDef *tim1 = TIM1;
+TIM_TypeDef *tim3 = TIM3;
+
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_Init();
+
+ SystemClock_Config();
+
+ MX_GPIO_Init();
+ MX_USB_HID_INIT();
+
+ __HAL_RCC_TIM1_CLK_ENABLE();
+ __HAL_RCC_TIM3_CLK_ENABLE();
+
+ TIM1->SMCR = 3; // Encoder mode 3
+ TIM1->CCER = 0; // rising edge polarity
+ TIM1->ARR = 0xFFFF; // count from 0-ARR or ARR-0
+ TIM1->CCMR1 = 0x0101; // f_DTS/16, N=8, IC1->TI1, IC2->TI2
+ TIM1->CNT = 0; // Initialize counter
+ TIM1->EGR = 1; // Generate an update event
+ TIM1->CR1 = 1; // Enable the counter
+
+ TIM3->SMCR = 3; // Encoder mode 3
+ TIM3->CCER = 0; // rising edge polarity
+ TIM3->ARR = 0xFFFF; // count from 0-ARR or ARR-0
+ TIM3->CCMR1 = 0x0101; // f_DTS/16, N=8, IC1->TI1, IC2->TI2
+ TIM3->CNT = 0; // Initialize counter
+ TIM3->EGR = 1; // Generate an update event
+ TIM3->CR1 = 1; // Enable the counter
+
+ uint16_t tim1_last = TIM1->CNT, tim3_last = TIM3->CNT;
+ int vol_delta = 0;
+ bool tx_vol_reset = 0;
+ while (1) {
+ uint16_t tim1_now = TIM1->CNT, tim3_now = TIM3->CNT;
+ int16_t tim1_delta = (int16_t)(tim1_now - tim1_last);
+ int16_t tim3_delta = (int16_t)(tim3_now - tim3_last);
+
+ vol_delta += tim3_delta - tim1_delta;
+
+#define VOL_DELTA_INC 4
+ uint8_t keybits = 0;
+ if (!tx_vol_reset) {
+ if (vol_delta >= VOL_DELTA_INC) {
+ keybits |= KEYBITS_VOL_UP;
+ vol_delta -= VOL_DELTA_INC;
+ tx_vol_reset = 1;
+ } else if (vol_delta <= -VOL_DELTA_INC) {
+ keybits |= KEYBITS_VOL_DOWN;
+ vol_delta += VOL_DELTA_INC;
+ tx_vol_reset = 1;
+ }
+ } else {
+ tx_vol_reset = 0;
+ }
+ sendKeybits(keybits);
+
+ tim1_last = tim1_now;
+ tim3_last = tim3_now;
+ HAL_Delay(10);
}
-
- HAL_Delay(10);
- }
}
@@ -293,154 +271,58 @@ void sendCharWrong(uint8_t ch){
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 sendKeybits(uint8_t keybits){
+ uint8_t report[2];
+ report[0]= HID_MEDIA_REPORT;
+ report[1]= keybits;
+ USBD_HID_SendReport(&hUsbDeviceFS, report, 2);
}
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);
+ 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)
-{
+static void MX_GPIO_Init(void) {
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
- 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);
+ GPIOA->MODER = 0x28000000 | (2<<(8*2)) | (2<<(9*2));
+ GPIOB->MODER = (2<<(4*2)) | (2<<(5*2));
+ GPIOA->PUPDR = 0x24000000 | (1<<(8*2)) | (1<<(9*2));
+ GPIOB->PUPDR = (1<<(4*2)) | (1<<(5*2));
+ GPIOA->AFR[1]= 0x00000022;
+ GPIOB->AFR[0]= 0x00110000;
}
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);
- }
+ while(1){
+ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);
+ HAL_Delay(100);
+ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
+ HAL_Delay(100);
+ }
}
+