diff --git a/hardware/code/Core/Src/main.c b/hardware/code/Core/Src/main.c index 0feaa3b..488b90f 100644 --- a/hardware/code/Core/Src/main.c +++ b/hardware/code/Core/Src/main.c @@ -6,7 +6,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2023 STMicroelectronics. + *

© Copyright (c) 2022 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -36,6 +36,8 @@ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#define max(a,b) (((a) > (b)) ? (a) : (b)) /* USER CODE END PM */ @@ -48,6 +50,28 @@ UART_HandleTypeDef huart2; /* USER CODE BEGIN PV */ +uint32_t adc_vals_old[2] = {}; +uint32_t adc_vals[2]; + +uint8_t rx = 0; +uint8_t rx_buf[128] = {0}; +int tail = 0, head = 0; + +uint8_t notes[128] = {0}; +uint8_t note_priority = 1; +uint32_t tones[] = {1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + /*c4*/ 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065, 2146, 2225, 2304, 2383, + 1508, 1587, 1666, 1745, 1824, 1903, 1986, 2065}; + /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -63,6 +87,69 @@ static void MX_DAC1_Init(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ +uint32_t endian_swap(uint32_t value) +{ + _Static_assert(sizeof(uint32_t) == 4, "I can't imagine world where this is false"); + char buf[sizeof(uint32_t)]; + memcpy(buf, &value, sizeof(value)); + // swap(buf[0], buf[3]) + uint32_t t = buf[0]; buf[0] = buf[3]; buf[3] = t; + // swap(buf[1], buf[2]) + t = buf[1]; buf[1] = buf[2]; buf[2] = t; + memcpy(&value, buf, sizeof(value)); + return value; +} + +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + if (GPIO_Pin == IT1_Pin) { + uint8_t val = 0b10000000; + //HAL_UART_Transmit(&huart2, (uint8_t *) &val, sizeof(val), HAL_MAX_DELAY); + + if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9)){ + // falling + printf("D%04lu\n", 0); + } else{ + // rising + printf("D%04lu\n", 4095); + } + } + + if (GPIO_Pin == IT2_Pin) { + uint8_t val = 0b10000001; + //HAL_UART_Transmit(&huart2, (uint8_t *) &val, sizeof(val), HAL_MAX_DELAY); + if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)){ + // falling + printf("C%04lu\n", 0); + } else{ + // rising + printf("C%04lu\n", 4095); + } + } + + if (GPIO_Pin == IT3_Pin) { + uint8_t val = 0b10000010; + //HAL_UART_Transmit(&huart2, (uint8_t *) &val, sizeof(val), HAL_MAX_DELAY); + if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7)){ + // falling + printf("E%04lu\n", 0); + } else{ + // rising + printf("E%04lu\n", 4095); + } + } +} + +int __io_putchar(int ch) +{ + if (ch == '\n') { + __io_putchar('\r'); + } + HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, HAL_MAX_DELAY); + return 1; +} + + /* USER CODE END 0 */ /** @@ -98,12 +185,132 @@ int main(void) MX_DAC1_Init(); /* USER CODE BEGIN 2 */ + + // start both DAC channels + HAL_DAC_Start(&hdac1, DAC1_CHANNEL_1); + HAL_DAC_Start(&hdac1, DAC1_CHANNEL_2); + + // configure built-in ADC + HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED); + + HAL_UART_Receive_IT(&huart2, &rx, 1); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { + /*int transmit_flag = 0; + char adc_chars[sizeof(uint32_t)] = {}; + + for(int i = 0; i < 2; i++){ + HAL_ADC_Start(&hadc1); + HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); + adc_vals[i] = HAL_ADC_GetValue(&hadc1); + if((adc_vals[i] > adc_vals_old[i] && adc_vals[i] - adc_vals_old[i] > 100) || + (adc_vals[i] < adc_vals_old[i] && adc_vals_old[i] - adc_vals[i] > 100)){ + printf("NR %d do zmiany\n", i); + uint32_t temp = adc_vals[i]; + adc_vals_old[i] = temp; + + adc_vals[i] = endian_swap(temp); + memcpy(adc_chars + (sizeof(uint32_t)*i), &adc_vals[i], sizeof(uint32_t)); + transmit_flag = 1; + } + + } + + if(transmit_flag == 1){ + //HAL_UART_Transmit(&huart2, (uint8_t *) &adc_chars[0], 2 * sizeof(uint32_t), HAL_MAX_DELAY); + }*/ + + + int note_update_flag = 0; + if (head != tail){ + if((rx_buf[tail] & 0b11110000) == 0b10010000){ + // note on + int bytes_available = (head - tail + 128) % 128; + if (bytes_available >= 3){ + // if all 3 bytes available + // printf("G%04d\n", rx_buf[tail+1]); + notes[rx_buf[tail+1]] = note_priority++; + note_update_flag = 1; + tail = (tail+3)%128; + } + + + }else if((rx_buf[tail] & 0b11110000) == 0b10000000){ + // note off + int bytes_available = (head - tail + 128) % 128; + if (bytes_available >= 3){ + // if all 3 bytes available + // printf("G%04d\n", rx_buf[tail+1]); + notes[rx_buf[tail+1]] = 0; + note_update_flag = 1; + tail = (tail+3)%128; + } + }else{ + // anything else + // for now drop the data + tail = (tail+1)%128; + } + + if(note_update_flag){ + int newest_note = -1; + uint8_t max_priority = 0; + for(int i = 0; i < 128; i++){ + if(notes[i] > max_priority){ + max_priority = notes[i]; + newest_note = i; + } + } + if(newest_note >= 0){ + DAC1->DHR12R1 = max(min(tones[newest_note], 4095), 0); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); + }else{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); + } + } + + + /////////////////////// A ////////////////////// + /*uint8_t data[3]; + data[0] = 0b10010000; + data[1] = rx_buf[tail]; + data[2] = 0b01111111; + HAL_UART_Transmit(&huart3, &data[0], 3, HAL_MAX_DELAY); + + HAL_Delay(500); + data[0] = 0b10000000; + HAL_UART_Transmit(&huart3, &data[0], 3, HAL_MAX_DELAY); + + tail = (tail+1)%128;*/ + } + + + char adc_chars[sizeof(uint32_t)] = {}; + + for(int i = 0; i < 2; i++){ + HAL_ADC_Start(&hadc1); + HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); + adc_vals[i] = 4095 - HAL_ADC_GetValue(&hadc1); + } + + printf("A%04lu\n", adc_vals[0]); + printf("B%04lu\n", adc_vals[1]); + +/* + for(int i = 0; i < 2; i++){ + uint32_t temp = adc_vals[i]; + adc_vals[i] = endian_swap(temp) << 3; + + memcpy(adc_chars + (sizeof(uint32_t)*i), &adc_vals[i], sizeof(uint32_t)); + } + + HAL_UART_Transmit(&huart2, (uint8_t *) &adc_chars[0], 2 * sizeof(uint32_t), HAL_MAX_DELAY); +*/ + HAL_Delay(100); + /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ diff --git a/hardware/code/Core/Src/stm32l4xx_it.c b/hardware/code/Core/Src/stm32l4xx_it.c index 2a39534..ad2ff79 100644 --- a/hardware/code/Core/Src/stm32l4xx_it.c +++ b/hardware/code/Core/Src/stm32l4xx_it.c @@ -6,7 +6,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2023 STMicroelectronics. + *

© Copyright (c) 2022 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -43,6 +43,11 @@ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ +extern uint8_t rx; +extern uint8_t rx_buf[128]; +extern uint8_t head; +extern uint8_t tail; + /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -226,6 +231,12 @@ void USART2_IRQHandler(void) HAL_UART_IRQHandler(&huart2); /* USER CODE BEGIN USART2_IRQn 1 */ + if ((head+1)%128 != tail){ + rx_buf[head] = rx; + head = (head+1)%128; + } + HAL_UART_Receive_IT(&huart2, &rx, 1); + /* USER CODE END USART2_IRQn 1 */ }