Subversion Repositories FlightCtrl

Rev

Rev 1460 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1459 acid 1
 
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <string.h>
5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include "servoboard.h"
8
#include "uart.h"
9
 
10
uint8_t rx_buffer[RX_BUFFER_SZ];
11
//uint8_t tx_buffer[TX_BUFFER_SZ];
12
uint8_t rx_pos, tx_pos;
1461 acid 13
uint8_t current_servo = 0;
1459 acid 14
 
15
void uart_init() {
16
 
17
        rx_pos = 0;
18
        tx_pos = 0;
19
 
20
        UCR=(1 << TXEN) | (1 << RXEN);
21
        USR   |= (1<<U2X);
22
        UCSRB |= (1<<RXCIE);
23
//      UCSRB |= (1<<TXCIE);
24
 
25
        UBRR = (F_CPU / (BAUD_RATE * 8L) - 1);
26
 
27
        fdevopen(uart_putchar, NULL);
28
 
29
        printf("servoboard %s\n> ", VERSION);
30
 
31
 
32
}
33
 
34
ISR(USART_RXC_vect) {
35
 
36
        if (rx_pos < RX_BUFFER_SZ) {
37
 
38
                uint8_t i = UDR;
1460 acid 39
 
1461 acid 40
                if (i == '+') {
41
                        if (pwm_neutral_position[current_servo - 1] < 255) {
42
                                pwm_neutral_position[current_servo - 1]++;
43
                        }
44
                        printf("SERVO %d VALUE %d\n", current_servo, pwm_neutral_position[current_servo - 1]);
45
                        return;
46
                } else if (i == '-') {
47
                        if (pwm_neutral_position[current_servo - 1] > 0) {
48
                                pwm_neutral_position[current_servo - 1]--;
49
                        }
50
                        printf("SERVO %d VALUE %d\n", current_servo, pwm_neutral_position[current_servo - 1]);
51
                        return;
52
                }
53
 
1459 acid 54
                uart_putchar(i);
55
 
56
                if (i == '\r') {
57
 
58
                        uart_putchar('\n');
59
 
60
                        rx_buffer[rx_pos] = 0;
61
                        rx_pos = 0;
62
 
63
                        if (!strcasecmp(rx_buffer, "HELP")) {
64
                                printf("DISPLAY                 Display servo settings\n"
65
                                       "EXPORT                  Export srvo settings\n"
1460 acid 66
                                           "SET s=n[,l,u]           Set servo settings\n"
1459 acid 67
                                           "                            s = servo number (1-6)\n"
68
                                           "                            n = neutral position (0-255)\n"
69
                                           "                            l = lower limit (0-255)\n"
70
                                           "                            u = upper limit (0-255)\n"
1461 acid 71
                                           "CUR n                   Set current servo. + = increase, - = decrease value\n"
1459 acid 72
                                           "LOAD                    Load settings from eeprom\n"
73
                                           "SAVE                    Write settings to eeprom\n");
74
                        } else if (!strcasecmp(rx_buffer, "DISPLAY")) {
75
                                for(i = 0; i < 6; i++) {
1460 acid 76
                                        printf("SERVO %d, NEUTRAL %d, LIMIT %d-%d\n",
77
                                                (i + 1),
1459 acid 78
                                                (pwm_neutral_position[i]),
1460 acid 79
                                                (pwm_limit[i] & 0xff),
1459 acid 80
                                                (pwm_limit[i] >> 8)
81
                                        );
82
                                }
83
                        } else if (!strcasecmp(rx_buffer, "EXPORT")) {
84
                                for(i = 0; i < 6; i++) {
1460 acid 85
                                        printf("SET %d=%d,%d,%d\n",
86
                                                (i + 1),
1459 acid 87
                                                (pwm_neutral_position[i]),
1460 acid 88
                                                (pwm_limit[i] & 0xff),
1459 acid 89
                                                (pwm_limit[i] >> 8)
90
                                        );
91
                                }
92
                        } else if (!strcasecmp(rx_buffer, "LOAD")) {
93
                                eeprom_init();
94
                        } else if (!strcasecmp(rx_buffer, "SAVE")) {
95
                                eeprom_write();
1461 acid 96
                        } else if (!strncasecmp(rx_buffer, "CUR ", 4)) {
97
                                char *s, *t;
98
                                s = strtok_r(rx_buffer, " ", &t);
99
                                if (s) {
100
                                        s = strtok_r(NULL, "", &t);
101
                                        if (s) {
102
                                                i = atoi(s) + 1;
103
                                                if (i >= 1 && i <= 6) {
104
                                                        current_servo = i;
105
                                                        printf("CURRENT SERVO %d\n", i);
106
                                                } else {
107
                                                        printf("Invalid servo\n");
108
                                                }
109
                                        }
110
                                }
1459 acid 111
                        } else if (!strncasecmp(rx_buffer, "SET ", 4)) {
112
                                char *s, *t;
113
                                uint8_t servo;
114
                                s = strtok_r(rx_buffer, " ", &t);
115
                                if (s) {
116
                                        s = strtok_r(NULL, "=", &t);
117
                                        if (s) {
118
                                                servo = atoi(s);
119
                                                if (servo >= 1 && servo <= 6) {
120
                                                        servo--;
121
                                                        s = strtok_r(NULL, ",", &t);
122
                                                        if (s) {
123
                                                                uint8_t h = 0, l = 0;
124
                                                                pwm_neutral_position[servo] = atoi(s);
125
                                                                s = strtok_r(NULL, ",", &t);
126
                                                                if (s) {
127
                                                                        l = atoi(s);
1461 acid 128
                                                                        s = strtok_r(NULL, "", &t);
1459 acid 129
                                                                        if (s) {
130
                                                                                h = atoi(s);
131
                                                                        } else {
132
                                                                                h = 0xff;
133
                                                                        }
134
                                                                }
135
                                                                pwm_limit[servo] = (h << 8) | l;
1461 acid 136
                                                                pwm_check_active();
1459 acid 137
                                                                i = servo;
1460 acid 138
                                                                printf("SERVO %d, NEUTRAL %d, LIMIT %d-%d\n",
139
                                                                        (i + 1),
1459 acid 140
                                                                        (pwm_neutral_position[i]),
1460 acid 141
                                                                        (pwm_limit[i] & 0xff),
1459 acid 142
                                                                        (pwm_limit[i] >> 8)
143
                                                                );
144
                                                        }
145
                                                } else {
146
                                                        printf("Invalid servo\n");
147
                                                }
148
                                        }
149
                                }
150
                        } else {
151
                                printf("Invalid command, type HELP\n");
152
                        }
153
 
154
                        uart_putchar('>');
155
                        uart_putchar(' ');
156
 
157
                } else {
158
 
159
                        rx_buffer[rx_pos++] = i;
160
 
161
                }
162
 
163
        } else {
164
 
165
                printf("Receive buffer full.\n");
166
 
167
        }
168
 
169
};
170
 
171
/*
172
ISR(USART_TXC_vect) {
173
}*/
174
 
175
int uart_putchar (char c) {
176
        if (c == '\n') {
177
                uart_putchar('\r');
178
        }
179
        loop_until_bit_is_set(USR, UDRE);
180
        UDR = c;
181
        return 0;
182
}
183