Serial library for Ususama

Dependents:   ususama_serial_demo WRS2021_mecanum_driver

ususama_controller.hpp

Committer:
sgrsn
Date:
2021-08-24
Revision:
2:92e2ae1b1886
Parent:
1:33d6c6f43306
Child:
3:3625406774ec

File content as of revision 2:92e2ae1b1886:

#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;
    
    UsusamaController(UsusamaSerial *pc)
    {
        pc_ = pc;
    }
    
    void update()
    {
        
        // stopコマンドをチェック
        if(stop_command.stop > 0)
        {
            move_command.enable = false;
        }
    }
    
    void write_robot_state(float state_x, float state_y, float state_theta)
    {
        // 送られてきたコマンドによって何を送るか決める
        switch(last_command_)
        {
            case UsusamaProtocol::COMMAND_MOVE:
                reply_current_pose(state_x, state_y, state_theta);
                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(state_x, state_y, state_theta);
                break;
        }
        
    }
    
    void reply_commad_pose()
    {        
        pc_ -> writeData(pc_->_register[UsusamaProtocol::COMMAND_POSE_X], UsusamaProtocol::REPLY_COMMAND_X);
        pc_ -> writeData(pc_->_register[UsusamaProtocol::COMMAND_POSE_Y], UsusamaProtocol::REPLY_COMMAND_Y);
        pc_ -> writeData(pc_->_register[UsusamaProtocol::COMMAND_POSE_THETA], UsusamaProtocol::REPLY_COMMAND_THETA);
    }
    
    void reply_current_pose(float x, float y, float theta)
    {
        int x_int = UsusamaProtocol::encode_float2int( x );
        int y_int = UsusamaProtocol::encode_float2int( y );
        int theta_int = UsusamaProtocol::encode_float2int( theta );
        
        pc_ -> writeData(x_int, UsusamaProtocol::REPLY_STATE_X);
        pc_ -> writeData(y_int, UsusamaProtocol::REPLY_STATE_Y);
        pc_ -> writeData(theta_int, UsusamaProtocol::REPLY_STATE_THETA);
    }
    
    bool is_enable_to_move()
    {
        return move_command.enable;
    }
    
    UsusamaProtocol::MoveCommand_t getReferencePose()
    {
        return move_command;
    }
    
    
    void receive_pc_process()
    {
        uint8_t reg = pc_ -> readData();
        
        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;
};

#endif