-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathSeatalk.cpp
187 lines (167 loc) · 5.58 KB
/
Seatalk.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
/*
* Copyright 2010,2011,2012,2013 Robert Huitema [email protected]
*
* This file is part of FreeBoard. (http://www.42.co.nz/freeboard)
*
* FreeBoard is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* FreeBoard is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with FreeBoard. If not, see <http://www.gnu.org/licenses/>.
*/
/* Seatalk routines*/
/* Commands (My C70 says 6E 77...)
6E 07 00 00 00 00 00 00 00 00 MOB (Man Over Board), (ST80), preceded
by a Waypoint 999 command: 82 A5 40 BF 92 6D 24 DB
36 00 01 Cancel MOB (Man Over Board) condition
Wind
66 00 XY Wind alarm as indicated by flags in XY:
X&8 = 8: Apparent Wind angle low
X&4 = 4: Apparent Wind angle high
X&2 = 2: Apparent Wind speed low
X&1 = 1: Apparent Wind speed high
Y&8 = 8: True Wind angle low
Y&4 = 4: True Wind angle high
Y&2 = 2: True Wind speed low
Y&1 = 1: True Wind speed high (causes Wind-High-Alarm on ST40 Wind Instrument)
XY =00: End of wind alarm (only sent once)
68 X1 01 00 Alarm acknowledgment keystroke (from ST80 Masterview)
68 X1 03 00 Alarm acknowledgment keystroke (from ST80 Masterview)
68 41 15 00 Alarm acknowledgment keystroke (from ST40 Wind Instrument)
X: 1=Shallow Shallow Water Alarm, 2=Deep Water Alarm, 3=Anchor Alarm
4=True Wind High Alarm, 5=True Wind Low Alarm, 6=True Wind Angle high
7=True Wind Angle low, 8=Apparent Wind high Alarm, 9=Apparent Wind low Alarm
A=Apparent Wind Angle high, B=Apparent Wind Angle low
Radar
A8 53 80 00 00 D3 Alarm ON for Guard #1 or #2
A8 43 80 00 00 C3 Alarm OFF for Guard #1 or #2
AB 53 80 00 00 D3 Alarm ON for Guard #1 or #2
AB 43 80 00 00 C3 Alarm OFF for Guard #1 or #2
Autopilot
83 07 XX 00 00 00 00 00 80 00 00 Sent by course computer.
XX = 0 after clearing a failure condition, also sent once after power-up.
XX = 1 failure, auto release error. Repeated once per second.
XX = 8 failure, drive stopped.
*/
#include "Seatalk.h"
Seatalk::Seatalk( HardwareSerial* serial, FreeBoardModel* model) {
this->model=model;
this->serial=serial;
seaTalkPos = 0;
}
void Seatalk::windAlarmOff() {
// send 66 00 00 Wind alarm over
serial->write9(0x66, true);
serial->write9(0x00, false);
serial->write9(0x00, false);
}
void Seatalk::radarAlarmOff() {
// send A8 43 80 00 00 C3 Alarm OFF for Guard #1 or #2
serial->write9(0xA8, true);
serial->write9(0x43, false);
serial->write9(0x00, false);
serial->write9(0x00, false);
// send AB 43 80 00 00 C3 Alarm OFF for Guard #1 or #2
serial->write9(0xAB, true);
serial->write9(0x43, false);
serial->write9(0x00, false);
serial->write9(0x00, false);
}
void Seatalk::cancelMOB() {
// Send 36 00 01 Cancel MOB (Man Over Board) condition
serial->write9(0x36, true);
serial->write9(0x00, false);
serial->write9(0x01, false);
}
void Seatalk::processSeaTalkByte(byte inByte) {
if (inByte > 256) {
//process last datagram....would be nice to do this earlier but how to know its ended?
//second byte (4 least significant bits have additional bytes. Length is 3 + additional bytes
processSeatalk(seatalkStream);
seaTalkPos = 0;
// Serial.print("Command:");
inByte = inByte - 256;
}
seatalkStream[seaTalkPos] = inByte;
if (seaTalkPos < 19)
seaTalkPos++;
}
void Seatalk::windCommand(byte * seatalkStream) {
if (seatalkStream[1] == 0x00) {
if (seatalkStream[2] == 0x00) {
//alarm off
model->setWindAlarmTriggered(false);
} else {
model->setAlarmSnooze(0);
model->setWindAlarmTriggered(true);
}
}
}
void Seatalk::radarCommand(byte * seatalkStream) {
if ((seatalkStream[1] == 0x43 || seatalkStream[1] == 0x53)
&& seatalkStream[2] == 0x80 && seatalkStream[3] == 0x00
&& seatalkStream[4] == 0x00) {
if (seatalkStream[5] == 0xD3) {
if (DEBUG)
Serial.println(" Radar Guard Zone Alarm ON");
model->setAlarmSnooze(0);
model->setRadarAlarmTriggered(true);
}
if (seatalkStream[5] == 0xC3) {
if (DEBUG)
Serial.println(" Radar Guard Zone Alarm OFF");
model->setRadarAlarmTriggered(false);
}
}
}
void Seatalk::processSeatalk(byte * seatalkStream) {
/* if(DEBUG){
Serial.print("Processing ");
int x =0;
while(seatalkStream[x]!=0x00){
Serial.print(seatalkStream[x],HEX);
x++;
}
Serial.print(": ");
}*/
//what alarm?
switch (seatalkStream[0]) {
//MOB, Thomas Knauf says 67 07... but my C70 gives 67 77 ... listen for both
case 0x67:
if ((seatalkStream[1] == 0x77 || seatalkStream[1] == 0x07)
&& seatalkStream[2] == 0x00 && seatalkStream[3] == 0x00
&& seatalkStream[4] == 0x00 && seatalkStream[5] == 0x00
&& seatalkStream[6] == 0x00 && seatalkStream[7] == 0x00
&& seatalkStream[8] == 0x00 && seatalkStream[9] == 0x00) {
if (DEBUG)
Serial.println(" MOB Alarm ON");
model->setMobAlarmTriggered(true);
}
break;
case 0x36:
if (seatalkStream[1] == 0x00 && seatalkStream[2] == 0x01) {
if (DEBUG)
Serial.println(" Cancel MOB Alarm");
model->setMobAlarmTriggered(false);
}
break;
//radar guard zone
case 0xA8:
radarCommand(seatalkStream);
break;
case 0xAB:
radarCommand(seatalkStream);
break;
case 66:
windCommand(seatalkStream);
break;
default:
//if(DEBUG)Serial.println(" Command ignored");
break;
}
}