z1_sdk/include/unitree_arm_sdk/cmdPanel.h

150 lines
3.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*****************************************************************
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_