Skip to content

Commit d851969

Browse files
committed
Fix XBee AT init as this was not going to work more than once as the config saved in the arduino eeprom prevent this code from running twice.
1 parent 8a1bd3d commit d851969

File tree

2 files changed

+80
-37
lines changed

2 files changed

+80
-37
lines changed

Firmwares/Rotator/Rotator.ino

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ const char STEPSPER_ROTATOR_CMD = 't'; // GetSteps per rotation
119119
const char SYNC_ROTATOR_CMD = 's'; // Sync to telescope
120120
const char VERSION_ROTATOR_GET = 'v'; // Get Version string
121121
const char VOLTS_ROTATOR_CMD = 'k'; // Get volts and get/set cutoff
122+
const char INIT_XBEE = 'x'; // force a ConfigXBee
122123

123124
const char ACCELERATION_SHUTTER_CMD = 'E'; // Get/Set stepper acceleration
124125
const char CLOSE_SHUTTER_CMD = 'C'; // Close shutter
@@ -163,11 +164,15 @@ void loop()
163164

164165
if (!XbeeStarted) {
165166
if (!Rotator.radioIsConfigured && !isConfiguringWireless) {
167+
DBPrint("Xbee reconfiguring");
166168
StartWirelessConfig();
167-
delay(3000);
169+
DBPrint("Rotator.radioIsConfigured : " + String(Rotator.radioIsConfigured));
170+
DBPrint("isConfiguringWireless : " + String(isConfiguringWireless));
168171
}
169172
else if (Rotator.radioIsConfigured) {
170173
XbeeStarted = true;
174+
wirelessBuffer = "";
175+
DBPrint("Radio configured");
171176
SendHello();
172177
}
173178
}
@@ -188,31 +193,37 @@ void loop()
188193
//<SUMMARY>Start configuration routine then send Hello broadcast</SUMMARY>
189194
void StartWirelessConfig()
190195
{
191-
delay(10000);
196+
Computer.println("Xbee configuration started");
197+
delay(1100); // guard time before and after
192198
isConfiguringWireless = true;
199+
DBPrint("Sending +++");
193200
Wireless.print("+++");
194-
delay(1000);
201+
delay(1100);
195202
}
196203

197204
void ConfigXBee(String result)
198205
{
206+
DBPrint("[ConfigXBee]");
207+
199208
if (configStep == 0) {
200209
// ATString = "ATCE1,ID7734,AP0,SM0,RO0,WR,CN";
201210
// CE1 for coordinator, rotation MY is 0,
202-
ATString = "ATCE1,ID7734,CH0C,MY0,DH0,DLFFFF,AP0,SM0,WR,BD7,CN";
211+
ATString = "ATCE1,ID7734,CH0C,MY0,DH0,DLFFFF,AP0,SM0,BD3,WR,CN";
203212
Wireless.println(ATString);
213+
DBPrint("Sending : " + ATString);
204214
}
205215
DBPrint("Result " + String(configStep) + ":" + result);
206216

207-
if (configStep > 5) {
208-
// switch to 115200
209-
Wireless.begin(115200);
210-
DBPrint("Config finished");
217+
if (configStep > 9) {
211218
isConfiguringWireless = false;
212219
Rotator.radioIsConfigured = true;
213220
XbeeStarted = true;
214221
Rotator.SaveToEEProm();
215-
delay(4000);
222+
delay(10000);
223+
Computer.print("Xbee configuration finished");
224+
while(Wireless.available() > 0) {
225+
Wireless.read();
226+
}
216227
}
217228
configStep++;
218229
}
@@ -546,6 +557,19 @@ void ProcessSerialCommand()
546557
case RAIN_SHUTTER_GET:
547558
serialMessage = String(RAIN_SHUTTER_GET) + String(bIsRaining ? "1" : "0");
548559
break;
560+
561+
case INIT_XBEE:
562+
localString = String(INIT_XBEE);
563+
Rotator.radioIsConfigured = false;
564+
isConfiguringWireless = false;
565+
XbeeStarted = false;
566+
configStep = 0;
567+
serialMessage = localString;
568+
Wireless.print(localString + "#");
569+
ReceiveWireless();
570+
DBPrint("trying to reconfigure radio");
571+
break;
572+
549573
#pragma endregion
550574

551575
#pragma region Shutter Commands
@@ -674,7 +698,7 @@ void ProcessSerialCommand()
674698
localString = String(VOLTS_SHUTTER_CMD);
675699
wirelessMessage = localString;
676700
if (hasValue)
677-
wirelessMessage += value;
701+
wirelessMessage += String(value);
678702

679703
Wireless.print(wirelessMessage + "#");
680704
ReceiveWireless();
@@ -737,26 +761,40 @@ int ReceiveWireless()
737761
char wirelessCharacter;
738762

739763
wirelessBuffer = "";
764+
if (isConfiguringWireless) {
765+
DBPrint("[ReceiveWireless] isConfiguringWireless : " + String(isConfiguringWireless));
766+
// read the response
767+
do {
768+
wirelessCharacter = Wireless.read();
769+
if(wirelessCharacter != '\r' && wirelessCharacter != -1) {
770+
wirelessBuffer += String(wirelessCharacter);
771+
}
772+
} while (wirelessCharacter != '\r');
773+
774+
DBPrint("[ReceiveWireless] wirelessBuffer = " + wirelessBuffer);
775+
776+
ConfigXBee(wirelessBuffer);
777+
return;
778+
}
779+
740780
// wait for response, timeout after MAX_TIMEOUT times 10ms
741781
while(Wireless.available() == 0) {
742782
delay(10);
743783
timeout++;
744-
if(timeout >= MAX_TIMEOUT)
784+
if(timeout >= MAX_TIMEOUT) {
745785
return ERR_NO_DATA;
786+
}
746787
}
747788

748789
// read the response
749790
do {
750791
wirelessCharacter = Wireless.read();
751-
if(wirelessCharacter != ERR_NO_DATA && wirelessCharacter != '#') {
752-
wirelessBuffer += wirelessCharacter;
792+
if(wirelessCharacter != ERR_NO_DATA && wirelessCharacter != '#' && wirelessCharacter != -1) {
793+
wirelessBuffer += String(wirelessCharacter);
753794
}
754795
} while (wirelessCharacter != '#');
755796

756-
if (isConfiguringWireless) {
757-
ConfigXBee(wirelessBuffer);
758-
}
759-
else if (wirelessBuffer.length() > 0) {
797+
if (wirelessBuffer.length() > 0) {
760798
ProcessWireless();
761799
}
762800
return OK;

Firmwares/Shutter/Shutter.ino

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ const char STEPSPER_SHUTTER_CMD = 'T'; // Get/Set steps per stroke
7272
const char VERSION_SHUTTER_GET = 'V'; // Get version string
7373
const char VOLTS_SHUTTER_CMD = 'K'; // Get volts and get/set cutoff
7474
const char VOLTSCLOSE_SHUTTER_CMD = 'B';
75+
const char INIT_XBEE = 'x'; // force a ConfigXBee
7576

7677
#pragma endregion
7778

@@ -103,13 +104,6 @@ void setup()
103104
Wireless.begin(9600);
104105
// updateInterval = 1000;
105106
stepInterval = 100;
106-
DBPrintln("Waiting for communications setup");
107-
// delay(20000);
108-
// reset all timers
109-
// nextUpdateTimer.reset();
110-
// nextStepTimer.reset();
111-
// nextVoltageUpdateTimer.reset();
112-
// nextRainCheckTimer.reset();
113107
watchdogTimer.reset();
114108
}
115109

@@ -123,13 +117,12 @@ void loop()
123117

124118
if (!XbeeStarted) {
125119
if (!Shutter.radioIsConfigured && !Shutter.isConfiguringWireless) {
126-
DBPrintln("Wait for serial devices to start");
127120
StartWirelessConfig();
128-
delay(2000);
129121
}
130122
else if (Shutter.radioIsConfigured) {
131123
XbeeStarted = true;
132-
DBPrintln("Radio started");
124+
wirelessBuffer = "";
125+
DBPrintln("Radio configured");
133126
}
134127
}
135128

@@ -208,32 +201,36 @@ void UpdateRotator()
208201
#pragma region XBeeRoutines
209202
void StartWirelessConfig()
210203
{
204+
Computer.println("Xbee configuration started");
205+
delay(1100); // guard time before and after
211206
Shutter.isConfiguringWireless = true;
212-
delay(1000);
213207
DBPrintln("Sending +++");
214208
Wireless.print("+++");
215-
delay(1000);
209+
delay(1100);
216210
}
217211

218212
inline void ConfigXBee(String result)
219213
{
220214
if (configStep == 0) {
221215
// ATString = "ATCE0,ID7734,AP0,SM0,RO0,WR,CN";
222216
// CE0 for end device, shutter MY is 1
223-
ATString = "ATCE0,ID7734,CH0C,MY1,DH0,DL0,AP0,SM0,WR,BD7,CN";
217+
ATString = "ATCE0,ID7734,CH0C,MY1,DH0,DL0,AP0,SM0,BD3,WR,CN";
224218
DBPrintln("AT String " + ATString);
225219
Wireless.println(ATString);
220+
Wireless.flush();
221+
226222
}
227223
DBPrintln("Result " + String(configStep) + ":" + result);
228-
if (configStep > 5) {
229-
// switch to 115200
230-
Wireless.begin(115200);
224+
if (configStep > 9) {
231225
Shutter.isConfiguringWireless = false;
232-
DBPrintln("Wireless Configured");
233226
Shutter.radioIsConfigured = true;
234227
XbeeStarted = true;
235228
Shutter.WriteEEProm();
236-
delay(2000);
229+
delay(10000);
230+
Computer.println("Xbee configuration finished");
231+
while(Wireless.available() > 0) {
232+
Wireless.read();
233+
}
237234
}
238235
configStep++;
239236
}
@@ -264,10 +261,10 @@ void ReceiveWireless()
264261
while(Wireless.available()) {
265262
character = Wireless.read();
266263

267-
if (character == '#') {
264+
if (character == '\r' || character == '#') {
268265
if (wirelessBuffer.length() > 0) {
269266
if (Shutter.isConfiguringWireless) {
270-
DBPrint("Configuring");
267+
DBPrint("Configuring XBee");
271268
ConfigXBee(wirelessBuffer);
272269
}
273270
else {
@@ -446,6 +443,14 @@ void ProcessMessages(String buffer)
446443
DBPrintln("Close on low voltage " + String(Shutter.GetVoltsClose()));
447444
break;
448445

446+
case INIT_XBEE:
447+
Shutter.radioIsConfigured = false;
448+
Shutter.isConfiguringWireless = false;
449+
XbeeStarted = false;
450+
configStep = 0;
451+
wirelessMessage = String(INIT_XBEE);
452+
break;
453+
449454
default:
450455
DBPrintln("Unknown command " + String(command));
451456
break;

0 commit comments

Comments
 (0)