commit 7ec406c5af692b9c99ae9ed0c7fb5ba648a0a71e Author: Morgan 'ARR\!' Allen Date: Thu Oct 14 22:13:37 2021 -0700 a barely functional driver. hooray! diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d57deab --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register(SRCS + "main/dfplayermini.c" + + INCLUDE_DIRS "include" +) diff --git a/include/dfplayermini.h b/include/dfplayermini.h new file mode 100644 index 0000000..d91210f --- /dev/null +++ b/include/dfplayermini.h @@ -0,0 +1,8 @@ +#ifndef __DFPLAYERMINI_H_ +#define __DFPLAYERMINI_H_ + +#include + +uint8_t dfplayermini_init(); + +#endif diff --git a/main/dfplayermini.c b/main/dfplayermini.c new file mode 100644 index 0000000..7a28ed8 --- /dev/null +++ b/main/dfplayermini.c @@ -0,0 +1,130 @@ +#include "stdint.h" +#include "driver/uart.h" +#include "dfplayermini.h" + +#define BUF_SIZE (1024) +#define PACKET_LEN (8) +#define BYTE_START (0x7E) +#define BYTE_END (0xEF) + + +struct DFPlayerMini { + uart_config_t *uart_config; +} dfplayermini; + +/* + * 0x7E START + * 0xFF VER + * 0x06 LEN + * 0x00 ACK + * 0x01 CMD + * 0x00 PARAM-hi + * 0x00 PARAM-lo + * 0x00 CHECK-hi + * 0x00 CHECK-lo + * 0xEF FIN + */ +uint8_t packet[] = { 0x7E, 0xFF, 0x06, 0x00, 0x01, 0x00, 0x00, 0xEF }; + +uint8_t send_packet(uint8_t cmd, uint8_t arg_low, uint8_t arg_high) { + uint8_t i = 0; + uint16_t sum = 0; + + packet[3] = cmd; + packet[4] = 1; + packet[5] = arg_high; + packet[6] = arg_low; + + for(i = 1; i < 7; i++) { + sum += packet[i]; + } + + //packet[7] = -sum << 8; + //packet[8] = -sum; + + return uart_write_bytes(UART_NUM_1, (const char*)&packet, PACKET_LEN); +} + +uint8_t set_volume(uint8_t vol) { + return send_packet(0x06, vol, 0); +} + +void dfplayermini_uart_read_task(void *arg) { + setvbuf(stdout, NULL, _IONBF, 0); + + uint8_t buf[PACKET_LEN]; + uint8_t err; + uint8_t idx = 0; + uint8_t inited = 0; + uint8_t timeout = 1; + + while(true) { + int len = uart_read_bytes(UART_NUM_1, &buf[idx], 1, 20 / portTICK_RATE_MS); + + if(len == 0) { + if(inited == 0 && timeout++ == 0) { + printf("timeout, sending reset\n"); + send_packet(0x0C, 0, 0); + } + + continue; + } + + if(buf[0] == BYTE_START) { + printf("0x%02X ", buf[idx]); + + idx++; + //printf("got start byte\n"); + } + + if(buf[idx - 1] == BYTE_END) { + printf("\n"); + + switch(buf[3]) { + case 0x3F: + printf("player ready\n"); + inited = 1; + + //send_packet(0x0C, 0, 0); + //vTaskDelay(10 / portTICK_RATE_MS); + + //if(!(err = send_packet(0x09, 1, 0))) { + //printf("Failed to set play source: %d\n", err); + //} + + if(!(err = set_volume(10))) { + printf("Failed to set volume: %d\n", err); + } + + vTaskDelay(100 / portTICK_RATE_MS); + + send_packet(0x03, 0, 0); + + break; + } + + idx = 0; + } + } +} + +uint8_t dfplayermini_init() { + uart_config_t uart_config = { + .baud_rate = 9600, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + .source_clk = UART_SCLK_APB, + }; + + dfplayermini.uart_config = &uart_config; + + uart_driver_install(UART_NUM_1, BUF_SIZE * 2, 0, 0, NULL, 0); + uart_param_config(UART_NUM_1, dfplayermini.uart_config); + uart_set_pin(UART_NUM_1, 13, 34, -1, -1); + + xTaskCreate(dfplayermini_uart_read_task, "dfplayermini_uart_read_task", 2048, NULL, 10, NULL); + + return 0; +}