z1_sdk/include/unitree_arm_sdk/cmdPanel.h

150 lines
3.7 KiB
C
Raw Normal View History

2022-07-20 11:20:01 +08:00
/*****************************************************************
Copyright (c) 2022, Unitree Robotics.Co.Ltd. All rights reserved.
*****************************************************************/
#ifndef _UNITREE_ARM_CMDPANEL_H_
#define _UNITREE_ARM_CMDPANEL_H_
#include <vector>
#include <deque>
#include "unitree_arm_sdk/loop.h"
#include "unitree_arm_sdk/common/arm_common.h"
enum class KeyPress{
RELEASE,
PRESS,
REPEAT
};
enum class ActionType{
EMPTY,
STATE,
VALUE
};
struct KeyCmd{
std::string c;
KeyPress keyPress;
};
class KeyAction{
public:
KeyAction(ActionType type);
virtual ~KeyAction(){};
ActionType getType(){return _type;}
protected:
ActionType _type;
};
class StateAction : public KeyAction{
public:
StateAction(std::string c, int state, KeyPress press = KeyPress::PRESS);
virtual ~StateAction(){};
int getState(){return _state;};
bool handleCmd(KeyCmd keyCmd, int &state);
protected:
int _state;
KeyCmd _keyCmdSet;
};
class EmptyAction : public StateAction{
public:
EmptyAction(int state);
~EmptyAction(){};
private:
};
/*
, deltaValue为每秒改变量
valueAction允许共用按键
*/
class ValueAction : public KeyAction{
public:
ValueAction(std::string cUp, std::string cDown, double deltaValue, double initValue = 0.0);
ValueAction(std::string cUp, std::string cDown, std::string cGoZero, double deltaValue, double initValue = 0.0);
ValueAction(std::string cUp, std::string cDown, double deltaValue, double limit1, double limit2, double initValue = 0.0);
ValueAction(std::string cUp, std::string cDown, std::string cGoZero, double deltaValue, double limit1, double limit2, double initValue = 0.0);
~ValueAction(){};
bool handleCmd(KeyCmd keyCmd);
void setDt(double dt);
double getValue();
double getDValue();
double setValue(double value){_value = value;}
private:
double _value;
double _changeDirection;
double _dV = 0.0;
double _dt = 0.0;
double _dVdt = 0.0;
double _lim1, _lim2;
bool _hasLim = false;
bool _hasGoZero = false;
KeyCmd _upCmdSet;
KeyCmd _downCmdSet;
KeyCmd _goZeroCmdSet;
};
class CmdPanel{
public:
CmdPanel(std::vector<KeyAction*> events,
EmptyAction emptyAction, size_t channelNum = 1, double dt = 0.002);
virtual ~CmdPanel();
int getState(size_t channelID = 0);
std::vector<double> getValues();
std::vector<double> getDValues();
void setValue(std::vector<double> values);
void setValue(double value, size_t id);
virtual std::string getString(std::string slogan);
virtual std::vector<double> stringToArray(std::string slogan);
virtual std::vector<std::vector<double> > stringToMatrix(std::string slogan);
virtual SendCmd getSendCmd();
virtual void getRecvState(RecvState recvState);
protected:
virtual void _read() = 0;
void _start();
void _run();
void _updateState();
void _pressKeyboard();
void _releaseKeyboard();
static void* _runStatic(void* obj);
static void* _readStatic(void* obj);
LoopFunc *_runThread;
LoopFunc *_readThread;
std::vector<StateAction> _stateEvents;
std::vector<ValueAction> _valueEvents;
EmptyAction _emptyAction;
size_t _actionNum = 0;
size_t _stateNum = 0;
size_t _valueNum = 0;
size_t _channelNum;
std::vector<double> _values;
std::vector<double> _dValues;
int _state;
std::vector<std::deque<int>> _stateQueue;
std::vector<int> _outputState;
std::vector<bool> _getState;
double _dt;
KeyCmd _keyCmd;
std::string _cPast = "";
bool _running = true;
};
#endif // _UNITREE_ARM_CMDPANEL_H_