Mercurial > ukubik
changeset 54:fb9cfdc1cf12
Arduino code cleanup
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sat, 23 Aug 2014 20:32:26 +0200 |
| parents | 477b5bb22e33 |
| children | 5ce82161111d |
| files | servo/servo.ino |
| diffstat | 1 files changed, 59 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/servo/servo.ino Sat Aug 23 20:17:19 2014 +0200 +++ b/servo/servo.ino Sat Aug 23 20:32:26 2014 +0200 @@ -29,14 +29,64 @@ int _serial_read_word() { + /* Read two bytes from the serial port and make an int from them. */ return Serial.read() | Serial.read() << 8; } +void do_servo_degrees() { + /* Move a single servo by degrees. */ + int servo = Serial.read(); + int pos = Serial.read(); + if (servo >= 0 && servo < MAX_SERVO && pos >= 0 && pos <= 180) { + servos[servo].write(pos); + } +} + +void do_servos_degrees() { + /* Move all servos by degrees. */ + for (int servo = 0; servo < MAX_SERVO; servo += 1) { + int pos = Serial.read(); + if (pos >= 0 && pos <= 180) { + servos[servo].write(pos); + } + } +} + +void do_servo_microseconds() { + /* Move a single servo by microseconds. */ + int servo = Serial.read(); + int pos = _serial_read_word(); + if (servo >= 0 && servo < MAX_SERVO && + pos >= SERVO_FREQ_MIN && pos <= SERVO_FREQ_MAX) { + servos[servo].writeMicroseconds(pos); + } +} + +void do_servos_microseconds() { + /* Move all servos by microseconds. */ + for (int servo = 0; servo < MAX_SERVO; servo += 1) { + int pos = _serial_read_word(); + if (pos >= SERVO_FREQ_MIN && pos <= SERVO_FREQ_MAX) { + servos[servo].writeMicroseconds(pos); + } + } +} + +void do_accel() { + /* Report the readings of the acceleration sensor. */ + Serial.write(0xff); + Serial.write(map(analogRead(A2), 0, 676, 0, 255)); + Serial.write(map(analogRead(A1), 0, 676, 0, 255)); + Serial.write(map(analogRead(A0), 0, 676, 0, 255)); +} + +void do_beep() { + /* Emit a beep of specified frequency and duration. */ + tone(A3, _serial_read_word(), Serial.read()); +} void do_serial_command() { - int servo; - int pos; - + /* Read and execute a command from the serial port's buffer. */ switch (serial_command) { case 0x00: /* No command, read one. */ @@ -50,62 +100,40 @@ if (Serial.available() < 2) { return; } - servo = Serial.read(); - pos = Serial.read(); - if (servo >= 0 && servo < MAX_SERVO && pos >= 0 && pos <= 180) { - servos[servo].write(pos); - } + do_servo_degrees(); break; case 0xfe: /* Move all servos by degrees. */ if (Serial.available() < MAX_SERVO) { return; } - for (servo = 0; servo < MAX_SERVO; servo += 1) { - pos = Serial.read(); - if (pos >= 0 && pos <= 180) { - servos[servo].write(pos); - } - } serial_command = 0; + do_servos_degrees(); break; case 0xfd: /* Move a single servo by microseconds. */ if (Serial.available() < 3) { return; } - servo = Serial.read(); - pos = _serial_read_word(); - if (servo >= 0 && servo < MAX_SERVO && - pos >= SERVO_FREQ_MIN && pos <= SERVO_FREQ_MAX) { - servos[servo].writeMicroseconds(pos); - } + do_servo_microseconds(); break; case 0xfc: /* Move all servos by microseconds. */ if (Serial.available() < MAX_SERVO * 2) { return; } - for (servo = 0; servo < MAX_SERVO; servo += 1) { - pos = _serial_read_word(); - if (pos >= SERVO_FREQ_MIN && pos <= SERVO_FREQ_MAX) { - servos[servo].writeMicroseconds(pos); - } - } + do_servos_microseconds(); break; case 0xf0: /* Read the accelerometer sensor. */ - Serial.write(0xff); - Serial.write(map(analogRead(A2), 0, 676, 0, 255)); - Serial.write(map(analogRead(A1), 0, 676, 0, 255)); - Serial.write(map(analogRead(A0), 0, 676, 0, 255)); + do_accel(); break; case 0xf1: /* Beep. */ if (Serial.available() < 3) { return; } - tone(A3, _serial_read_word(), Serial.read()); + do_beep(); break; } serial_command = 0;
