0,0 → 1,153 |
|
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/interrupt.h> |
#include "servoboard.h" |
#include "uart.h" |
|
uint8_t rx_buffer[RX_BUFFER_SZ]; |
//uint8_t tx_buffer[TX_BUFFER_SZ]; |
uint8_t rx_pos, tx_pos; |
|
void uart_init() { |
|
rx_pos = 0; |
tx_pos = 0; |
|
UCR=(1 << TXEN) | (1 << RXEN); |
USR |= (1<<U2X); |
UCSRB |= (1<<RXCIE); |
// UCSRB |= (1<<TXCIE); |
|
UBRR = (F_CPU / (BAUD_RATE * 8L) - 1); |
|
fdevopen(uart_putchar, NULL); |
|
printf("servoboard %s\n> ", VERSION); |
|
|
} |
|
ISR(USART_RXC_vect) { |
|
if (rx_pos < RX_BUFFER_SZ) { |
|
uint8_t i = UDR; |
|
uart_putchar(i); |
|
if (i == '\r') { |
|
uart_putchar('\n'); |
|
rx_buffer[rx_pos] = 0; |
rx_pos = 0; |
|
if (!strcasecmp(rx_buffer, "HELP")) { |
printf("DISPLAY Display servo settings\n" |
"EXPORT Export srvo settings\n" |
"SET s=n,l,u Set servo settings\n" |
" s = servo number (1-6)\n" |
" n = neutral position (0-255)\n" |
" l = lower limit (0-255)\n" |
" u = upper limit (0-255)\n" |
"LOAD Load settings from eeprom\n" |
"SAVE Write settings to eeprom\n"); |
} else if (!strcasecmp(rx_buffer, "DISPLAY")) { |
for(i = 0; i < 6; i++) { |
printf("SERVO %d, NEUTRAL %d, LIMIT %d-%d\n", |
(i + 1), |
(pwm_neutral_position[i]), |
(pwm_limit[i] & 0xff), |
(pwm_limit[i] >> 8) |
); |
} |
} else if (!strcasecmp(rx_buffer, "EXPORT")) { |
for(i = 0; i < 6; i++) { |
printf("SET %d=%d,%d,%d\n", |
(i + 1), |
(pwm_neutral_position[i]), |
(pwm_limit[i] & 0xff), |
(pwm_limit[i] >> 8) |
); |
} |
} else if (!strcasecmp(rx_buffer, "LOAD")) { |
eeprom_init(); |
} else if (!strcasecmp(rx_buffer, "SAVE")) { |
eeprom_write(); |
// } else if (!strncasecmp(rx_buffer, "INC ", 4)) { |
// } else if (!strncasecmp(rx_buffer, "DEC ", 4)) { |
} else if (!strncasecmp(rx_buffer, "SET ", 4)) { |
char *s, *t; |
uint8_t servo; |
s = strtok_r(rx_buffer, " ", &t); |
if (s) { |
s = strtok_r(NULL, "=", &t); |
if (s) { |
servo = atoi(s); |
if (servo >= 1 && servo <= 6) { |
servo--; |
s = strtok_r(NULL, ",", &t); |
if (s) { |
uint8_t h = 0, l = 0; |
pwm_neutral_position[servo] = atoi(s); |
s = strtok_r(NULL, ",", &t); |
if (s) { |
l = atoi(s); |
s = strtok_r(NULL, ",", &t); |
if (s) { |
h = atoi(s); |
} else { |
h = 0xff; |
} |
} |
pwm_limit[servo] = (h << 8) | l; |
i = servo; |
printf("SERVO %d, NEUTRAL %d, LIMIT %d-%d\n", |
(i + 1), |
(pwm_neutral_position[i]), |
(pwm_limit[i] & 0xff), |
(pwm_limit[i] >> 8) |
); |
} |
} else { |
printf("Invalid servo\n"); |
} |
} |
} |
} else { |
printf("Invalid command, type HELP\n"); |
} |
|
uart_putchar('>'); |
uart_putchar(' '); |
|
} else { |
|
rx_buffer[rx_pos++] = i; |
|
} |
|
} else { |
|
printf("Receive buffer full.\n"); |
|
} |
|
}; |
|
/* |
ISR(USART_TXC_vect) { |
}*/ |
|
int uart_putchar (char c) { |
if (c == '\n') { |
uart_putchar('\r'); |
} |
loop_until_bit_is_set(USR, UDRE); |
UDR = c; |
return 0; |
} |
|