Serial library for Ususama
Dependents: ususama_serial_demo WRS2021_mecanum_driver
ususama_controller.hpp
- Committer:
- sgrsn
- Date:
- 2021-08-25
- Revision:
- 4:fd646595de66
- Parent:
- 3:3625406774ec
File content as of revision 4:fd646595de66:
#ifndef USUSAMA_CONTROLLER_H #define USUSAMA_CONTROLLER_H #include "ususama_protocol.hpp" #include "ususama_serial.h" class UsusamaController { public: struct UsusamaProtocol::MoveCommand_t move_command; struct UsusamaProtocol::StopCommand_t stop_command; struct UsusamaProtocol::MoveReply_t move_reply; UsusamaController(UsusamaSerial *pc) { pc_ = pc; move_command.enable = false; stop_command.stop = false; } void update(float x, float y, float theta) { // stopコマンドをチェック if(stop_command.stop) { move_command.enable = false; } switch(last_command_) { case UsusamaProtocol::COMMAND_POSE_X: case UsusamaProtocol::COMMAND_POSE_Y: case UsusamaProtocol::COMMAND_POSE_THETA: cmd_pose_changed_ = true; break; case UsusamaProtocol::COMMAND_MOVE: //cmd_pose_changed_ = false; break; } move_reply.x = x; move_reply.y = y; move_reply.theta = theta; } void write_robot_state() { // 送られてきたコマンドによって何を送るか決める switch(last_command_) { case UsusamaProtocol::COMMAND_MOVE: reply_current_pose(); break; case UsusamaProtocol::COMMAND_POSE_X: case UsusamaProtocol::COMMAND_POSE_Y: case UsusamaProtocol::COMMAND_POSE_THETA: reply_commad_pose(); break; case UsusamaProtocol::COMMAND_STOP: reply_current_pose(); break; } //pc_ -> writeData(last_command_, UsusamaProtocol::DEBUG_CONSOLE); } void reply_commad_pose() { // 受け取った値をそのまま返す switch(n_reply_commad_pose) { case 0: pc_ -> writeData(pc_->_register[UsusamaProtocol::COMMAND_POSE_X], UsusamaProtocol::REPLY_COMMAND_X); break; case 1: pc_ -> writeData(pc_->_register[UsusamaProtocol::COMMAND_POSE_Y], UsusamaProtocol::REPLY_COMMAND_Y); break; case 2: pc_ -> writeData(pc_->_register[UsusamaProtocol::COMMAND_POSE_THETA], UsusamaProtocol::REPLY_COMMAND_THETA); break; } n_reply_commad_pose++; if (n_reply_commad_pose == 3) n_reply_commad_pose = 0; } void reply_current_pose() { switch(n_reply_current_pose) { case 0: pc_ -> writeData(UsusamaProtocol::encode_float2int(move_reply.reached), UsusamaProtocol::REPLY_MOVE); break; case 1: pc_ -> writeData(UsusamaProtocol::encode_float2int(move_reply.x), UsusamaProtocol::REPLY_STATE_X); break; case 2: pc_ -> writeData(UsusamaProtocol::encode_float2int(move_reply.y), UsusamaProtocol::REPLY_STATE_Y); break; case 3: pc_ -> writeData(UsusamaProtocol::encode_float2int(move_reply.theta), UsusamaProtocol::REPLY_STATE_THETA); break; } n_reply_current_pose++; if (n_reply_current_pose == 4) n_reply_current_pose = 0; } bool is_enable_to_move() { return move_command.enable; } bool disable_to_move() { move_command.enable = false; return move_command.enable; } bool is_ref_pose_changed() { return cmd_pose_changed_; } void notify_use_ref_pose() { cmd_pose_changed_ = false; } bool is_stop_called() { return stop_command.stop; } UsusamaProtocol::MoveCommand_t getMoveCommand() { return move_command; } void setReachedGoal(bool reached) { move_reply.reached = reached; } void receive_pc_process() { uint8_t reg = pc_ -> readData(); if(reg == 0) return; switch(reg) { case UsusamaProtocol::COMMAND_MOVE: move_command.enable = pc_->_register[UsusamaProtocol::COMMAND_MOVE]; break; case UsusamaProtocol::COMMAND_POSE_X: move_command.x = UsusamaProtocol::decode_int2float( pc_->_register[UsusamaProtocol::COMMAND_POSE_X] ); break; case UsusamaProtocol::COMMAND_POSE_Y: move_command.y = UsusamaProtocol::decode_int2float( pc_->_register[UsusamaProtocol::COMMAND_POSE_Y] ); break; case UsusamaProtocol::COMMAND_POSE_THETA: move_command.theta = UsusamaProtocol::decode_int2float( pc_->_register[UsusamaProtocol::COMMAND_POSE_THETA] ); break; case UsusamaProtocol::COMMAND_STOP: stop_command.stop = pc_->_register[UsusamaProtocol::COMMAND_STOP]; break; } last_command_ = reg; } private: UsusamaSerial *pc_; uint8_t last_command_ = 0; bool cmd_pose_changed_ = false; int n_reply_current_pose = 0; int n_reply_commad_pose = 0; }; #endif