-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathmotor_control.h
181 lines (156 loc) · 4.39 KB
/
motor_control.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#pragma once
#include <QObject>
#include <QUuid>
#include <QTimer>
#include <QQueue>
#include <QStringList>
#include "Link.h"
typedef enum
{
MKS_OK = 0x00U,
MKS_ADDR = 0x01U,
MKS_CRC = 0x02U,
MKS_FAIL = 0x03U,
MKS_ADDR_ANS= 0x04U
} MKS_Status;
enum class ResponseType
{
kUndefined = 0,
kSetEn,
kRunSteps,
kPosition,
kMotorPosition,
kGoZero
};
struct ResponseStruct
{
ResponseStruct() : address_(0), type_(ResponseType::kUndefined) {};
ResponseStruct(uint8_t address, ResponseType type) : address_(address), type_(type) {};
bool isUndefined() const {
if (address_ == 0 && type_ == ResponseType::kUndefined)
return true;
return false;
}
uint8_t address_;
ResponseType type_;
};
struct QueueItem
{
QueueItem() : fAngle_(0.0f), sAngle_(0.0f), pause_(0.0f) {};
QueueItem(float fAngle, float sAngle, float pause) : fAngle_(fAngle), sAngle_(sAngle), pause_(pause) {};
bool isUndefined() const {
if (qFuzzyCompare(1.0f, 1.0f + pause_))
return true;
return false;
}
float fAngle_;
float sAngle_;
float pause_;
};
class MotorControl : public QObject
{
Q_OBJECT
public:
/* methods */
MotorControl(QObject* parent = nullptr, Link* linkPtr = nullptr);
~MotorControl();
void addTask(QStringList tasks);
void clearTasks();
///////////////////////////
// servo
MKS_Status setEn(uint8_t addr, uint8_t data);
MKS_Status setEnResponseCheck(const QByteArray& data);
MKS_Status runSteps(uint8_t addr, uint8_t speed, float angle, bool force = false , bool useMovementTimer = true);
MKS_Status runStepsResponseCheck(const QByteArray& data);
MKS_Status goZero(uint8_t addr, bool force = false);
MKS_Status goZeroResponseCheck(const QByteArray& data);
///////////////////////////
static QString convertStatus(MKS_Status status);
uint8_t getFAddr() const;
uint8_t getSAddr() const;
private slots:
MKS_Status readData(QByteArray data);
void onTimerEnd();
void onMovementTimerEnd();
void onWaitingTimerEnd();
signals:
void commandSended(const QByteArray& data);
void angleChanged(uint8_t addr, float angle);
void posIsConstant(float currFAngle, float taskFAngle, float currSAngle, float taskSAngle);
private:
///////////////////////////
// servo
MKS_Status position(uint8_t addr, int32_t* value, float* angle);
MKS_Status positionResponseCheck(const QByteArray& data);
MKS_Status motorPosition(uint8_t addr, int32_t* value, float* angle);
MKS_Status motorPositionResponseCheck(const QByteArray& data);
uint8_t calculateCrc(uint8_t* data, uint8_t length);
void uartSend(uint8_t* data, uint8_t length);
void resetResponseStruct();
struct struct_3byte
{
uint8_t addr;
uint8_t byte;
uint8_t crc;
};
struct struct_4byte
{
uint8_t addr;
uint8_t func;
uint8_t byte;
uint8_t crc;
};
struct struct_encAnswer
{
uint8_t addr;
uint8_t carry[4];
uint8_t value[2];
uint8_t crc;
};
struct struct_encAnswerMotorPos
{
uint8_t addr;
uint8_t carry[4];
uint8_t crc;
};
struct struct_runSteps
{
uint8_t addr;
uint8_t function;
uint8_t dir_speed;
uint8_t pulses[4];
uint8_t crc;
};
///////////////////////////
float PosToAngle(int32_t pos) const;
int32_t AngleToPos(float angle) const;
bool CheckPos(uint8_t addr, int32_t pos) const;
const int timerInterval_ = 200;
const float step_ = 1.8;
const int numMSteps_ = 16;
const float circDeg_ = 360.0f;
const float fullRotSec_ = 7.0f;
const float confirmDelta_ = 1.0f;
const float reducCoeff = 1.0f / 3.0f;
Link* linkPtr_;
ResponseStruct respStruct_;
QByteArray buffer_;
QQueue<QueueItem> taskQueue_;
QTimer elapsedTimer_;
QTimer movementTimer_;
QTimer waitingTimer_;
float taskFAngle_ = 0.0f;
float taskSAngle_ = 0.0f;
float lastTaskPause_ = 0.0f;
int32_t fPos_ = 0;
int32_t sPos_ = 0;
uint8_t fAddr_ = 0x01;
uint8_t sAddr_ = 0x02;
bool isFirst_ = false;
bool isMovementTimer_ = false;
bool fStartMark_ = true;
bool sStartMark_ = true;
bool isConstantFPos_ = false;
bool isConstantSPos_ = false;
bool wasTask_ = false;
};