Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Nucleo_CaitSith_Firmware by
main.cpp
- Committer:
- YosukeK
- Date:
- 2014-09-11
- Revision:
- 0:a9b204e27472
- Child:
- 1:5f6dd444850a
File content as of revision 0:a9b204e27472:
#include <mbed.h>
#include <PwmServo.h>
#include <RobotArm.h>
#include <def_resources.h>
#include <Serial.h>
/*
Controller firmware for CaitSithDanger
Kyoto-Densou-An 2014
Author : yishii
*/
#define DEBUG
#define BUFFER_SIZE 11
#define COMMAND_TOTAL 3
Serial pc(SERIAL_TX, SERIAL_RX);
DigitalOut myled(LED1);
char receive[BUFFER_SIZE];
//char* p_receive;
int recvPnt = 0;
int head0;
int head1;
void pc_rx ();
int serial_gets (char *buffer, int size);
int main() {
myled = 1;
head0 = 90;
head0 = head0 - 10;
head1 = 90;
head1 = head1 - 20;
arm1.actuate(head0, head1);
while(1) {
char buffer[BUFFER_SIZE];
int size = serial_gets(buffer, BUFFER_SIZE);
if (size > 0) {
pc.printf("%s", buffer);
if (strncmp(buffer, "CT", 2) == 0) {
myled = !myled;
if (size == 2) {
pc.printf("\r\nOK\r\n");
} else if (size >= 3) {
switch (buffer[2]) {
case 'O':
break;
case 'H':
int servoAngle = -1;
servoAngle = atoi((buffer+4));
//printf("%c\n", buffer[3]);
//printf("%d\n", servoAngle);
servoAngle += 90;
servoAngle = 180 - servoAngle;
if (servoAngle < 20) {
servoAngle = 20;
}
if (servoAngle > 160) {
servoAngle = 160;
}
if (buffer[3] == '1') {
head0 = servoAngle;
head0 = head0 - 10;
//printf("%d\n", head0);
} else if (buffer[3] == '2') {
head1 = servoAngle;
head1 = head1 - 20;
//printf("%d\n", head1);
} else {
}
arm1.actuate(head0, head1);
break;
}
pc.printf("\r\nOK\r\n");
}
}
}
}
}
int serial_gets (char *buffer, int size) {
/*if (!pc.readable()) {
return 0;
}*/
int i = 0;
while (i < size - 1) {
if (pc.readable()) {
buffer[i] = pc.getc();
//pc.printf("%c", buffer[i]);
if (buffer[i] == '\r') {
--i;
}
if (buffer[i] == '\n') {
break;
}
++i;
}/* else {
wait_ms(1);
}*/
}
buffer[i] = '\0';
//pc.printf("%s", buffer);
return i;
}
//int main()
//{
// head0 = 90;
// head0 = head0 - 10;
// head1 = 90;
// head1 = head1 - 20;
//myled = 0;
//clear buffer
// memset(receive, 0, BUFFER_SIZE);
//receive[BUFFER_SIZE-1] = '\0';
//p_receive = receive;
//TODO:Create arm instance.
// arm1.actuate(head0, head1);
//pc.attach(pc_rx, Serial::RxIrq);
// while(1) {
// }
// int i;
//
// while(1) {
// for(i=0; i<180; i++) {
// arm1.actuate(i,i);
// wait(0.005);
// }
// for(i=180; i>0; i--) {
// arm1.actuate(i,i);
// wait(0.005);
// }
// }
//}
void pc_rx () {
int result = -1;
char c = pc.getc();
//pc.printf("%02X", (unsigned char)c);
pc.printf("%c", (unsigned char)c);
if (c == '\r') {
//Nothign to do.
} else if (c == '\n') {
receive[recvPnt] = '\0';
++recvPnt;
} else {
receive[recvPnt] = c;
++recvPnt;
}
if (c == '\n') {
if (receive[0] == 'C' && receive[1] == 'T') {
myled = 1 - myled;
if (recvPnt == 3) {
pc.printf("\r\nOK\r\n");
} else if (recvPnt >= 4) {
switch (receive[2]) {
case 'O':
break;
case 'H':
//myled = 1;
int servoAngle = -1;
servoAngle = atoi((receive+4));
servoAngle += 90;
servoAngle = 180 - servoAngle;
if (servoAngle < 20) {
servoAngle = 20;
}
if (servoAngle > 160) {
servoAngle = 160;
}
//printf("%d\n", servoAngle);
int servoNo = -1;
if (receive[3] == '1') {
servoNo = 0;
head0 = servoAngle;
head0 = head0 - 10;
} else if (receive[3] == '2') {
servoNo = 1;
head1 = servoAngle;
head1 = head1 - 20;
} else {
servoNo = -1;
}
//printf("%d\n", servoNo);
//arm1.actuate(servoNo, servoAngle);
arm1.actuate(head0, head1);
result = 0;
pc.printf("\r\nOK\r\n");
break;
case 'L':
pc.printf("\r\nOK\r\n");
break;
case 'R':
pc.printf("\r\nOK\r\n");
break;
case 'N':
if (receive[3] == '1') {
myled = 1;
} else {
myled = 0;
}
pc.printf("\r\nOK\r\n");
break;
case 'M':
pc.printf("\r\nOK\r\n");
break;
case 'Z':
pc.printf("\r\nOK\r\n");
break;
default:
result = 1;
pc.printf("\r\nERROR\r\n");
break;
}
} else {
result = 1;
pc.printf("\r\nERROR\r\n");
}
}
//TODO:Send result the following code: CT[number]\r\n
memset(receive, 0, BUFFER_SIZE);
recvPnt = 0;
}
if (recvPnt >= BUFFER_SIZE) {
//myled = 0;
//pc.printf("NG1:Reset receive buffer.\n");
memset(receive, 0, BUFFER_SIZE);
recvPnt = 0;
}
}
