Skip to content
This repository was archived by the owner on Feb 3, 2025. It is now read-only.

Commit b57e4b0

Browse files
committed
🎉 Implement Web API
1 parent f616ee6 commit b57e4b0

1 file changed

Lines changed: 130 additions & 14 deletions

File tree

main.go

Lines changed: 130 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,36 @@ import (
1717
"google.golang.org/protobuf/proto"
1818
)
1919

20-
//ボーレート
20+
// ボーレート
2121
const BAUDRATE int = 9600
2222

23-
//シリアルポート名 ラズパイ4の場合、"/dev/serial0"
23+
// シリアルポート名 ラズパイ4の場合、"/dev/serial0"
2424
const SERIAL_PORT_NAME string = "/dev/serial0"
2525

2626
const IMU_TOOFAST_THRESHOULD float64 = 35.0
2727

28+
// ボールセンサー故障検知しきい値。L: OPEN故障、H: CLOSE故障
29+
const BALLSENS_LBREAK_THRESHOULD int = 100
30+
const BALLSENS_HBREAK_THRESHOULD int = 100
31+
32+
// ボールセンサーの反応しきい値。
33+
const BALLSENS_LOW_THRESHOULD int = 100
34+
35+
// バッテリーの低下しきい値。 150 = 15.0V
36+
const BATTERY_LOW_THRESHOULD int = 150
37+
const BATTERY_CRITICAL_THRESHOULD int = 140
38+
2839
var sendarray bytes.Buffer //送信用バッファ
2940

30-
//受信時の構造体
41+
// 受信時の構造体
3142
type RecvStruct struct {
3243
Volt uint8
3344
PhotoSensor uint16
3445
IsHoldBall bool
3546
ImuDir int16
3647
}
3748

38-
//送信時の構造体
49+
// 送信時の構造体
3950
type SendStruct struct {
4051
preamble byte
4152
motor [4]uint8
@@ -47,18 +58,71 @@ type SendStruct struct {
4758
emg bool
4859
}
4960

50-
//受信データ構造体
61+
// 受信データ構造体
5162
var recvdata RecvStruct
5263

53-
//imu角度
64+
// imu角度
5465
var imudegree int16
5566

56-
//imu速度超過時のフラグ
67+
// imu速度超過時のフラグ
5768
var imuError bool = false
5869

5970
var last_recv_time time.Time = time.Now()
6071

61-
//シリアル通信部分
72+
// ポート8080番で待ち受ける。
73+
const PORT string = ":8080"
74+
75+
func RunApi(chapi chan bool, MyID uint32) {
76+
//ポートを開く
77+
listener, err := net.Listen("tcp", PORT)
78+
if err != nil {
79+
log.Fatal(err)
80+
}
81+
defer listener.Close()
82+
83+
//接続を待つ
84+
for {
85+
conn, err := listener.Accept()
86+
if err != nil {
87+
log.Fatal(err)
88+
}
89+
//接続があったら処理を行う
90+
go HandleRequest(conn)
91+
}
92+
}
93+
94+
var isRobotError = false
95+
var isRobotEmgError = false
96+
97+
var RobotErrorCode = 0
98+
var RobotErrorMessage = ""
99+
100+
var ballSensLowCount = 0
101+
102+
// 接続があったら処理を行う
103+
func HandleRequest(conn net.Conn) {
104+
//200 OKを返す
105+
fmt.Fprintf(conn, "HTTP/1.1 200 OK\r \n")
106+
107+
//そのまま、recvdataをJson形式で返す
108+
//fmt.Fprintf(conn, "%s", recvdata)
109+
110+
//Json形式で返す
111+
fmt.Fprintf(conn, "{")
112+
fmt.Fprintf(conn, "\"VOLT\": %f,", float32(recvdata.Volt)/10.0)
113+
fmt.Fprintf(conn, "\"PHOTOSENSOR\":%d,", recvdata.PhotoSensor)
114+
fmt.Fprintf(conn, "\"ISHOLDBALL\":%t,", recvdata.IsHoldBall)
115+
fmt.Fprintf(conn, "\"IMUDIR\":%d", recvdata.ImuDir)
116+
fmt.Fprintf(conn, "\"ERROR \":%t", isRobotError)
117+
fmt.Fprintf(conn, "\"ERRORCODE \":%d", RobotErrorCode)
118+
fmt.Fprintf(conn, "\"ERRORMESSAGE \":%s", RobotErrorMessage)
119+
fmt.Fprintf(conn, "}")
120+
121+
//接続を閉じる
122+
conn.Close()
123+
}
124+
125+
// シリアル通信部分
62126
func RunSerial(chclient chan bool, MyID uint32) {
63127
port, err := serial.Open(SERIAL_PORT_NAME, &serial.Mode{})
64128
if err != nil {
@@ -112,6 +176,55 @@ func RunSerial(chclient chan bool, MyID uint32) {
112176
err = binary.Read(bytes.NewReader(recvbuf), binary.BigEndian, &recvdata)
113177
CheckError(err)
114178

179+
//////////////////////////////////
180+
///
181+
/// エラーチェック部分
182+
///
183+
//////////////////////////////////
184+
//ボールセンサーが低いときにカウントを増やす
185+
if recvdata.PhotoSensor < uint16(BALLSENS_LOW_THRESHOULD) {
186+
ballSensLowCount++
187+
} else {
188+
ballSensLowCount = 0
189+
}
190+
191+
//ボールセンサーが低いときにカウントが一定値(10s)を超えたらエラー
192+
if ballSensLowCount > 600 {
193+
isRobotError = true
194+
RobotErrorCode = 1
195+
RobotErrorMessage = "ボールセンサ異常"
196+
}
197+
198+
//ボールセンサの値が極端に高いときはエラー
199+
if recvdata.PhotoSensor > uint16(BALLSENS_HBREAK_THRESHOULD) {
200+
isRobotError = true
201+
RobotErrorCode = 1
202+
RobotErrorMessage = "ボールセンサ異常(回路故障の可能性)"
203+
}
204+
205+
//ボールセンサの値が極端に低いときはエラー
206+
if recvdata.PhotoSensor < uint16(BALLSENS_LBREAK_THRESHOULD) {
207+
isRobotError = true
208+
RobotErrorCode = 1
209+
RobotErrorMessage = "ボールセンサ異常(回路故障の可能性)"
210+
}
211+
212+
//バッテリの電圧が一定量を下回ったらエラー
213+
if recvdata.Volt < uint8(BATTERY_LOW_THRESHOULD) {
214+
isRobotError = true
215+
RobotErrorCode = 2
216+
RobotErrorMessage = "バッテリ電圧異常"
217+
}
218+
219+
//バッテリの電圧が極端に低いとき(速度に影響を与えるレベル)はエラー
220+
if recvdata.Volt < uint8(BATTERY_CRITICAL_THRESHOULD) {
221+
isRobotError = true
222+
RobotErrorCode = 2
223+
RobotErrorMessage = "バッテリ電圧異常(回路故障の可能性)"
224+
225+
isRobotEmgError = true //緊急停止
226+
}
227+
115228
//クライアントで受け取ったデータをバイト列に変更
116229
sendbytes := sendarray.Bytes()
117230

@@ -172,7 +285,7 @@ func RunSerial(chclient chan bool, MyID uint32) {
172285

173286
var imuReset bool = false
174287

175-
//GPIO処理部分
288+
// GPIO処理部分
176289
func RunGPIO(chgpio chan bool) {
177290

178291
//ラズパイのGPIOのメモリを確保
@@ -195,7 +308,7 @@ func RunGPIO(chgpio chan bool) {
195308
ledsec := 500 * time.Millisecond
196309
for {
197310
//電圧降下検知
198-
if recvdata.Volt <= 132 {
311+
if recvdata.Volt <= 140 {
199312
//高速チカチカ
200313
led2.High()
201314
time.Sleep(100 * time.Millisecond)
@@ -224,8 +337,8 @@ var kicker_val uint8 = 0 //キッカーの値
224337
var chip_enable bool = false //チップキックの入力のON OFFを定義する
225338
var chip_val uint8 = 0 //チップキックの値
226339

227-
//キッカーパワーが入力された時に、値を固定する関数
228-
//並列での処理が行われる
340+
// キッカーパワーが入力された時に、値を固定する関数
341+
// 並列での処理が行われる
229342
func kickCheck(chkicker chan bool) {
230343
for {
231344
//ストレートキックが入力されたとき
@@ -284,19 +397,22 @@ func main() {
284397
chserial := make(chan bool)
285398
chkick := make(chan bool)
286399
chgpio := make(chan bool)
400+
chapi := make(chan bool)
287401

288402
//各並列処理部分
289403
go RunClient(chclient, MyID, ip)
290404
go RunServer(chserver, MyID)
291405
go RunSerial(chserial, MyID)
292406
go kickCheck(chkick)
293407
go RunGPIO(chgpio)
408+
go RunApi(chapi, MyID)
294409

295410
<-chclient
296411
<-chserver
297412
<-chserial
298413
<-chkick
299414
<-chgpio
415+
<-chapi
300416
}
301417

302418
func createStatus(robotid int32, infrared bool, flatkick bool, chipkick bool) *pb_gen.Robot_Status {
@@ -308,7 +424,7 @@ func createStatus(robotid int32, infrared bool, flatkick bool, chipkick bool) *p
308424
return pe
309425
}
310426

311-
//RACOON-MWにボールセンサ等の情報を送信するためのサーバ
427+
// RACOON-MWにボールセンサ等の情報を送信するためのサーバ
312428
func RunServer(chserver chan bool, MyID uint32) {
313429
ipv4 := "224.5.69.4"
314430
port := "16941"
@@ -331,7 +447,7 @@ func RunServer(chserver chan bool, MyID uint32) {
331447

332448
}
333449

334-
//AIからの情報を受信するクライアント
450+
// AIからの情報を受信するクライアント
335451
func RunClient(chclient chan bool, MyID uint32, ip string) {
336452

337453
serverAddr := &net.UDPAddr{

0 commit comments

Comments
 (0)