BV I2C: use shared string buffer and improve code

This commit is contained in:
King Kévin 2018-03-15 18:55:52 +01:00
parent 510d3c7193
commit bb014ce1e0
1 changed files with 19 additions and 19 deletions

View File

@ -53,15 +53,15 @@ static enum busvoodoo_uart_setting_t {
BUSVOODOO_UART_SETTING_DONE,
} busvoodoo_uart_setting = BUSVOODOO_UART_SETTING_NONE;
/** UART baud rate (in bps) */
uint32_t busvoodoo_uart_baudrate = 115200;
static uint32_t busvoodoo_uart_baudrate = 115200;
/** UART data bits */
uint8_t busvoodoo_uart_databits = 8;
static uint8_t busvoodoo_uart_databits = 8;
/** UART parity setting */
char busvoodoo_uart_parity= 'n';
static char busvoodoo_uart_parity= 'n';
/** UART stop bits (multiplied by 2) */
uint8_t busvoodoo_uart_stopbits = 2;
static uint8_t busvoodoo_uart_stopbits = 2;
/** pin drive mode */
char busvoodoo_uart_drive = 'p';
static char busvoodoo_uart_drive = 'p';
/** setup UART mode
* @param[out] prefix terminal prompt prefix
@ -71,14 +71,13 @@ char busvoodoo_uart_drive = 'p';
static bool busvoodoo_uart_setup(char** prefix, const char* line)
{
bool complete = false; // is the setup complete
static char config[39] = {0}; // configuration string used as prefix
if (NULL==line) { // first call
busvoodoo_uart_setting = BUSVOODOO_UART_SETTING_NONE; // re-start configuration
}
switch (busvoodoo_uart_setting) {
case BUSVOODOO_UART_SETTING_NONE:
snprintf(config, LENGTH(config), "baud rate in bps (1-2000000) [%u]", busvoodoo_uart_baudrate);
*prefix = config; // ask for baud rate
snprintf(busvoodoo_global_string, LENGTH(busvoodoo_global_string), "baud rate in bps (1-2000000) [%u]", busvoodoo_uart_baudrate);
*prefix = busvoodoo_global_string; // ask for baud rate
busvoodoo_uart_setting = BUSVOODOO_UART_SETTING_BAUDRATE;
break;
case BUSVOODOO_UART_SETTING_BAUDRATE:
@ -86,14 +85,14 @@ static bool busvoodoo_uart_setup(char** prefix, const char* line)
busvoodoo_uart_setting = BUSVOODOO_UART_SETTING_DATABITS; // go to next setting
} else { // setting provided
uint32_t baudrate = atoi(line); // parse setting
if (baudrate>0 && baudrate<2000000) { // check setting
if (baudrate>0 && baudrate<=2000000) { // check setting
busvoodoo_uart_baudrate = baudrate; // remember setting
busvoodoo_uart_setting = BUSVOODOO_UART_SETTING_DATABITS; // go to next setting
}
}
if (BUSVOODOO_UART_SETTING_DATABITS==busvoodoo_uart_setting) { // if next setting
snprintf(config, LENGTH(config), "data bits (8-9) [%u]", busvoodoo_uart_databits); // prepare next setting
*prefix = config; // display next setting
snprintf(busvoodoo_global_string, LENGTH(busvoodoo_global_string), "data bits (8-9) [%u]", busvoodoo_uart_databits); // prepare next setting
*prefix = busvoodoo_global_string; // display next setting
}
break;
case BUSVOODOO_UART_SETTING_DATABITS:
@ -107,8 +106,8 @@ static bool busvoodoo_uart_setup(char** prefix, const char* line)
}
}
if (BUSVOODOO_UART_SETTING_PARITY==busvoodoo_uart_setting) { // if next setting
snprintf(config, LENGTH(config), "parity (n,e,o) [%c]", busvoodoo_uart_parity); // prepare next setting
*prefix = config; // display next setting
snprintf(busvoodoo_global_string, LENGTH(busvoodoo_global_string), "parity (n,e,o) [%c]", busvoodoo_uart_parity); // prepare next setting
*prefix = busvoodoo_global_string; // display next setting
}
break;
case BUSVOODOO_UART_SETTING_PARITY:
@ -121,8 +120,8 @@ static bool busvoodoo_uart_setup(char** prefix, const char* line)
}
}
if (BUSVOODOO_UART_SETTING_STOPBITS==busvoodoo_uart_setting) { // if next setting
snprintf(config, LENGTH(config), "stop bits (0.5-2.0) [%.1f]", busvoodoo_uart_stopbits/2.0); // prepare next setting
*prefix = config; // display next setting
snprintf(busvoodoo_global_string, LENGTH(busvoodoo_global_string), "stop bits (0.5-2.0) [%.1f]", busvoodoo_uart_stopbits/2.0); // prepare next setting
*prefix = busvoodoo_global_string; // display next setting
}
break;
case BUSVOODOO_UART_SETTING_STOPBITS:
@ -146,8 +145,8 @@ static bool busvoodoo_uart_setup(char** prefix, const char* line)
if (BUSVOODOO_UART_SETTING_DRIVE==busvoodoo_uart_setting) { // if next setting
printf("p) push-pull (3.3V)\n");
printf("o) open-drain (set LV to the desired voltage), with embedded pull-up (2kO)\n");
snprintf(config, LENGTH(config), "drive mode (p,o) [%c]", busvoodoo_uart_drive); // show drive mode
*prefix = config; // display next setting
snprintf(busvoodoo_global_string, LENGTH(busvoodoo_global_string), "drive mode (p,o) [%c]", busvoodoo_uart_drive); // show drive mode
*prefix = busvoodoo_global_string; // display next setting
}
break;
case BUSVOODOO_UART_SETTING_DRIVE:
@ -160,6 +159,7 @@ static bool busvoodoo_uart_setup(char** prefix, const char* line)
}
}
if (BUSVOODOO_UART_SETTING_DONE==busvoodoo_uart_setting) { // we have all settings, configure UART
rcc_periph_clock_enable(RCC_AFIO); // enable clock for USART alternate function
rcc_periph_clock_enable(USART_RCC(BUSVOODOO_USART_ID)); // enable clock for USART peripheral
usart_set_baudrate(USART(BUSVOODOO_USART_ID), busvoodoo_uart_baudrate); // set baud rate
usart_set_databits(USART(BUSVOODOO_USART_ID), busvoodoo_uart_databits); // set data bits
@ -214,7 +214,7 @@ static bool busvoodoo_uart_setup(char** prefix, const char* line)
busvoodoo_uart_setting = BUSVOODOO_UART_SETTING_NONE; // restart settings next time
*prefix = "UART"; // display mode
busvoodoo_oled_text_left("UART"); // set mode title on OLED display
const char* pinout_io[10] = {"GND", "3V3", "5V", "LV", "Rx", "Tx", NULL, NULL}; // HiZ mode pinout
const char* pinout_io[10] = {"GND", "3V3", "5V", "LV", "Rx", "Tx", NULL, NULL, NULL, NULL}; // UART mode pinout
for (uint8_t i=0; i<LENGTH(pinout_io) && i<LENGTH(busvoodoo_global_pinout_io); i++) {
busvoodoo_global_pinout_io[i] = pinout_io[i]; // set pin names
}
@ -235,7 +235,7 @@ static bool busvoodoo_uart_setup(char** prefix, const char* line)
static void busvoodoo_uart_exit(void)
{
usart_disable(USART(BUSVOODOO_USART_ID)); // disable USART
rcc_periph_clock_enable(USART_RCC(BUSVOODOO_USART_ID)); // disable domain clock
rcc_periph_clock_disable(USART_RCC(BUSVOODOO_USART_ID)); // disable domain clock
gpio_set_mode(USART_PORT(BUSVOODOO_USART_ID), GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, USART_PIN_TX(BUSVOODOO_USART_ID)); // set pin back to floating input
gpio_set_mode(USART_PORT(BUSVOODOO_USART_ID), GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, USART_PIN_RX(BUSVOODOO_USART_ID)); // set pin back to floating input
busvoodoo_embedded_pullup(false); // disable embedded pull-ups