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:
- 2015-01-24
- Revision:
- 4:039a7d1ce3e9
- Parent:
- 3:9ac9fdf1856e
- Child:
- 5:4c87a8401f7c
File content as of revision 4:039a7d1ce3e9:
#include <mbed.h>
#include <PwmServo.h>
#include <ExtendedServo.h>
#include <DelayServo.h>
//#include <RobotArm.h>
#include <def_resources.h>
#include <Serial.h>
#include "Roomba.h"
#include "EventArg.h"
/*
Controller firmware for CaitSithDanger
Kyoto-Densou-An 2014
Author : yishii
*/
#define DEBUG
#define BUFFER_SIZE 11
//#define COMMAND_TOTAL 3
char receive[BUFFER_SIZE];
//char* p_receive;
//int recvPnt = 0;
int oyatsuCnt = 0;
EventArg e;
int serial_gets(char *buffer, int size);
void initialize();
//void moveServo()
//{
// shakeHead.moveServo();
// nodHead.moveServo();
// leftArm.moveServo();
// leftShoulder.moveServo();
// rightArm.moveServo();
// rightShoulder.moveServo();
//}
Ticker mTick;
Roomba nyandaBase(SERIAL_TX, SERIAL_RX, PA_14);
int main() {
pc.baud(115200);
initialize();
debugled = 1;
//mTick.attach_us(&moveServo, 10000);
Roomba* cp = new Roomba(SERIAL_TX, SERIAL_RX, LED1);//Class pointor
void (Roomba::*fp)(void) = &Roomba::serialReceiveCallback;
//<戻り値の型> (<クラス名>::*<変数名>(<引数リスト>);
//fp = cp->serialReceiveCallback();
//ticker.attach(&cp, cp->serialReceiveCallback, 0.1);
//(cp->*fp)();//クラスポインタとメンバポインタ両方を使うメソッド呼び出し?なにに使うの?
//ticker.attach(&cp, (cp->*fp)(), 0.1);
//Roomba* cp = new Roomba(SERIAL_TX, SERIAL_RX, LED1);//Class pointor
//void (Roomba::*fp)(void) = &Roomba::serialReceiveCallback;
//<戻り値の型> (<クラス名>::*<変数名>(<引数リスト>);
//fp = cp->serialReceiveCallback();
//ticker.attach(&cp, cp->serialReceiveCallback, 0.1);
//(cp->*fp)();//クラスポインタとメンバポインタ両方を使うメソッド呼び出し?なにに使うの?
//ticker.attach(&cp, (cp->*fp)(), 0.1);
//mTick.attach(Roomba, &nyandaBase.periodicCallback, 0.1);
while(1) {
char buffer[BUFFER_SIZE];
// コマンド受信
int size = serial_gets(buffer, BUFFER_SIZE);
if (size > 0) {
#ifdef DEBUG
pc.printf("%s", buffer);
#endif
// コマンド判定
if (strncmp(buffer, "CT", 2) == 0) {
myled = !myled;
bool ret = false;
if (size == 2) {
ret = true;
} else if (size >= 3) {
switch (buffer[2]) {
case 'Z':
initialize();
ret = true;
break;
case 'N':
ret = true;
if (buffer[3] == '0') {
nyandaLight = 0;
} else if (buffer[3] == '1') {
nyandaLight = 1;
} else {
ret = false;
}
break;
case 'M':
ret = true;
//CTM+500-500
char buff[4+1];
int temp;
//printf("Param:%s\n", before);
strncpy(buff, buffer + 3, 4);
buff[4] = '\0';
//printf("ASC:%s\n", buff);
temp = atoi(buff);
e.leftWheetVelocity = temp;
//printf("Param:%s\n", before);
strncpy(buff, (char*)buffer[3+4], 4);
buff[4] = '\0';
//printf("ASC:%s\n", buff);
temp = atoi(buff);
e.rightWheelVelocity = temp;
break;
case 'O':
ret = true;
if (buffer[3] == '0') {
oyatsuCnt = 0;
oyatsuFeeder.setAngle(0);
} else if (buffer[3] == '1') {
if (oyatsuCnt <= 3) {
oyatsuCnt++;
}
switch (oyatsuCnt) {
//case 0:
// oyatusFeeder.setAngle(0);
//break;
case 1:
oyatsuFeeder.setAngle(60);
break;
case 2:
oyatsuFeeder.setAngle(90);
break;
case 3:
oyatsuFeeder.setAngle(120);
break;
default:
break;
}
} else {
ret = false;
}
break;
case 'H':
int servoAngle = -1;
servoAngle = atoi((buffer+4));
ret = true;
if (buffer[3] == '1') {
shakeHead.setAngle(servoAngle);
} else if (buffer[3] == '2') {
nodHead.setAngle(servoAngle);
} else {
ret = false;
}
break;
case 'L':
servoAngle = atoi((buffer+4));
ret = true;
if (buffer[3] == '1') {
leftShoulder.setAngle(servoAngle);
} else if (buffer[3] == '2') {
leftArm.setAngle(servoAngle);
} else {
ret = false;
}
break;
case 'R':
servoAngle = atoi((buffer+4));
ret = true;
if (buffer[3] == '1') {
rightShoulder.setAngle(servoAngle);
} else if (buffer[3] == '2') {
rightArm.setAngle(servoAngle);
} else {
ret = false;
}
break;
default:
ret = false;
break;
}
}
if (ret) {
pc.printf("\r\nOK\r\n");
} else {
pc.printf("\r\nNG\r\n");
}
}
}
//シリアル受信待ちをwihelで待っているので、定期送信は不可能
// nyandaBase.periodicCallback(e);
// debugled != debugled;
// //そもそもTickerで書ける?引数付きのメソッドをattachできるのか
// //attach第2引数のインスタンスメソッドのポインタは引数付きとか書けるのか
// wait_ms(100);
}
}
void initialize() {
nyandaLight = 0;
shakeHead.setAngle(0);
nodHead.setAngle(0);
leftArm.setAngle(0);
leftShoulder.setAngle(0);
rightArm.setAngle(0);
rightShoulder.setAngle(0);
}
/*
*
*/
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 getMoveCommand(char opcode, char* before, char* converted)
//{
// char buff[10];
// int temp;
// int cont = 0;
//
// converted[cont] = opcode;
// ++cont;
// cont = cont + convertHexToAscString(before, 4, converted + cont);
// cont = cont + convertHexToAscString(before + 4, 4, converted + cont);
// converted[cont] = '\0';
//
//#ifdef DEBUG
// int i = 0;
// for (i = 0; i < cont; i++) {
// printf("%x\n", *(converted + i));
// }
//#endif
//
// return strlen(converted);
//}*/
//
////TBD:Create Utility Class. And move under method add static
//int convertDecToAsc(char* target, int length, int* converted) {
// char buff[length + 1];
// int temp;
//
// //strncpy(buff, before, length);
// buff[length] = '\0';
// //printf("ASC:%s\n", buff);
//
// temp = atoi(buff);
// //printf("DEC:%d\n", temp);
//
// //converted = temp;
//
// return 0;//strlen(converted);
//}
//
///*
// *
// */
//int convertHexToAscString(char* before, int length, char* converted)
//{
// char buff[length + 1];
// int temp;
//
// printf("Param:%s\n", before);
//
// strncpy(buff, before, length);
// buff[length] = '\0';
// printf("ASC:%s\n", buff);
//
// temp = atoi(buff);
// printf("DEC:%d\n", temp);
//
// converted[0] = ((temp & 0xFF00) >> 8);
// converted[1] = (temp & 0xFF);
// converted[2] = '\0';
// printf("HEX(MSB):%x\n", converted[0]);
// printf("HEX(LSB):%x\n", converted[1]);
//
// return strlen(converted);
//}
//
