00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "BoardController.h"
00014
00016 void BoardController::initPorts() {
00017
00018
00019 DDRA = 0x00;
00020
00021 PORTA |= (1<<PA0) | (1<<PA1) | (1<<PA2) | (1<<PA3) | (1<<PA4) | (1<<PA5) | (1<<PA6) | (1<<PA7);
00022
00023
00024
00025 DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3);
00026
00027
00028 powerOnLED(LED_POWER, true);
00029 powerOnLED(LED_WALK, true);
00030 powerOnLED(LED_LEARN, true);
00031 powerOnLED(LED_EXPLORATION, true);
00032
00033 msDelay(800);
00034
00035
00036 powerOnLED(LED_POWER, true);
00037 powerOnLED(LED_WALK, false);
00038 powerOnLED(LED_LEARN, false);
00039 powerOnLED(LED_EXPLORATION, false);
00040
00041
00042
00043
00044 DDRC |= (1<<EN_TXD_BIOLOID) | (1<<EN_RXD_BIOLOID) | (1<<EN_AIR_V24) | (1<<RTS);
00045
00046
00047 UCSRB &= ~((1<<TXEN) | (1<<RXEN));
00048
00049
00050 DDRC &= ~(1<<CTS);
00051
00052 PORTC |= (1<<RTS);
00053
00054
00055 DDRD |= (1<<PD1);
00056 DDRD &= ~(1<<PD0);
00057 }
00058
00060 unsigned char BoardController::getSwitchState (unsigned char _switch) {
00061
00062 bool status;
00063
00064 if (_switch == SWITCH_WALK) {
00065 status = (PINA & (1<<PA0));
00066
00067 } else if (_switch == SWITCH_RANDOM_STATE) {
00068 status = (PINA & (1<<PA1));
00069
00070 } else if (_switch == SWITCH_INV_FB_0) {
00071 status = (PINA & (1<<PA2));
00072
00073 } else if (_switch == SWITCH_ENABLE_EXPLORATION) {
00074 status = (PINA & (1<<PA3));
00075
00076 } else if (_switch == SWITCH_FULL_EXP_AT_START) {
00077 status = (PINA & (1<<PA4));
00078
00079 } else if (_switch == SWITCH_V24) {
00080 status = (PINA & (1<<PA5));
00081
00082 } else if (_switch == SWITCH_VDBE_EGREEDY) {
00083 status = (PINA & (1<<PA6));
00084
00085 } else if (_switch == SWITCH_GAMMA) {
00086 status = (PINA & (1<<PA7));
00087
00088 } else if (_switch == SWITCH_RAM) {
00089 status = SWITCH_RAM_VALUE;
00090
00091
00092 } else {
00093
00094 register char i;
00095
00096 for (i=0; i<100; i++) {
00097
00098 powerOnLED(LED_POWER, 1);
00099 powerOnLED(LED_WALK, 0);
00100 powerOnLED(LED_LEARN, 0);
00101 powerOnLED(LED_EXPLORATION, 1);
00102
00103 msDelay(250);
00104
00105 powerOnLED(LED_POWER, 0);
00106 powerOnLED(LED_WALK, 1);
00107 powerOnLED(LED_LEARN, 1);
00108 powerOnLED(LED_EXPLORATION, 0);
00109
00110 msDelay(250);
00111 }
00112
00113 return 0;
00114 }
00115
00116 return !status;
00117 }
00118
00120 void BoardController::enableV24Interrupt() {
00121
00122 disableV24Interrupt();
00123 if (getSwitchState(SWITCH_V24)) {
00124
00125
00126 }
00127
00128
00129 }
00130
00132 void BoardController::disableV24Interrupt() {
00133 if (getSwitchState(SWITCH_V24)) {
00134
00135
00136 }
00137
00138
00139
00140 }
00141
00142
00144 void BoardController::msDelay (int n) {
00145
00146
00147 double maxDelay = (262.14 / (double)((16000000UL / 1000000)));
00148
00149 for (int i=0; i< (n/maxDelay); i++) {
00150 _delay_ms (maxDelay);
00151 }
00152 }
00153
00154
00156 void BoardController::powerOnLED(unsigned char _ledID, bool _status) {
00157
00158 if (_status == true) {
00159 PORTB &= ~(1<<_ledID);
00160 } else {
00161 PORTB |= (1<<_ledID);
00162 }
00163 }
00164
00165
00166 void BoardController::blinkLED (unsigned char led_id, unsigned int count, unsigned int delay) {
00167
00168 unsigned char i;
00169
00170
00171
00172 for (i=0; i<count; i++) {
00173
00174 if (led_id & (1<<LED_WALK)) powerOnLED ( LED_WALK, true);
00175 if (led_id & (1<<LED_LEARN)) powerOnLED ( LED_LEARN, true);
00176 if (led_id & (1<<LED_EXPLORATION)) powerOnLED ( LED_EXPLORATION, true);
00177 if (led_id & (1<<LED_POWER)) powerOnLED ( LED_POWER, true);
00178
00179 msDelay (delay);
00180
00181 if (led_id & (1<<LED_LEARN)) powerOnLED ( LED_LEARN, false);
00182 if (led_id & (1<<LED_WALK)) powerOnLED ( LED_WALK, false);
00183 if (led_id & (1<<LED_EXPLORATION)) powerOnLED ( LED_EXPLORATION, false);
00184 if (led_id & (1<<LED_POWER)) powerOnLED ( LED_POWER, true);
00185
00186 msDelay (delay);
00187 }
00188 }
00189
00190
00192 void BoardController::enableSerialBioloidInterface() {
00193
00194
00195 PORTC |= (1<<RTS);
00196
00197
00198 PORTC &= ~((1<<EN_TXD_BIOLOID) | (1<<EN_RXD_BIOLOID) | (1<<EN_AIR_V24));
00199
00200
00201 unsigned char dummy;
00202 while (UCSRA & (1<<RXC)) dummy = UDR;
00203
00204
00205
00206
00207
00208
00209 UBRRH = (unsigned char) (BIOLOID_UBRR >> 8);
00210 UBRRL = (unsigned char) BIOLOID_UBRR;
00211
00212 UCSRA |= (1<<U2X);
00213 UCSRB |= ((1<<TXEN) | (1<<RXEN));
00214
00215
00216
00217 PORTC |= (1<<EN_TXD_BIOLOID);
00218 PORTC &= ~((1<<EN_RXD_BIOLOID) | (1<<EN_AIR_V24));
00219
00220 }
00221
00222 void BoardController::enableSerialV24Interface() {
00223
00224 BoardController::powerOnLED(LED_EXPLORATION, true);
00225
00226
00227 PORTC &= ~((1<<EN_TXD_BIOLOID) | (1<<EN_RXD_BIOLOID) | (1<<EN_AIR_V24));
00228
00229
00230 unsigned char dummy;
00231 while (UCSRA & (1<<RXC)) dummy = UDR;
00232
00233
00234
00235
00236
00237
00238 UBRRH = (unsigned char) (V24_UBRR >> 8);
00239 UBRRL = (unsigned char) V24_UBRR;
00240
00241 UCSRA |= (1<<U2X);
00242 UCSRB = ((1<<TXEN) | (1<<RXEN));
00243
00244
00245 PORTC |= (1<<EN_AIR_V24);
00246 PORTC &= ~((1<<EN_TXD_BIOLOID) | (1<<EN_RXD_BIOLOID));
00247
00248
00249 PORTC &= ~(1<<RTS);
00250
00251 BoardController::msDelay(50);
00252 BoardController::powerOnLED(LED_EXPLORATION, false);
00253 }
00254
00255 void BoardController::disableSerialInterfaces() {
00256
00257
00258
00259
00260 PORTC &= ~((1<<EN_TXD_BIOLOID) | (1<<EN_RXD_BIOLOID) | (1<<EN_AIR_V24));
00261 UCSRB &= ~((1<<TXEN) | (1<<RXEN));
00262
00263 if (getSwitchState(SWITCH_V24)) {
00264 enableSerialV24Interface();
00265 }
00266 }
00267
00268