Skip to content

Commit 49ec343

Browse files
OATControl V0.9.5.0 - Updates
- Fixed communication issues in Serial for commands not sending #-terminated replies.
1 parent 780453c commit 49ec343

File tree

7 files changed

+131
-75
lines changed

7 files changed

+131
-75
lines changed

Software/OATMobile/OATCommunications/CommunicationHandlers/CommandResponse.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace OATCommunications.CommunicationHandlers
22
{
3-
public class CommandResponse {
3+
public enum ResponseType { NoResponse, DigitResponse, FullResponse };
4+
public class CommandResponse {
45
public string Data { get; }
56
public bool Success { get; }
67
public string StatusMessage { get; }

Software/OATMobile/OATCommunications/CommunicationHandlers/TcpCommunicationHandler.cs

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,20 @@ public TcpCommunicationHandler(IPAddress ip, int port)
4545

4646
public async Task<CommandResponse> SendBlind(string command)
4747
{
48-
return await SendCommand(command, false);
48+
return await SendCommand(command, ResponseType.NoResponse);
4949
}
5050

5151
public async Task<CommandResponse> SendCommand(string command)
5252
{
53-
return await SendCommand(command, true);
53+
return await SendCommand(command, ResponseType.FullResponse);
5454
}
5555

56-
public bool Connected
56+
public async Task<CommandResponse> SendCommandConfirm(string command)
5757
{
58-
get
59-
{
60-
return _client != null && _client.Connected;
61-
}
58+
return await SendCommand(command, ResponseType.DigitResponse);
6259
}
6360

64-
private async Task<CommandResponse> SendCommand(string command, bool needsResponse)
61+
private async Task<CommandResponse> SendCommand(string command, ResponseType needsResponse)
6562
{
6663
if (_client == null)
6764
{
@@ -103,27 +100,43 @@ private async Task<CommandResponse> SendCommand(string command, bool needsRespon
103100

104101
var respString = String.Empty;
105102

106-
if (needsResponse)
103+
try
107104
{
108-
try
105+
switch (needsResponse)
109106
{
110-
var response = new byte[256];
111-
var respCount = await stream.ReadAsync(response, 0, response.Length);
112-
respString = Encoding.ASCII.GetString(response, 0, respCount).TrimEnd("#".ToCharArray());
113-
Debug.WriteLine($"Received {respString}");
114-
}
115-
catch (Exception e)
116-
{
117-
Debug.WriteLine(e.Message);
118-
return new CommandResponse("", false, $"Failed to receive message: {e.Message}");
107+
case ResponseType.NoResponse:
108+
break;
109+
110+
case ResponseType.DigitResponse:
111+
case ResponseType.FullResponse:
112+
{
113+
var response = new byte[256];
114+
var respCount = await stream.ReadAsync(response, 0, response.Length);
115+
respString = Encoding.ASCII.GetString(response, 0, respCount).TrimEnd("#".ToCharArray());
116+
Debug.WriteLine($"Received {respString}");
117+
}
118+
break;
119119
}
120120
}
121+
catch (Exception e)
122+
{
123+
Debug.WriteLine(e.Message);
124+
return new CommandResponse("", false, $"Failed to receive message: {e.Message}");
125+
}
121126

122127
stream.Close();
123128

124129
return new CommandResponse(respString);
125130
}
126131

132+
public bool Connected
133+
{
134+
get
135+
{
136+
return _client != null && _client.Connected;
137+
}
138+
}
139+
127140
public void Disconnect()
128141
{
129142
if (_client != null && _client.Connected)

Software/OATMobile/OATCommunications/ICommunicationHandler.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,17 @@
77
namespace OATCommunications
88
{
99
public interface ICommunicationHandler {
10+
// Send a command, no response expected
1011
Task<CommandResponse> SendBlind(string command);
12+
13+
// Send a command, expect a '#' terminated response
1114
Task<CommandResponse> SendCommand(string command);
15+
16+
// Send a command, expect a single digit response
17+
Task<CommandResponse> SendCommandConfirm(string command);
18+
1219
bool Connected { get; }
20+
1321
void Disconnect();
1422
}
1523
}

Software/OATMobile/OATCommunications/TelescopeCommandHandlers/OatmealTelescopeCommandHandlers.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,10 @@ public async Task<bool> Slew(TelescopePosition position) {
119119

120120
FloatToHMS(Math.Abs(position.Declination), out deg, out min, out sec);
121121
string sign = position.Declination < 0 ? "-" : "+";
122-
var result = await SendCommand(string.Format(":Sd{0}{1:00}*{2:00}:{3:00}#,#", sign, deg, min, sec));
122+
var result = await SendCommand(string.Format(":Sd{0}{1:00}*{2:00}:{3:00}#,n", sign, deg, min, sec));
123123
if (!result.Success || result.Data != "1") return false;
124124
FloatToHMS(Math.Abs(position.RightAscension), out hour, out min, out sec);
125-
result = await SendCommand(string.Format(":Sr{0:00}:{1:00}:{2:00}#,#", hour, min, sec));
125+
result = await SendCommand(string.Format(":Sr{0:00}:{1:00}:{2:00}#,n", hour, min, sec));
126126
if (!result.Success || result.Data != "1") return false;
127127
result = await SendCommand($":MS#");
128128
return result.Success;
@@ -133,10 +133,10 @@ public async Task<bool> Sync(TelescopePosition position) {
133133

134134
FloatToHMS(Math.Abs(position.Declination), out deg, out min, out sec);
135135
string sign = position.Declination < 0 ? "-" : "+";
136-
var result = await SendCommand(string.Format(":Sd{0}{1:00}*{2:00}:{3:00}#,#", sign, deg, min, sec));
136+
var result = await SendCommand(string.Format(":Sd{0}{1:00}*{2:00}:{3:00}#,n", sign, deg, min, sec));
137137
if (!result.Success || result.Data != "1") return false;
138138
FloatToHMS(Math.Abs(position.RightAscension), out hour, out min, out sec);
139-
result = await SendCommand(string.Format(":Sr{0:00}:{1:00}:{2:00}#,#", hour, min, sec));
139+
result = await SendCommand(string.Format(":Sr{0:00}:{1:00}:{2:00}#,n", hour, min, sec));
140140
if (!result.Success || result.Data != "1") return false;
141141
result = await SendCommand($":CM#");
142142
return result.Success;
@@ -155,7 +155,7 @@ public async Task<bool> SetHome()
155155

156156
public async Task<bool> SetTracking(bool enabled) {
157157
var b = enabled ? 1 : 0;
158-
var status = await SendCommand($":MT{b}#,#");
158+
var status = await SendCommand($":MT{b}#,n");
159159
if (status.Success) {
160160
MountState.IsTracking = enabled;
161161
}
@@ -171,7 +171,7 @@ public async Task<bool> SetLocation(double lat, double lon, double altitudeInMet
171171
}
172172
int lonFront = (int)lon;
173173
int lonBack = (int)((lon - lonFront) * 100.0);
174-
var lonCmd = $":Sg{lonFront:000}*{lonBack:00}#,#";
174+
var lonCmd = $":Sg{lonFront:000}*{lonBack:00}#,n";
175175
var status = await SendCommand(lonCmd);
176176
if (!status.Success) return false;
177177

@@ -181,23 +181,23 @@ public async Task<bool> SetLocation(double lat, double lon, double altitudeInMet
181181
var absLat = Math.Abs(lat);
182182
int latFront = (int)absLat;
183183
int latBack = (int)((absLat - latFront) * 100.0);
184-
var latCmd = $":St{latSign}{latFront:00}*{latBack:00}#,#";
184+
var latCmd = $":St{latSign}{latFront:00}*{latBack:00}#,n";
185185
status = await SendCommand(latCmd);
186186
if (!status.Success) return false;
187187

188188

189189
// GMT Offset
190190
var offsetSign = DateTimeOffset.Now.Offset.TotalHours > 0 ? "+" : "-";
191191
var offset = Math.Abs(DateTimeOffset.Now.Offset.TotalHours);
192-
status = await SendCommand($":SG{offsetSign}{offset:00}#,#");
192+
status = await SendCommand($":SG{offsetSign}{offset:00}#,n");
193193
if (!status.Success) return false;
194194

195195

196196
// Local Time and Date
197197
var n = DateTime.Now;
198-
status = await SendCommand($":SL{n:HH:mm:ss}#,#");
198+
status = await SendCommand($":SL{n:HH:mm:ss}#,n");
199199
if (!status.Success) return false;
200-
status = await SendCommand($":SC{n:MM/dd/yy}#,#");
200+
status = await SendCommand($":SC{n:MM/dd/yy}#,n");
201201
return status.Success;
202202
}
203203

@@ -206,13 +206,19 @@ public async Task<CommandResponse> SendCommand(string cmd) {
206206
cmd = $":{cmd}";
207207
}
208208

209-
if (!cmd.EndsWith("#")) {
210-
cmd += "#";
211-
}
212209
if (cmd.EndsWith("#,#"))
213210
{
214211
return await _commHandler.SendCommand(cmd.Substring(0,cmd.Length-2));
215212
}
213+
else if (cmd.EndsWith("#,n"))
214+
{
215+
return await _commHandler.SendCommandConfirm(cmd.Substring(0, cmd.Length - 2));
216+
}
217+
218+
if (!cmd.EndsWith("#"))
219+
{
220+
cmd += "#";
221+
}
216222
return await _commHandler.SendBlind(cmd);
217223
}
218224
}

Software/OpenAstroTracker ASCOM/OATCommuncations.WPF/CommunicationHandlers/SerialCommunicationHandler.cs

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class SerialCommunicationHandler : ICommunicationHandler
1212
{
1313
private string _portName;
1414
private SerialPort _port;
15+
1516
public SerialCommunicationHandler(string comPort)
1617
{
1718
_portName = comPort;
@@ -26,15 +27,20 @@ public SerialCommunicationHandler(string comPort)
2627

2728
public async Task<CommandResponse> SendBlind(string command)
2829
{
29-
return await SendCommand(command, false);
30+
return await SendCommand(command, ResponseType.NoResponse);
3031
}
3132

3233
public async Task<CommandResponse> SendCommand(string command)
3334
{
34-
return await SendCommand(command, true);
35+
return await SendCommand(command, ResponseType.FullResponse);
36+
}
37+
38+
public async Task<CommandResponse> SendCommandConfirm(string command)
39+
{
40+
return await SendCommand(command, ResponseType.DigitResponse);
3541
}
3642

37-
public async Task<CommandResponse> SendCommand(string command, bool needsResponse)
43+
private async Task<CommandResponse> SendCommand(string command, ResponseType needsResponse)
3844
{
3945
if (await EnsurePortIsOpen())
4046
{
@@ -47,19 +53,34 @@ public async Task<CommandResponse> SendCommand(string command, bool needsRespons
4753
return new CommandResponse(string.Empty, false, $"Unable to write to {_portName}");
4854
}
4955

50-
if (needsResponse)
56+
try
5157
{
52-
try
53-
{
54-
var response = _port.ReadTo("#");
55-
return new CommandResponse(response, true);
56-
}
57-
catch (Exception ex)
58+
switch (needsResponse)
5859
{
59-
return new CommandResponse(string.Empty, false, $"Unable to read response to {command} from {_portName}. {ex.Message}");
60+
case ResponseType.NoResponse:
61+
{
62+
return new CommandResponse(string.Empty, true);
63+
}
64+
65+
case ResponseType.DigitResponse:
66+
{
67+
string response = new string((char)_port.ReadChar(), 1);
68+
return new CommandResponse(response, true);
69+
}
70+
71+
case ResponseType.FullResponse:
72+
{
73+
string response = _port.ReadTo("#");
74+
return new CommandResponse(response, true);
75+
}
6076
}
6177
}
62-
return new CommandResponse(string.Empty, true);
78+
catch (Exception ex)
79+
{
80+
return new CommandResponse(string.Empty, false, $"Unable to read response to {command} from {_portName}. {ex.Message}");
81+
}
82+
83+
return new CommandResponse(string.Empty, false, "Something weird going on...");
6384
}
6485
else
6586
{

Software/OpenAstroTracker ASCOM/OATControl/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,5 @@
5151
// You can specify all the values or you can default the Build and Revision Numbers
5252
// by using the '*' as shown below:
5353
// [assembly: AssemblyVersion("1.0.*")]
54-
[assembly: AssemblyVersion("0.9.4.0")]
54+
[assembly: AssemblyVersion("0.9.5.0")]
5555
[assembly: AssemblyFileVersion("1.0.0.0")]

Software/OpenAstroTracker ASCOM/OATControl/ViewModels/MountVM.cs

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ private void Log(string format, params object[] p)
136136

137137
private async Task OnSetHome()
138138
{
139-
await RunCustomOATCommandAsync(":SHP#,#");
139+
await RunCustomOATCommandAsync(":SHP#,n");
140140
await ReadHA();
141141
}
142142

@@ -211,38 +211,45 @@ private async Task UpdateStatus()
211211

212212
if (!string.IsNullOrWhiteSpace(status))
213213
{
214-
var parts = status.Split(",".ToCharArray());
215-
MountStatus = parts[0];
216-
217-
switch (parts[1][0])
218-
{
219-
case 'R': IsSlewingEast = true; IsSlewingWest = false; break;
220-
case 'r': IsSlewingEast = false; IsSlewingWest = true; break;
221-
default: IsSlewingEast = false; IsSlewingWest = false; break;
222-
}
223-
switch (parts[1][1])
214+
try
224215
{
225-
case 'd': IsSlewingNorth = true; IsSlewingSouth = false; break;
226-
case 'D': IsSlewingNorth = false; IsSlewingSouth = true; break;
227-
default: IsSlewingNorth = false; IsSlewingSouth = false; break;
228-
}
216+
var parts = status.Split(",".ToCharArray());
217+
MountStatus = parts[0];
218+
219+
switch (parts[1][0])
220+
{
221+
case 'R': IsSlewingEast = true; IsSlewingWest = false; break;
222+
case 'r': IsSlewingEast = false; IsSlewingWest = true; break;
223+
default: IsSlewingEast = false; IsSlewingWest = false; break;
224+
}
225+
switch (parts[1][1])
226+
{
227+
case 'd': IsSlewingNorth = true; IsSlewingSouth = false; break;
228+
case 'D': IsSlewingNorth = false; IsSlewingSouth = true; break;
229+
default: IsSlewingNorth = false; IsSlewingSouth = false; break;
230+
}
229231

230-
// Don't use property here since it sends a command.
231-
_isTracking = parts[1][2] == 'T';
232-
OnPropertyChanged("IsTracking");
232+
// Don't use property here since it sends a command.
233+
_isTracking = parts[1][2] == 'T';
234+
OnPropertyChanged("IsTracking");
233235

234236

235-
RAStepper = int.Parse(parts[2]);
236-
DECStepper = int.Parse(parts[3]);
237-
TrkStepper = int.Parse(parts[4]);
237+
RAStepper = int.Parse(parts[2]);
238+
DECStepper = int.Parse(parts[3]);
239+
TrkStepper = int.Parse(parts[4]);
238240

239-
CurrentRAHour = int.Parse(parts[5].Substring(0, 2));
240-
CurrentRAMinute = int.Parse(parts[5].Substring(2, 2));
241-
CurrentRASecond = int.Parse(parts[5].Substring(4, 2));
241+
CurrentRAHour = int.Parse(parts[5].Substring(0, 2));
242+
CurrentRAMinute = int.Parse(parts[5].Substring(2, 2));
243+
CurrentRASecond = int.Parse(parts[5].Substring(4, 2));
242244

243-
CurrentDECDegree = int.Parse(parts[6].Substring(0, 3));
244-
CurrentDECMinute = int.Parse(parts[6].Substring(3, 2));
245-
CurrentDECSecond = int.Parse(parts[6].Substring(5, 2));
245+
CurrentDECDegree = int.Parse(parts[6].Substring(0, 3));
246+
CurrentDECMinute = int.Parse(parts[6].Substring(3, 2));
247+
CurrentDECSecond = int.Parse(parts[6].Substring(5, 2));
248+
}
249+
catch (Exception ex)
250+
{
251+
Log("UpdateStatus: Failed to process GX reply [{0}]", status);
252+
}
246253
}
247254
}
248255
}
@@ -266,7 +273,7 @@ private async Task OnPark()
266273
}
267274
else
268275
{
269-
await RunCustomOATCommandAsync(":hU#,#");
276+
await RunCustomOATCommandAsync(":hU#,n");
270277
ParkCommandString = "Park";
271278
}
272279

@@ -385,7 +392,7 @@ private async void OnConnectToTelescope()
385392
var lstS = _util.HoursToHMS(lst, "", "", "");
386393

387394
Log("LST: {0}", _util.HoursToHMS(lst, "h", "m", "s"));
388-
var stringResult = await RunCustomOATCommandAsync(string.Format(":SHL{0}#,#", _util.HoursToHMS(lst, "", "", "")));
395+
var stringResult = await RunCustomOATCommandAsync(string.Format(":SHL{0}#,n", _util.HoursToHMS(lst, "", "", "")));
389396
lst -= _util.HMSToHours("02:58:04");
390397
Log("HA: {0}", _util.HoursToHMS(lst, "h", "m", "s"));
391398
await UpdateCurrentCoordinates();

0 commit comments

Comments
 (0)