-
Notifications
You must be signed in to change notification settings - Fork 0
/
Communication.cpp
209 lines (179 loc) · 6.07 KB
/
Communication.cpp
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include "Communication.hpp"
Communication::Communication(PinName txd, PinName rxd, PinName de_pin, PinName nre_pin) : serial(txd,rxd), de(de_pin), nre(nre_pin), myled(PB_3) {
serial.baud(9600);
status = STATUS_SLEEPING; // 初期化前状態に戻る
flag_rdat_check = false;
is_highspeed_mode = false; // 標準では低速モード
}
void Communication::init(int r) {
role = r;
status = STATUS_IDLING;
serial.attach(callback(this, &Communication::receive), UnbufferedSerial::RxIrq);
de = 0;
nre = 0; // 受信許可
}
void Communication::receive(void){ // データ受け取り関数
int cnt = 0;
while(serial.readable()) {
unsigned char c = getc();
if (status == STATUS_RECEIVING) { // 受信中
if ( c==Command::END ){ // 終了コマンドなら,データ読み取り要求
//printf("size:%d\n",receive_dat.size());
flag_rdat_check = true;
status = STATUS_IDLING; // 待機状態に戻る
}else{
receive_dat.push_back(c); // データ格納
// これ消すと動く 2023/06/18
//receive_dat.push(0);
}
}
if (c==Command::START) { // スタートコマンドなら,一旦受信バッファクリアして受け取りモード
status = STATUS_RECEIVING;
freshReceiveDat();
break;
}
cnt++;
if (cnt>30){
break;
}
}
}
/*
* @func extractData
* @blief 変数に受信データを格納
* @
*/
unsigned char Communication::extractData(int data_size, int * buf){
return 0;
}
void Communication::sendDat(void){ // 格納されているデータを送信
de = 1; // 送信許可
status = STATUS_SENDING;
putc(Command::START);
//wait_ms(1);
dataWait();
while(!send_dat.empty()) {
putc(send_dat.front());
send_dat.erase(send_dat.begin());
//wait_ms(1);
dataWait();
}
putc(Command::END);
//wait_ms(1);
dataWait();
}
int Communication::decode(void) {
if (receive_dat.empty()){
return 0;
}
receive_command_dat = receive_dat.front();
receive_dat.erase(receive_dat.begin());
if ((receive_dat.size()>30)||(receive_dat.size()<=0)){
return -1;
}
if (receive_num_dat.size()>10){
NVIC_SystemReset();// ないと動かない(2022/08/07)
return receive_num_dat.size();
}
freshReceiveNumDat();
//receive_num_dat.clear();
while(!receive_dat.empty()){
int dh = receive_dat.front(); // 上位桁が必ず先
receive_dat.erase(receive_dat.begin());
if(receive_dat.empty()){
return -1; // データ個数エラー
}
int dl = receive_dat.front(); // 下位桁が必ず後
receive_dat.erase(receive_dat.begin());
int d = 1;
unsigned char dhp = 0;
dhp = dh;
if (dh>=100){ // 符号マイナス
dhp = dhp-100;
d = -1;
}
d = d*(100*dhp+dl);
receive_num_dat.push_back(d);
//receive_num_dat.push_back(d);
}
return 0;
}
int Communication::encode(void) {
freshSendDat();
send_dat.push_back(send_command_dat);
while(!send_num_dat.empty()){
int d = send_num_dat.front();
send_num_dat.erase(send_num_dat.begin());
if((d>9999)||(d<-9999))
return -1; // 値範囲エラー
unsigned char dh,dl;
dh = abs(d)/100;
dl = abs(d)-100*dh;
if(d<0)
dh = dh+100;
send_dat.push_back(dh); // 上位が先
send_dat.push_back(dl); // 下位が後
}
return 0;
}
void Communication::freshReceiveDat(void) {
while(!receive_dat.empty()) {
receive_dat.erase(receive_dat.begin());
}
}
void Communication::freshSendDat(void) {
while(!receive_dat.empty()) {
receive_dat.erase(receive_dat.begin());
}
}
void Communication::freshSendNumDat(void) {
while(!send_num_dat.empty()) {
send_num_dat.erase(send_num_dat.begin());
}
}
void Communication::freshReceiveNumDat(void) {
while(!receive_num_dat.empty()) {
receive_num_dat.erase(receive_num_dat.begin());
}
//receive_num_dat.clear();
}
int Communication::freshSerialBuffer(void) {
int cnt = 0;
while(serial.readable()){
char c = getc();
cnt++;
}
return cnt;
}
int Communication::abs(int x) {
if (x>0){
return x;
}
else{
return -x;
}
}
void Communication::dataWait(void) {
if (is_highspeed_mode) {
wait_us(100); // 高速モードの待ち時間
}else{
wait_us(1000); // 通常モードの待ち時間
}
}
void Communication::setHighSpeedMode() {
is_highspeed_mode = true;
serial.baud(115200);
}
unsigned char Communication::getc(){ // 1文字受信
unsigned char ret = 0;
int read_size_ = serial.read(&ret, 1);
//RCLCPP_INFO("read_size : %d, stat : %s", read_size, std::strerror(errno));
if (ret==201){
myled =! myled;
}
//ret = 0;
return ret;
}
void Communication::putc(unsigned char dat){ // 1文字送信
int status = serial.write(&dat, 1);
}