Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 1458 → Rev 1459

/branches/V0.76g-acid/servoboard/uart.c
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;
}