Serial Wombat Arduino Library
Loading...
Searching...
No Matches
SerialWombat.h
Go to the documentation of this file.
1#ifndef SERIAL_WOMBAT_H__
2#define SERIAL_WOMBAT_H__
3
4/*
5Copyright 2020-2025 Broadwell Consulting Inc.
6
7"Serial Wombat" is a registered trademark of Broadwell Consulting Inc. in
8the United States. See SerialWombat.com for usage guidance.
9
10Permission is hereby granted, free of charge, to any person obtaining a
11 * copy of this software and associated documentation files (the "Software"),
12 * to deal in the Software without restriction, including without limitation
13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 * and/or sell copies of the Software, and to permit persons to whom the
15 * Software is furnished to do so, subject to the following conditions:
16
17The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19
20THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
24 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26 * OTHER DEALINGS IN THE SOFTWARE.
27*/
28
29#include <stdint.h>
30#include "Stream.h"
31//#include "Serial.h" // Using "" rather than <> for compatibility with Visual C++ simulation project
32#include "Wire.h"// Using "" rather than <> for compatibility with Visual C++ simulation project
33#include "Arduino.h"
34#ifndef INPUT
35#define INPUT 0x0
36#endif
37
38
41
42
43#include "SerialWombatErrors.h"
44
46#define SW_LE16(_a) (uint8_t)((_a) & 0xFF), (uint8_t)((_a) >>8)
47
49#define SW_LE32(_a) (uint8_t)((_a) & 0xFF), (uint8_t)((_a) >>8) , (uint8_t)((_a) >>16), (uint8_t)((_a) >>24)
50
51#define ARRAY_UINT32(_array,_index) ((((uint32_t) _array[_index +3])<<24) + (((uint32_t) _array[_index +2])<<16) + (((uint32_t) _array[_index +1])<<8) + _array[_index])
52#define SW18AB_LATEST_FIRMWARE 222
53#define SW08B_LATEST_FIRMWARE 222
54#define SW4B_LATEST_FIRMWARE 203
55
56typedef enum
57{
58 SW_LOW = 0,
62
63
66
87// SW_DATA_SOURCE_PIN_20 = 20,
88// SW_DATA_SOURCE_PIN_21 = 21,
89// SW_DATA_SOURCE_PIN_22 = 22,
90// SW_DATA_SOURCE_PIN_23 = 23,
91// SW_DATA_SOURCE_PIN_24 = 24,
92// SW_DATA_SOURCE_PIN_25 = 25,
93// SW_DATA_SOURCE_PIN_26 = 26,
94// SW_DATA_SOURCE_PIN_27 = 27,
95// SW_DATA_SOURCE_PIN_28 = 28,
96// SW_DATA_SOURCE_PIN_29 = 29,
97// SW_DATA_SOURCE_PIN_30 = 30,
98// SW_DATA_SOURCE_PIN_31 = 31,
99// SW_DATA_SOURCE_PIN_32 = 32,
100// SW_DATA_SOURCE_PIN_33 = 33,
101// SW_DATA_SOURCE_PIN_34 = 34,
102// SW_DATA_SOURCE_PIN_35 = 35,
103// SW_DATA_SOURCE_PIN_36 = 36,
104// SW_DATA_SOURCE_PIN_37 = 37,
105// SW_DATA_SOURCE_PIN_38 = 38,
106// SW_DATA_SOURCE_PIN_39 = 39,
107// SW_DATA_SOURCE_PIN_40 = 40,
108// SW_DATA_SOURCE_PIN_41 = 41,
109// SW_DATA_SOURCE_PIN_42 = 42,
110// SW_DATA_SOURCE_PIN_43 = 43,
111// SW_DATA_SOURCE_PIN_44 = 44,
112// SW_DATA_SOURCE_PIN_45 = 45,
113// SW_DATA_SOURCE_PIN_46 = 46,
114// SW_DATA_SOURCE_PIN_47 = 47,
115// SW_DATA_SOURCE_PIN_48 = 48,
116// SW_DATA_SOURCE_PIN_49 = 49,
117// SW_DATA_SOURCE_PIN_50 = 50,
118// SW_DATA_SOURCE_PIN_51 = 51,
119// SW_DATA_SOURCE_PIN_52 = 52,
120// SW_DATA_SOURCE_PIN_53 = 53,
121// SW_DATA_SOURCE_PIN_54 = 54,
122// SW_DATA_SOURCE_PIN_55 = 55,
123// SW_DATA_SOURCE_PIN_56 = 56,
124// SW_DATA_SOURCE_PIN_57 = 57,
125// SW_DATA_SOURCE_PIN_58 = 58,
126// SW_DATA_SOURCE_PIN_59 = 59,
127// SW_DATA_SOURCE_PIN_60 = 60,
128// SW_DATA_SOURCE_PIN_61 = 61,
129// SW_DATA_SOURCE_PIN_62 = 62,
130// SW_DATA_SOURCE_PIN_63 = 63,
143
154 //NOT ANALOG SW_DATA_SOURCE_PIN_5_MV = 105,
155 //NOT ANALOG SW_DATA_SOURCE_PIN_6_MV = 106,
156 //NOT ANALOG SW_DATA_SOURCE_PIN_7_MV = 107,
157 //NOT ANALOG SW_DATA_SOURCE_PIN_8_MV = 108,
158 //NOT ANALOG SW_DATA_SOURCE_PIN_9_MV = 109,
159 //NOT ANALOG SW_DATA_SOURCE_PIN_10_MV = 110,
160 //NOT ANALOG SW_DATA_SOURCE_PIN_11_MV = 111,
161 //NOT ANALOG SW_DATA_SOURCE_PIN_12_MV = 112,
162 //NOT ANALOG SW_DATA_SOURCE_PIN_13_MV = 113,
163 //NOT ANALOG SW_DATA_SOURCE_PIN_14_MV = 114,
164 //NOT ANALOG SW_DATA_SOURCE_PIN_15_MV = 115,
171// SW_DATA_SOURCE_2HZ_SIN = 166,
174// SW_DATA_SOURCE_1HZ_SIN = 169,
177// SW_DATA_SOURCE_2SEC_SIN = 172,
180// SW_DATA_SOURCE_8SEC_SIN = 175,
183// SW_DATA_SOURCE_65SEC_SIN = 178,
185};
186
187#define ERROR_HOST_INCORRECT_NUMBER_BYTES_WRITTEN 0x10000
188#define ERROR_HOST_DATA_TOO_LONG 0x10001
189#define ERROR_HOST_NACK_ADDRESS 0x10002
190#define ERROR_HOST_NACK_DATA 0x10003
191#define ERROR_HOST_OTHER_I2C_ERROR 0x10004
192
193#define WOMBAT_MAXIMUM_PINS 20
194
196{
197 CMD_ECHO ='!',
200 CMD_RESET = 'R',
256
257};
258
259
298
299class SerialWombatChip;
300
301typedef void (*SerialWombatErrorHandler_t) (uint16_t errorNumber, SerialWombatChip* sw);
302
313{
314private:
315
316 char version[8] = { 0 };
317 HardwareSerial * Serial = NULL;
318 TwoWire* i2cInterface = NULL;
319 uint8_t _pinmode[WOMBAT_MAXIMUM_PINS]={}; // Includes Pullup
320 bool _pullDown[WOMBAT_MAXIMUM_PINS]={};
321 bool _openDrain[WOMBAT_MAXIMUM_PINS]={};
322 bool _highLow[WOMBAT_MAXIMUM_PINS] = {};
323 bool _asleep = false;
324 SerialWombatErrorHandler_t errorHandler = NULL;
325 bool _currentlyCommunicating = false;
326public:
333 uint16_t _supplyVoltagemV = 0;
334
336 uint8_t model[4] = { 0 };
337
339 uint8_t fwVersion[4] = { 0 };
340
346 uint8_t uniqueIdentifier[16];
347
353
359
366 uint16_t errorCount = 0;
367
369 bool inBoot = false;
370
372 int16_t lastErrorCode = 0;
373
382
383 void configureDigitalPin(uint8_t pin, uint8_t highLow)
384 {
385 uint8_t tx[8] = { 200,pin,0,0,0,0,0,0x55 };
386 uint8_t rx[8];
387 switch (_pinmode[pin])
388 {
389 case INPUT: // Arduino input
390 {
391 tx[3] = 2; //Input
392 }
393 break;
394 case OUTPUT:
395 {
396 if (highLow == LOW)
397 {
398 tx[3] = 0;
399 }
400 else if (highLow == HIGH)
401 {
402 tx[3] = 1;
403 }
404 else
405 {
406 return;
407 }
408 }
409 break;
410 case INPUT_PULLUP:
411 {
412 tx[3] = 2; //Input
413 tx[4] = 1; //Pullup on
414 }
415 break;
416 default:
417 {
418 return;
419 }
420 }
421 tx[6] = _openDrain[pin];
422 tx[5] = _pullDown[pin];
423 sendPacket(tx, rx, true);
424 }
425
429 uint32_t sendReadyTime = 0;
430
434 int16_t initialize()
435 {
436 lastErrorCode = 0;
437 readVersion();
441 return(lastErrorCode);
442 }
443
451 {
453 if (version[0] == 'S' && version[1] == '0' && version[2] == '4')
454 { //16F15214
455 for (uint32_t address = 0x8100; address <= 0x8108; ++address)
456 {
457 uint32_t data = readFlashAddress(address);
460 /* Always zero... leave out
461 uniqueIdentifier[uniqueIdentifierLength] = (uint8_t)(data>>8);
462 ++uniqueIdentifierLength;
463 */
464 }
465 }
466 else if (isSW18())
467 {
468 for (uint32_t address = 0x801600; address <= 0x801608; address += 2)
469 {
470 uint32_t data = readFlashAddress(address);
477 }
478 }
479 else if (isSW08())
480 {
481 //TODO
482 }
483
484 }
485
492
494 {
495 if (version[0] == 'S' && version[1] == '0' && version[2] == '4')
496 { //16F15214
497
498 uint32_t data = readFlashAddress(0x8006);
499 deviceIdentifier = (uint16_t)data;
500 data = readFlashAddress(0x8005);
501 deviceRevision = (uint16_t)data;
502 }
503 else if (isSW18())
504 {
505 uint32_t data = readFlashAddress(0xFF0000);
506 deviceIdentifier = (uint16_t)data;
507 data = readFlashAddress(0xFF0002);
508 deviceRevision = (uint16_t)data & 0xF;
509 }
510 }
511
517 uint16_t returnErrorCode(uint8_t* rx)
518 {
519 uint16_t result = rx[1] - '0';
520 result *= 10;
521 result += rx[2] - '0';
522 result *= 10;
523 result += rx[3] - '0';
524 result *= 10;
525 result += rx[4] - '0';
526 result *= 10;
527 result += rx[5] - '0';
528 return(result);
529 }
530
531
532
533public:
548 int16_t begin(HardwareSerial& serial, bool reset = true)
549 {
550 Serial = &serial;
551 Serial->begin(115200);
552 Serial->setTimeout(2);
553 Serial->write((uint8_t*)"UUUUUUUU", 8);
554 delay(5);
555 while (Serial->read() >= 0);
556 if (reset)
557 {
559 sendReadyTime = millis() + 1000;
560 return(1);
561 }
562 else
563 {
564 return initialize();
565 }
566
567
568 }
569
579 int16_t begin(uint8_t i2cAddress);
580
594 int16_t begin(TwoWire& wire, uint8_t i2cAddress, bool reset = true)
595 {
596 i2cInterface = &wire;
597 address = i2cAddress;
598
599 Wire.beginTransmission(i2cAddress);
600 int error = Wire.endTransmission();
601
602
603 if (error != 0)
604 {
605 return(-1);
606 }
607
608 if (reset)
609 {
611 sendReadyTime = millis() + 250;
612 return(1);
613 }
614 else
615 {
616 sendReadyTime = 0;
617 return initialize();
618
619 }
620 }
621
623
634 int sendPacket( uint8_t tx[], uint8_t rx[]);
635
645 int sendPacket(uint8_t tx[]);
646
660 int sendPacket(uint8_t tx[], uint8_t rx[], bool retryIfEchoDoesntMatch, uint8_t beginningBytesToMatch = 8, uint8_t endBytesToMatch = 0);
671 int sendPacket(uint8_t tx[], bool retryIfEchoDoesntMatch);
672
681
682 int sendPacketNoResponse(uint8_t tx[]);
683
692 char* readVersion(void)
693 {
694 uint8_t tx[] = { 'V',0x55,0x55,0x55,0x55,0x55,0x55,0x55 };
695 uint8_t rx[8];
696 sendPacket(tx, rx);
697 memcpy(version, &rx[1], 7);
698 version[7] = '\0';
699 memcpy(model, &rx[1], 3);
700 model[3] = '\0';
701 fwVersion[0] = rx[5];
702 fwVersion[1] = rx[6];
703 fwVersion[2] = rx[7];
704 return (version);
705 }
706
713 uint32_t readVersion_uint32(void)
714 {
715 readVersion();
716 return (
717 ((uint32_t)fwVersion[0] - '0') * 100 +
718 ((uint32_t)fwVersion[1] - '0') * 10 +
719 (uint32_t)fwVersion[2] - '0');
720 }
721
727 {
728 uint32_t v = readVersion_uint32();
729 if (isSW18())
730 {
731 return (v == SW18AB_LATEST_FIRMWARE);
732 }
733 else if (isSW08())
734 {
735 return (v == SW08B_LATEST_FIRMWARE);
736 }
737 else
738 {
739 return (v == SW4B_LATEST_FIRMWARE);
740
741 }
742 }
743
753 uint16_t readPublicData(uint8_t pin)
754 {
755 uint8_t tx[] = { 0x81,pin,255,255,0x55,0x55,0x55,0x55 };
756 uint8_t rx[8];
757 sendPacket(tx, rx);
758 return(rx[2] + (uint16_t)rx[3] * 256);
759 }
760
771 {
772 return (readPublicData((uint8_t)dataSource));
773 }
774
780 uint16_t writePublicData(uint8_t pin, uint16_t value)
781 {
782 uint8_t tx[] = { 0x82,pin,(uint8_t)(value & 0xFF),(uint8_t)(value >> 8) ,255,0x55,0x55,0x55 };
783 uint8_t rx[8];
784 sendPacket(tx, rx);
785 return (rx[2] + rx[3] * 256);
786 }
787
788 uint32_t comparePublicDataToThreshold(uint16_t threshold = 0)
789 {
790 uint8_t tx[] = { (uint8_t) SerialWombatCommands::COMMAND_BINARY_PIN_POLL_THRESHOLD,SW_LE16(threshold) ,0x55, 0x55,0x55,0x55,0x55 };
791 uint8_t rx[8];
792 sendPacket(tx, rx);
793 return (ARRAY_UINT32(rx,1));
794 }
795
805
806 uint16_t readSupplyVoltage_mV(void)
807 {
808 if (isSW18() || isSW08())
809 {
811 }
812 else
813 {
814 int32_t counts = readPublicData(66); // Get FVR counts (1.024 v)
815 if (counts > 0)
816 {
817 uint32_t mv = 1024 * 65536 / counts;
818 _supplyVoltagemV = (uint16_t)mv;
819 }
820 else
821 {
823 }
824 }
825 return(_supplyVoltagemV);
826 }
827
828
840 {
841 if (isSW18())
842 {
843 int32_t result = readPublicData(70);
844 if (result >= 32768)
845 {
846 result = result - 65536;
847 }
848 return ((int16_t)result);
849 }
850 else
851 {
852 return 2500;
853 }
854 }
855
863 {
864 uint8_t tx[9] = "ReSeT!#*";
866 }
867
876 void pinMode(uint8_t pin, uint8_t mode, bool pullDown = false, bool openDrain = false)
877 {
878 if (pin >= WOMBAT_MAXIMUM_PINS)
879 {
880 return;
881 }
882 _pullDown[pin] = pullDown;
883 _openDrain[pin] = openDrain;
884 _pinmode[pin] = mode;
885 configureDigitalPin(pin, mode);
886 }
887
895 void digitalWrite(uint8_t pin, uint8_t val)
896 {
897 configureDigitalPin(pin, val);
898 }
899
905 int digitalRead(uint8_t pin)
906 {
907 if (readPublicData(pin) > 0)
908 {
909 return (HIGH);
910 }
911 else
912 {
913 return (LOW);
914 }
915 }
916
926 int analogRead(uint8_t pin)
927 {
928 uint8_t tx[] = { 200,pin,PIN_MODE_ANALOGINPUT,0,0,0,0,0 };
929 uint8_t rx[8];
930 sendPacket(tx, rx);
931 return (readPublicData(pin) >> 6); // Scale from 16 bit value to 10 bit value.
932 }
933
945 void analogWrite(uint8_t pin, int val)
946 {
947 uint8_t dutyCycleLow = 0;
948 if (val == 255)
949 {
950 dutyCycleLow = 255;
951 }
952 uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_MODE0,pin,PIN_MODE_PWM,pin,dutyCycleLow,(uint8_t) val,false,0x55 };
953 uint8_t rx[8];
954 sendPacket(tx, rx);
955 }
956
968 {
969 uint8_t tx[8] = { 'V',0x55,0x55,0x55,0x55,0x55,0x55,0x55 };
970 uint8_t rx[8];
971 sendPacket(tx, rx);
972 if (rx[0] == 'V' && (rx[1] == 'S' || rx[1] == 'B'))
973 {
974 model[0] = rx[1];
975 model[1] = rx[2];
976 model[2] = rx[3];
977 model[3] = 0;
978 fwVersion[0] = rx[5];
979 fwVersion[1] = rx[6];
980 fwVersion[2] = rx[7];
981 fwVersion[3] = 0;
982
983 inBoot = (rx[1] == 'B');
984 return (true);
985 }
986 return (false);
987 }
988
996 {
997 uint8_t tx[8] = { 0x81,67,68,0x55,0x55,0x55,0x55,0x55 };
998 uint8_t rx[8];
999 sendPacket(tx, rx);
1000 uint32_t returnval = rx[2] + (((uint32_t)rx[3]) << 8) + (((uint32_t)rx[4]) << 16) + (((uint32_t)rx[5]) << 24);
1001 return (returnval);
1002 }
1003
1011
1013 {
1014 return readPublicData(69);
1015 }
1016
1027 {
1028 uint8_t tx[] = "BoOtLoAd";
1029 sendPacket(tx);
1030 }
1031
1052 uint8_t readRamAddress(uint16_t address)
1053 {
1054 uint8_t tx[8] = { 0xA0,SW_LE16(address),0x55,0x55,0x55,0x55,0x55 };
1055 uint8_t rx[8];
1056 sendPacket(tx, rx);
1057 return(rx[3]);
1058 }
1059
1079
1080 int16_t writeRamAddress(uint16_t address, uint8_t value)
1081 {
1082 uint8_t tx[8] = { 0xA3,SW_LE16(address),0,0,value,0x55,0x55};
1083 return sendPacket(tx);
1084 }
1085
1100
1101 uint32_t readFlashAddress(uint32_t address)
1102 {
1103 uint8_t tx[8] = { 0xA1,SW_LE32(address),0x55,0x55,0x55 };
1104 uint8_t rx[8];
1105 sendPacket(tx, rx);
1106 return(((uint32_t)rx[4]) + (((uint32_t)rx[5]) <<8) + (((uint32_t)rx[6]) <<16) + (((uint32_t)rx[7]) <<24));
1107 }
1108
1120 int16_t readUserBuffer(uint16_t index, uint8_t* buffer, uint16_t count)
1121 {
1122 uint16_t bytesRead = 0;
1123 while (bytesRead < count)
1124 {
1125 byte tx[] = {(byte)SerialWombatCommands::COMMAND_BINARY_READ_USER_BUFFER, (byte)(index & 0xFF), (byte)(index >> 8), 0x55, 0x55, 0x55, 0x55, 0x55};
1126 byte rx[8];
1127 int16_t result = sendPacket(tx, rx);
1128 if (result >= 0)
1129 {
1130 for (int i = 1; i < 8; ++i)
1131 {
1132 buffer[bytesRead] = rx[i];
1133 ++bytesRead;
1134 ++index;
1135 if (bytesRead >= count)
1136 {
1137 break;
1138 }
1139 }
1140 }
1141 else
1142 {
1143 return (bytesRead);
1144 }
1145 }
1146 return (bytesRead);
1147 }
1148
1158 void sleep()
1159 {
1160 uint8_t tx[8] = { 'S','l','E','e','P','!','#','*'};
1161 sendPacket(tx);
1162 _asleep = true;
1163 }
1164
1166 void wake()
1167 {
1168 uint8_t tx[8] = { '!','!','!','!','!','!','!','!' };
1169 sendPacket(tx);
1170 }
1171
1173 bool isSW04()
1174 {
1175 return ( model[1] == '0' && model[2] == '4');
1176 }
1177
1178
1180 bool isSW18()
1181 {
1182 return ( model[1] == '1' && model[2] == '8');
1183 }
1184
1185 bool isSW08()
1186 {
1187 return ( model[1] == '0' && model[2] == '8');
1188 }
1189
1199
1205 {
1206 if (isSW04())
1207 {
1208 switch (pinMode)
1209 {
1210 case PIN_MODE_DIGITALIO:
1213 case PIN_MODE_SERVO:
1214 case PIN_MODE_PWM:
1215 case PIN_MODE_DEBOUNCE:
1217 case PIN_MODE_WATCHDOG:
1220 return true;
1221
1222 default:
1223 return false;
1224 }
1225 }
1226
1227 uint8_t tx[8] = {(uint8_t)SerialWombatCommands::CONFIGURE_CHANNEL_MODE_CHECK_MODE_SUPPORTED, 1, (uint8_t)pinMode, 0x55, 0x55, 0x55, 0x55, 0x55};
1228 int16_t returnVal = sendPacket(tx);
1229 returnVal *= -1;
1230 return (returnVal != SW_ERROR_UNKNOWN_PIN_MODE);
1231 }
1232
1233
1234
1235
1237 int16_t eraseFlashPage(uint32_t address)
1238 {
1239 uint8_t tx[8] = { (uint8_t)SerialWombatCommands::COMMAND_BINARY_WRITE_FLASH,
1240 0, //Erase Page
1242 0x55,0x55 };
1243 return sendPacket(tx);
1244 }
1245
1246
1248 int16_t writeFlashRow(uint32_t address)
1249 {
1250 uint8_t tx[8] = { (uint8_t)SerialWombatCommands::COMMAND_BINARY_WRITE_FLASH,
1251 1, // Write entire row
1252 SW_LE32(address),0x55,0x55 };
1253 return sendPacket(tx);
1254 }
1255
1256
1257
1258
1268 int16_t setThroughputPin(uint8_t pin)
1269 {
1270 uint8_t tx[8] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_MODE0,pin,PIN_MODE_FRAME_TIMER,0x55,0x55,0x55,0x55,0x55 };
1271 return sendPacket(tx);
1272 }
1273
1287 int16_t setThroughputPin(uint32_t address)
1288 {
1289 uint8_t tx[8] = { (uint8_t)SerialWombatCommands::COMMAND_BINARY_SET_ADDRESS,SW_LE32(address),0x55,0x55,0x55 };
1290 return sendPacket(tx);
1291 }
1292
1300 int writeUserBuffer(uint16_t index, uint8_t* buffer, uint16_t count)
1301 {
1302 uint16_t bytesSent = 0;
1303 if (count == 0)
1304 {
1305 return 0;
1306 }
1307
1308 { // Send first packet of up to 4 bytes
1309 uint8_t bytesToSend = 4;
1310 if (count < 4)
1311 {
1312 bytesToSend = (uint8_t)count;
1313 count = 0;
1314 }
1315 else
1316 {
1317 count -= 4;
1318 }
1319
1320 uint8_t tx[8] = { 0x84,SW_LE16(index), bytesToSend,0x55,0x55,0x55,0x55 };
1321 uint8_t rx[8];
1322
1323 uint8_t i;
1324 for (i = 0; i < bytesToSend; ++i)
1325 {
1326 tx[4 + i] = buffer[i];
1327 }
1328 int result = sendPacket(tx, rx);
1329 if (rx[0] == 'E')
1330 {
1331 return (result);
1332 }
1333 bytesSent = bytesToSend;
1334 }
1335 while (count >= 7) // Continue sending
1336 {
1337
1338 count -= 7;
1339 uint8_t tx[8] = { 0x85,0x55,0x55,0x55,0x55,0x55,0x55,0x55 };
1340 uint8_t rx[8];
1341 uint8_t i;
1342 for (i = 0; i < 7; ++i)
1343 {
1344 tx[1 + i] = buffer[bytesSent + i];
1345 }
1346 int result = sendPacket(tx, rx);
1347 if (rx[0] == 'E')
1348 {
1349 return (result);
1350 }
1351 bytesSent += 7;
1352 }
1353 while (count > 0)
1354 {
1355
1356 { // Send first packet of up to 4 bytes
1357 uint8_t bytesToSend = 4;
1358 if (count < 4)
1359 {
1360 bytesToSend = (uint8_t)count;
1361 count = 0;
1362 }
1363 else
1364 {
1365 count -= 4;
1366 }
1367
1368 uint8_t tx[8] = { 0x84,SW_LE16(index + bytesSent), bytesToSend,0x55,0x55,0x55,0x55 };
1369 uint8_t rx[8];
1370
1371 uint8_t i;
1372 for (i = 0; i < bytesToSend; ++i)
1373 {
1374 tx[4 + i] = buffer[i + bytesSent];
1375 }
1376 int result = sendPacket(tx, rx);
1377 if (rx[0] == 'E')
1378 {
1379 return (result);
1380 }
1381 bytesSent += bytesToSend;
1382 }
1383 }
1384 return(bytesSent);
1385
1386
1387 }
1388
1395 int writeUserBuffer(uint16_t index, char* s)
1396 {
1397 return writeUserBuffer(index, (uint8_t*)s, (uint16_t)strlen(s));
1398 }
1399
1406 int writeUserBuffer(uint16_t index, const char s[])
1407 {
1408 return writeUserBuffer(index, (uint8_t*)s, (uint16_t)strlen(s));
1409 }
1410
1411
1412
1424 int16_t writeFrameTimerPin(uint8_t pin)
1425{
1426 uint8_t tx[] = { 0xC8 ,pin,(uint8_t)PIN_MODE_FRAME_TIMER,0x55,0x55,0x55,0x55,0x55 };
1427 return sendPacket(tx);
1428}
1429
1430
1438 static uint8_t find(bool keepTrying = false)
1439 {
1440 do
1441 {
1442 for (int i2cAddress = 0x60; i2cAddress <= 0x6F; ++i2cAddress)
1443 {
1444 Wire.beginTransmission(i2cAddress);
1445 int error = Wire.endTransmission();
1446
1447
1448 if (error == 0)
1449 {
1450 uint8_t tx[8] = { 'V',0x55,0x55,0x55,0x55,0x55,0x55,0x55 };
1451 uint8_t rx[8];
1452 Wire.beginTransmission(i2cAddress);
1453 Wire.write(tx, 8);
1454 Wire.endTransmission();
1455 Wire.requestFrom((uint8_t)i2cAddress, (uint8_t)8);
1456
1457 int count = 0;
1458 while (Wire.available() && count < 8)
1459 {
1460 rx[count] = Wire.read();
1461 ++count;
1462 }
1463 if (count == 8)
1464 {
1465 if (rx[0] == 'V' && (rx[1] == 'S' || rx[1]=='B'))
1466 {
1467 return(i2cAddress); // Found one.
1468 }
1469 }
1470 }
1471 }
1472 delay(0);
1473 }while (keepTrying);
1474 return(0); // Didn't find one.
1475 }
1476
1477
1484 int16_t readLastErrorCommand(uint8_t* cmd)
1485{
1486
1487 uint8_t tx[8] = { (uint8_t)SerialWombatCommands::COMMAND_READ_LAST_ERROR_PACKET, 0,0x55,0x55,0x55,0x55,0x55,0x55 };
1488 uint8_t rx[8];
1489 if (sendPacket(tx, rx) >= 0)
1490 {
1491 for (int i = 1; i < 8; ++i)
1492 {
1493 cmd[i - 1] = rx[i];
1494 }
1495 }
1496 else
1497 {
1498 return (lastErrorCode);
1499 }
1500 tx[1] = 7;
1501 if (sendPacket(tx, rx) >= 0)
1502 {
1503 cmd[7] = rx[1];
1504 }
1505 return(lastErrorCode);
1506}
1507
1513 {
1514 errorHandler = handler;
1515 }
1516
1518 uint8_t address = 0;
1519
1522
1529 int16_t echo(uint8_t data[], uint8_t count = 7)
1530 {
1531 uint8_t tx[] = "!UUUUUUU";
1532 for (int i = 0; i < 7 && i < count; ++i)
1533 {
1534 tx[i + 1] = (uint8_t)data[i];
1535 }
1536 return sendPacket(tx);
1537 }
1538
1544
1545 int16_t echo(char* data)
1546 {
1547 int length = strlen(data);
1548 uint8_t tx[] = "!UUUUUUU";
1549 for (int i = 0; i < 7 && i < length; ++i)
1550 {
1551 tx[i + 1] = (uint8_t)data[i];
1552 }
1553 return sendPacket(tx);
1554 }
1555
1560 uint32_t readBirthday()
1561 {
1562 if (isSW18())
1563 {
1564 uint32_t birthday = (readFlashAddress(0x2A00C) >> 8) & 0xFF;
1565 birthday *= 100;
1566 birthday += (readFlashAddress(0x2A00C)) & 0xFF;
1567 birthday *= 100;
1568 birthday += readFlashAddress(0x2A00E) & 0xFF;
1569 birthday *= 100;
1570 birthday += readFlashAddress(0x2A010) & 0xFF;
1571 return (birthday);
1572 }
1573 return 0;
1574 }
1575
1580 int16_t readBrand(char* data)
1581 {
1582 uint8_t length = 0;
1583 if (isSW18())
1584 {
1585 for (int i = 0; i < 32; ++i)
1586 {
1587 uint32_t val = readFlashAddress(0x2A020 + i * 2) ;
1588 if ((val & 0xFF) != 0xFF)
1589 {
1590 data[i ] = (char)(val & 0xFF);
1591 ++length;
1592 }
1593 else
1594 {
1595 data[length] = 0;
1596 return (length);
1597 }
1598 }
1599 data[length] = 0;
1600 return (length);
1601 }
1602
1603 data[0] = 0;
1604 return 0 ;
1605 }
1606
1607};
1608
1623{
1624private:
1625 SerialWombatChip& _sw;
1626 uint32_t lastMillis = 0;
1627 uint32_t lastFrames = 0;
1628public:
1633 SerialWombat18ABOscillatorTuner(SerialWombatChip& serialWombatChip) : _sw(serialWombatChip) { }
1634
1638 void update() {
1639 uint32_t m = millis();
1640 if (lastMillis == 0)
1641 {
1642 lastMillis = m;
1643 uint32_t frames = _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_MSW);
1644 uint16_t frameslsb = _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_LSW);
1645 if (frames != _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_MSW))
1646 {
1647 frameslsb = _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_LSW);
1648 frames = _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_MSW);
1649 }
1650 frames <<= 16;
1651 frames += frameslsb;
1652 lastFrames = frames;
1653
1654 }
1655 else if ((m - lastMillis) < 10000)
1656 {
1657 //Do nothing
1658 }
1659 else if (m < lastMillis)
1660 {
1661 //Has it been 47 days already?
1662 lastMillis = 0;
1663 }
1664 else
1665 {
1666 uint32_t diff = m - lastMillis;
1667
1668 uint32_t frames = _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_MSW);
1669 uint16_t frameslsb = _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_LSW);
1670
1671 if (frames != _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_MSW))
1672 {
1673 frameslsb = _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_LSW);
1674 frames = _sw.readPublicData(SerialWombatDataSource::SW_DATA_SOURCE_FRAMES_RUN_MSW);
1675 }
1676 frames <<= 16;
1677 frames += frameslsb;
1678 uint32_t framesDif = frames - lastFrames;
1679
1680 if (diff > framesDif )
1681 {
1682 // Running slow
1683 uint8_t tx[] = { (uint8_t)SerialWombatCommands::COMMAND_ADJUST_FREQUENCY,
1684 SW_LE16(1),//Counts to increment
1685 SW_LE16(0), // Counts to decrement
1686 0x55,0x55,0x55};
1687 _sw.sendPacket(tx);
1688 }
1689 else if (diff < framesDif)
1690 {
1691 // Running mfast
1692 uint8_t tx[] = { (uint8_t)SerialWombatCommands::COMMAND_ADJUST_FREQUENCY,
1693 SW_LE16(0),//Counts to increment
1694 SW_LE16(1), // Counts to decrement
1695 0x55,0x55,0x55 };
1696 _sw.sendPacket(tx);
1697
1698 }
1699
1700 lastMillis = m;
1701 lastFrames = frames;
1702
1703 }
1704
1705 }
1706
1707};
1708
1709/*
1710End of cross platform code synchronization. Random string to help the compare tool sync lines:
1711asdkj38vjn1nasdnvuwlamafdjiivnowalskive
1712*/
1713
1716
1717
1718
1719
1720
1729
1738
1739#include "SerialWombatPin.h"
1740#include "SerialWombatQueue.h"
1745#include "SerialWombatBlink.h"
1746#include "SerialWombat18CapTouch.h"
1747#include "SerialWombat18ABVGA.h"
1751#include "SerialWombatHBridge.h"
1752#include "SerialWombatHSClock.h"
1753#include "SerialWombatHSCounter.h"
1754#include "SerialWombatIRRx.h"
1761#include "SerialWombatPulseTimer.h"
1762#include "SerialWombatPWM.h"
1763#include "SerialWombatQuadEnc.h"
1766#include "SerialWombatServo.h"
1767#include "SerialWombatTM1637.h"
1768#include "SerialWombatUART.h"
1770#include "SerialWombatWatchdog.h"
1771#include "SerialWombatWS2812.h"
1773#include "PCB0030_Bridge.h"
1774#include "PCB0031_Grip.h"
1775
1776#endif
#define INPUT
#define SW18AB_LATEST_FIRMWARE
#define WOMBAT_MAXIMUM_PINS
void SerialWombatSerialErrorHandlerBrief(uint16_t error, SerialWombatChip *sw)
a sample error handler that can be registered with registerErrorHandler to report protocol errors on ...
#define SW_LE16(_a)
Convert a uint16_t to two bytes in little endian format for array initialization.
SerialWombatCommands
@ COMMAND_CAPTURE_STARTUP_SEQUENCE
(0xB6)
@ COMMAND_BINARY_WRITE_FLASH
(0xA4)
@ COMMAND_BINARY_READ_USER_BUFFER
(0x83)
@ COMMAND_BINARY_QUEUE_INFORMATION
(0x94)
@ COMMAND_BINARY_QUEUE_INITIALIZE
(0x90)
@ COMMAND_BINARY_SET_PIN_BUFFFER
(0x82)
@ COMMAND_ENABLE_2ND_UART
(0xA6)
@ COMMAND_UART1_RX_7BYTES
(0xB3)
@ COMMAND_ADJUST_FREQUENCY
(0xB7)
@ COMMAND_BINARY_WRITE_USER_BUFFER
(0x84)
@ CONFIGURE_PIN_MODE_DISABLE
(219)
@ COMMAND_BINARY_QUEUE_CLONE
(0x95)
@ COMMAND_BINARY_QUEUE_ADD_BYTES
(0x91)
@ COMMAND_BINARY_READ_EEPROM
(0xA2)
@ COMMAND_BINARY_QUEUE_ADD_7BYTES
(0x92)
@ COMMAND_UART0_TX_7BYTES
(0xB0)
@ COMMAND_BINARY_QUEUE_READ_BYTES
(0x93)
@ COMMAND_BINARY_SET_ADDRESS
(0xB9)
@ CONFIGURE_PIN_INPUTPROCESS
(211)
@ CONFIGURE_CHANNEL_MODE_CHECK_MODE_SUPPORTED
(218)
@ COMMAND_BINARY_WRITE_USER_BUFFER_CONTINUE
(0x85)
@ COMMAND_BINARY_CONFIG_DATALOGGER
(0x96)
@ COMMAND_UART1_TX_7BYTES
(0xB2)
@ COMMAND_UART0_RX_7BYTES
(0xB1)
@ COMMAND_BINARY_RW_PIN_MEMORY
(0xB5)
@ COMMAND_READ_LAST_ERROR_PACKET
(0xA7)
@ COMMAND_BINARY_WRITE_RAM
(0xA3)
@ COMMAND_BINARY_READ_RAM
(0xA0)
@ COMMAND_BINARY_TEST_SEQUENCE
(0xB4)
@ CONFIGURE_CHANNEL_MODE_HW_2
(222)
@ COMMAND_BINARY_READ_PIN_BUFFFER
(0x81)
@ CONFIGURE_CHANNEL_MODE_HW_1
(221)
@ COMMAND_BINARY_READ_FLASH
(0xA1)
@ CONFIGURE_CHANNEL_MODE_HW_3
(223)
@ COMMAND_CALIBRATE_ANALOG
(0xA5)
@ COMMAND_BINARY_PIN_POLL_THRESHOLD
(0x8F)
@ COMMAND_BINARY_CONFIGURE
(0x9F)
#define SW08B_LATEST_FIRMWARE
#define SW_LE32(_a)
Convert a uint32_t to four bytes in little endian format for array initialization.
#define SW4B_LATEST_FIRMWARE
SerialWombatPinMode_t
@ PIN_MODE_PULSE_ON_CHANGE
(25)
@ PIN_MODE_FRAME_TIMER
(21)
@ PIN_MODE_UNKNOWN
(0xFF)
@ PIN_MODE_TM1637
(11)
@ PIN_MODE_PULSETIMER
(18)
@ PIN_MODE_PS2KEYBOARD
(32)
@ PIN_MODE_FREQUENCY_OUTPUT
(36)
@ PIN_MODE_HS_SERVO
(26)
@ PIN_MODE_CONTROLLED
(1)
@ PIN_MODE_QUEUED_PULSE_OUTPUT
(34)
@ PIN_MODE_HBRIDGE
(6)
@ PIN_MODE_SW18AB_CAPTOUCH
(22)
@ PIN_MODE_LIQUIDCRYSTAL
(28)
@ PIN_MODE_IRRX
(37)
@ PIN_MODE_QUADRATUREENCODER
(5)
@ PIN_MODE_UART_RX_TX
(17)
@ PIN_MODE_WATCHDOG
(7)
@ PIN_MODE_HS_COUNTER
< (29)
@ PIN_MODE_PROTECTED_OUTPUT
(8)
@ PIN_MODE_ANALOGINPUT
(2)
@ PIN_MODE_UART1_RX_TX
(23)
@ PIN_MODE_I2C_CONTROLLER
(33)
@ PIN_MODE_PWM
(16)
@ PIN_MODE_RESISTANCEINPUT
(24)
@ PIN_MODE_DEBOUNCE
(10)
@ PIN_MODE_BLINK
(40)
@ PIN_MODE_INPUT_PROCESSOR
(14)
@ PIN_MODE_ULTRASONIC_DISTANCE
(27)
@ PIN_MODE_HS_CLOCK
@ PIN_MODE_SERVO
(3)
@ PIN_MODE_DIGITALIO
(0)
@ PIN_MODE_THROUGHPUT_CONSUMER
(4)
@ PIN_MODE_MATRIX_KEYPAD
(15)
@ PIN_MODE_SW_UART
(13)
@ PIN_MODE_VGA
(31)
@ PIN_MODE_WS2812
(12)
void SerialWombatSerialErrorHandlerVerbose(uint16_t error, SerialWombatChip *sw)
a sample error handler that can be registered with registerErrorHandler to report protocol errors on ...
SerialWombatDataSource
A list of Serial Wombat public data sources.
@ SW_DATA_SOURCE_PIN_10
(10) 16 bit public data provided by Pin 10
@ SW_DATA_SOURCE_VBG_COUNTS_VS_VREF
(76) A/D conversion of VBG against VRef . Used for mfg calibration
@ SW_DATA_SOURCE_PIN_5
(5) 16 bit public data provided by Pin 5
@ SW_DATA_SOURCE_PIN_14
(14) 16 bit public data provided by Pin 14
@ SW_DATA_SOURCE_PIN_13
(13) 16 bit public data provided by Pin 13
@ SW_DATA_SOURCE_1024mvCounts
(66) The number of ADC counts that result from a 1.024V reading
@ SW_DATA_SOURCE_TEMPERATURE
(70)The internal core temperature expressed in 100ths deg C
@ SW_DATA_SOURCE_PIN_1
(1) 16 bit public data provided by Pin 1
@ SW_DATA_SOURCE_FRAMES_RUN_LSW
(67) The number of frames run since reset, least significant 16 bits
@ SW_DATA_SOURCE_VCC_mVOLTS
(75) The system source voltage in mV
@ SW_DATA_SOURCE_PIN_11
(11) 16 bit public data provided by Pin 11
@ SW_DATA_SOURCE_8SEC_SAW
(174)Sawtooth wave that goes from 0 to 65535 to 0 every 8192 frames
@ SW_DATA_SOURCE_PIN_4_MV
(104) Pin 4 public output expressed in mV (for analog modes only)
@ SW_DATA_SOURCE_PIN_6
(6) 16 bit public data provided by Pin 6
@ SW_DATA_SOURCE_PIN_15
(15) 16 bit public data provided by Pin 15
@ SW_DATA_SOURCE_LFSR
A Linear FeedBack Shift register (32,7,5,3,2,1) based pseudo-random number generator.
@ SW_DATA_SOURCE_OVERRUN_FRAMES
(69) The number of frames that ran more than 1mS
@ SW_DATA_SOURCE_PIN_9
(9) 16 bit public data provided by Pin 9
@ SW_DATA_SOURCE_PIN_12
(12) 16 bit public data provided by Pin 12
@ SW_DATA_SOURCE_PIN_3_MV
(103) Pin 3 public output expressed in mV (for analog modes only)
@ SW_DATA_SOURCE_PIN_8
(8) 16 bit public data provided by Pin 8
@ SW_DATA_SOURCE_PIN_18
(18) 16 bit public data provided by Pin 18
@ SW_DATA_SOURCE_8SEC_SQUARE
(173)Square wave that alternates between 0 and 65535 every 4096 frames
@ SW_DATA_SOURCE_0x55
(85) 0x55 is a reserved value for resyncing. Returns 0x55 0x55
@ SW_DATA_SOURCE_RESET_REGISTER
Hardware dependent reset reason register contents.
@ SW_DATA_SOURCE_2SEC_SQUARE
(170)Square wave that alternates between 0 and 65535 every 1024 frames
@ SW_DATA_COM_ADDRESS_LOW
The Communications Address of the Device (Lower 16 bits)
@ SW_DATA_SOURCE_PIN_18_MV
(118) Pin 18 public output expressed in mV (for analog modes only)
@ SW_DATA_COM_ADDRESS_HIGH
The Communications Address of the Device (HIGHER 16 bits) Anticipated for CAN ID.
@ SW_DATA_SOURCE_ERRORS
(72)The number of incoming packets that have caused errors since reset (rolls over at 65535)
@ SW_DATA_SOURCE_PIN_0_MV
(100) Pin 0 public output expressed in mV (for analog modes only)
@ SW_DATA_SOURCE_PIN_4
(4) 16 bit public data provided by Pin 4
@ SW_DATA_SOURCE_SYSTEM_UTILIZATION
(74) A number between 0 and 65535 that scales to the average length of pin processing frames between ...
@ SW_DATA_SOURCE_PACKETS_RECEIVED
(71) The nubmer of incoming command packets that have been processed since reset (rolls over at 65535...
@ SW_DATA_SOURCE_1HZ_SQUARE
(167) Square wave that alternates between 0 and 65535 every 512 frames
@ SW_DATA_SOURCE_2SEC_SAW
(171)Sawtooth wave that goes from 0 to 65535 to 0 every 2048 frames
@ SW_DATA_SOURCE_PIN_17_MV
(117) Pin 17 public output expressed in mV (for analog modes only)
@ SW_DATA_SOURCE_PIN_1_MV
(101) Pin 1 public output expressed in mV (for analog modes only)
@ SW_DATA_SOURCE_DROPPED_FRAMES
(73) The number of times since reset that a frame ran so far behind that it crossed two subsequent 1m...
@ SW_DATA_SOURCE_PIN_16_MV
(116) Pin 16 public output expressed in mV (for analog modes only)
@ SW_DATA_SOURCE_PIN_0
(0) 16 bit public data provided by Pin 0
@ SW_DATA_SOURCE_PIN_2
(2) 16 bit public data provided by Pin 2
@ SW_DATA_SOURCE_PIN_2_MV
(102) Pin 2 public output expressed in mV (for analog modes only)
@ SW_DATA_SOURCE_PIN_16
(16) 16 bit public data provided by Pin 16
@ SW_DATA_SOURCE_1HZ_SAW
(168) Sawtooth wave that goes from 0 to 65535 to 0 every 1024 frames
@ SW_DATA_SOURCE_PIN_19_MV
(119) Pin 19 public output expressed in mV (for analog modes only)
@ SW_DATA_SOURCE_PIN_7
(7) 16 bit public data provided by Pin 7
@ SW_DATA_SOURCE_FRAMES_RUN_MSW
(68) The number of frames run since reset, most significant 16 bits
@ SW_DATA_SOURCE_INCREMENTING_NUMBER
(65) An number that increments each time it is accessed.
@ SW_DATA_SOURCE_PIN_19
(19) 16 bit public data provided by Pin 19
@ SW_DATA_SOURCE_2HZ_SAW
(165) Sawtooth wave that goes from 0 to 65535 to 0 every 512 frames
@ SW_DATA_SOURCE_PIN_17
(17) 16 bit public data provided by Pin 17
@ SW_DATA_SOURCE_PIN_3
(3) 16 bit public data provided by Pin 3
@ SW_DATA_SOURCE_65SEC_SAW
(177 )Sawtooth wave that goes from 0 to 65535 to 0 every 65536 frames
@ SW_DATA_SOURCE_NONE
(255 ) Used to mean "No Source Selected"
@ SW_DATA_SOURCE_2HZ_SQUARE
(164) Square wave that alternates between 0 and 65535 every 256 frames
@ SW_DATA_SOURCE_65SEC_SQUARE
(176) Square wave that alternates between 0 and 65535 every 32768 frames
#define ARRAY_UINT32(_array, _index)
void(* SerialWombatErrorHandler_t)(uint16_t errorNumber, SerialWombatChip *sw)
SerialWombatPinState_t
@ SW_INPUT
@ SW_HIGH
@ SW_LOW
@ SW_ERROR_UNKNOWN_PIN_MODE
(#3) A Pin mode was indicated that is not avaialble on this model or version of Serial Wombat chip
SerialWombat18ABOscillatorTuner(SerialWombatChip &serialWombatChip)
Class constructor for SerialWombat18OscillatorTuner.
void update()
Call periodically to tune the SW18AB oscillator to reported millis.
Class for a Serial Wombat chip. Each Serial Wombat chip on a project should have its own instance.
int16_t setThroughputPin(uint32_t address)
Set this chip Address (SW8B only)
uint8_t uniqueIdentifier[16]
bool isLatestFirmware(void)
Check if the firmware is the latest version (or more precisely, if the firmware matches this verison ...
uint8_t address
The I2C address of the SerialWombatChip instance.
uint16_t deviceRevision
void wake()
Called to send a dummy packet to the Serial Wombat chip to wake it from sleep and ready it for other ...
uint32_t sendReadyTime
Used as a countdown after a reset command is issued.
uint8_t uniqueIdentifierLength
bool isSW04()
Returns true if the instance received a model number corresponding to the Serial Wombat 18 series of ...
uint32_t comparePublicDataToThreshold(uint16_t threshold=0)
int16_t echo(uint8_t data[], uint8_t count=7)
Echo a byte array back to the host. Used for testing and debugging.
void digitalWrite(uint8_t pin, uint8_t val)
Set an output pin High or Low.
uint32_t readFlashAddress(uint32_t address)
Read Address from Flash based on 32 bit address.
bool inBoot
Set to true if boot mode is indicated by a version query.
bool isPinModeSupported(int pinMode)
Check if a specific pin mode is supported by the firmware in the Serial Wombat chip....
bool isPinModeSupported(SerialWombatPinMode_t pinMode)
Check if a specific pin mode is supported by the firmware in the Serial Wombat chip....
bool isSW08()
Returns true if the instance received a model number corresponding to the Serial Wombat 08 series of ...
void readUniqueIdentifier()
Read the unique identifier from the Serial Wombat chip and store it in uniqueIdentifier.
char * readVersion(void)
Request version string (combined model and firmware) and return pointer to it.
void configureDigitalPin(uint8_t pin, uint8_t highLow)
Configure a pin to a digital state with the same parameters as Arduino's digitalWrite() function.
uint16_t readPublicData(uint8_t pin)
Read the 16 Bit public data associated with a Serial Wombat Pin Mode.
uint8_t fwVersion[4]
Contains the last firmware Version retreived by queryVersion() as a zero-terminated string.
uint32_t readBirthday()
Read the birthday of the Serial Wombat 18AB chip.
uint8_t communicationErrorRetries
How many times to retry a packet if communcation bus (such as I2C) error.
int16_t echo(char *data)
Echo a byte array back to the host. Used for testing and debugging.
uint16_t readOverflowFrames()
Get the number of times an overflow Frame has occured.
static uint8_t find(bool keepTrying=false)
Search the I2C Bus addresses 0x68 to 0x6F for I2C devices, and test to see if they respond to Serial ...
void readDeviceIdentifier()
Read the device identifier from the Serial Wombat chip and store it in deviceIdentifier.
int writeUserBuffer(uint16_t index, uint8_t *buffer, uint16_t count)
Write bytes to the User Memory Buffer in the Serial Wombat chip.
int16_t readTemperature_100thsDegC(void)
Measure the Serial Wombat chip's internal temperature.
int sendPacketNoResponse(uint8_t tx[])
Send an 8 byte packet to the Serial Wombat chip, don't wait for a response.
uint8_t readRamAddress(uint16_t address)
Read Address from RAM based on 16 bit address.
int16_t readUserBuffer(uint16_t index, uint8_t *buffer, uint16_t count)
Read data from the Serial Wombat 18AB's internal RAM buffer.
bool isSW18()
Returns true if the instance received a model number corresponding to the Serial Wombat 18 series of ...
int16_t lastErrorCode
The last error code returned as part of a protocol error message expressed as a positive integer.
int16_t readBrand(char *data)
Read the brand of the Serial Wombat 18AB chip.
void pinMode(uint8_t pin, uint8_t mode, bool pullDown=false, bool openDrain=false)
Set a pin to INPUT or OUTPUT, with options for pull Ups and open Drain settings.
int16_t setThroughputPin(uint8_t pin)
Set a pin to be a throughput monitoring pin.
int16_t begin(HardwareSerial &serial, bool reset=true)
initialize a Serial Wombat chip to use a Serial Interface.
int sendPacket(uint8_t tx[], uint8_t rx[])
Send an 8 byte packet to the Serial Wombat chip and wait for 8 bytes back.
uint32_t readVersion_uint32(void)
Request version as a uint32.
uint16_t writePublicData(uint8_t pin, uint16_t value)
Write a 16 bit value to a Serial Wombat pin Mode.
uint16_t readSupplyVoltage_mV(void)
Measure the Serial Wombat chip's Supply voltage.
int16_t writeFlashRow(uint32_t address)
Writes a row in flash. Intended for use with the Bootloader, not by end users outside of bootloading ...
int writeUserBuffer(uint16_t index, char *s)
Write bytes to the User Memory Buffer in the Serial Wombat chip.
int16_t eraseFlashPage(uint32_t address)
Erases a page in flash. Intended for use with the Bootloader, not by end users outside of bootloading...
uint16_t returnErrorCode(uint8_t *rx)
Convert an ASCII Error code from a received packet into an integer error code.
uint16_t deviceIdentifier
int16_t writeRamAddress(uint16_t address, uint8_t value)
Write byte to Address in RAM based on 16 bit address.
int16_t initialize()
An internal function used to set up the Serial Wombat chip and this class. Call begin() instead of th...
int16_t writeFrameTimerPin(uint8_t pin)
Set a pin to be a frame timer for system utilization (SW18AB Only)
uint16_t _supplyVoltagemV
void registerErrorHandler(SerialWombatErrorHandler_t handler)
Registers an error handler that is called by the SerialWombatChip sendPacket() command when a protoco...
int16_t begin(TwoWire &wire, uint8_t i2cAddress, bool reset=true)
initialize a Serial Wombat chip to use a specified I2C Interface and address.
void analogWrite(uint8_t pin, int val)
Set a pin to PWM output.
uint16_t errorCount
Incremented every time a communication or command error is detected.
int writeUserBuffer(uint16_t index, const char s[])
Write bytes to the User Memory Buffer in the Serial Wombat chip.
int analogRead(uint8_t pin)
Configures pin as analog input and does an immediate A/D conversion.
uint16_t readPublicData(SerialWombatDataSource dataSource)
Read the 16 Bit public data associated with a Serial Wombat Pin Mode.
bool queryVersion()
Send a version request to the Serial Wombat chip.
void jumpToBoot()
Jump to Bootloader and wait for a UART download of new firmware.
int digitalRead(uint8_t pin)
Reads the state of a Pin.
void hardwareReset()
Send a reset command to the Serial Wombat chip.
uint8_t model[4]
Contains the last model retreived by queryVersion() as a zero-terminated string.
uint32_t readFramesExecuted()
Get the number of 1mS frames that have been executed since Serial Wombat chip reset.
int16_t readLastErrorCommand(uint8_t *cmd)
Returns the last Serial Wombat command that produced a protocol error.
void sleep()
Shuts down most functions of the Serial Wombat chip reducing power consumption.
This class name is depricated. Do not use for new development. Use SerialWombatChip instead.