From 2374891c3e46a7dd7c01518976205349b004142c Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Mon, 26 Dec 2016 18:28:23 -0800 Subject: [PATCH] Remove XBee support Even though it hasn't been supported forever, the files where still being compiled --- QGCExternalLibs.pri | 97 - libs/thirdParty/libxbee/LICENSE | 674 ----- libs/thirdParty/libxbee/README | 39 - libs/thirdParty/libxbee/api.c | 2433 ----------------- libs/thirdParty/libxbee/api.h | 254 -- .../libxbee/doc/man/man3/libxbee.3.html | 127 - .../libxbee/doc/man/man3/xbee_con.3.html | 26 - .../libxbee/doc/man/man3/xbee_end.3.html | 27 - .../libxbee/doc/man/man3/xbee_endcon.3.html | 4 - .../libxbee/doc/man/man3/xbee_flushcon.3.html | 4 - .../doc/man/man3/xbee_getanalog.3.html | 140 - .../doc/man/man3/xbee_getdigital.3.html | 134 - .../doc/man/man3/xbee_getpacket.3.html | 130 - .../doc/man/man3/xbee_hasanalog.3.html | 4 - .../doc/man/man3/xbee_hasdigital.3.html | 4 - .../libxbee/doc/man/man3/xbee_logit.3.html | 27 - .../libxbee/doc/man/man3/xbee_newcon.3.html | 201 -- .../doc/man/man3/xbee_nsenddata.3.html | 4 - .../libxbee/doc/man/man3/xbee_pkt.3.html | 107 - .../libxbee/doc/man/man3/xbee_senddata.3.html | 129 - .../libxbee/doc/man/man3/xbee_setup.3.html | 142 - .../libxbee/doc/man/man3/xbee_setupAPI.3.html | 4 - .../libxbee/doc/man/man3/xbee_setuplog.3.html | 4 - .../doc/man/man3/xbee_setuplogAPI.3.html | 4 - .../doc/man/man3/xbee_vsenddata.3.html | 4 - libs/thirdParty/libxbee/lib/libxbee.dll | Bin 151552 -> 0 bytes libs/thirdParty/libxbee/lib/libxbee.exp | Bin 7707 -> 0 bytes libs/thirdParty/libxbee/lib/libxbee.lib | Bin 12566 -> 0 bytes libs/thirdParty/libxbee/lib/libxbee.map | 897 ------ libs/thirdParty/libxbee/main.c | 229 -- libs/thirdParty/libxbee/makefile | 226 -- libs/thirdParty/libxbee/man/man3/libxbee.3 | 91 - libs/thirdParty/libxbee/man/man3/xbee_con.3 | 22 - libs/thirdParty/libxbee/man/man3/xbee_end.3 | 23 - .../thirdParty/libxbee/man/man3/xbee_endcon.3 | 1 - .../libxbee/man/man3/xbee_flushcon.3 | 1 - .../libxbee/man/man3/xbee_getanalog.3 | 96 - .../libxbee/man/man3/xbee_getdigital.3 | 91 - .../libxbee/man/man3/xbee_getpacket.3 | 88 - .../libxbee/man/man3/xbee_hasanalog.3 | 1 - .../libxbee/man/man3/xbee_hasdigital.3 | 1 - libs/thirdParty/libxbee/man/man3/xbee_logit.3 | 23 - .../thirdParty/libxbee/man/man3/xbee_newcon.3 | 152 - .../libxbee/man/man3/xbee_nsenddata.3 | 1 - libs/thirdParty/libxbee/man/man3/xbee_pkt.3 | 79 - .../libxbee/man/man3/xbee_purgecon.3 | 1 - .../libxbee/man/man3/xbee_senddata.3 | 86 - libs/thirdParty/libxbee/man/man3/xbee_setup.3 | 108 - .../libxbee/man/man3/xbee_setupAPI.3 | 1 - .../libxbee/man/man3/xbee_setuplog.3 | 1 - .../libxbee/man/man3/xbee_setuplogAPI.3 | 1 - .../libxbee/man/man3/xbee_vsenddata.3 | 1 - .../libxbee/notes/Notepad++ Style.xml | 36 - libs/thirdParty/libxbee/notes/v1-v2.txt | 29 - libs/thirdParty/libxbee/pdf/api.c.pdf | Bin 75665 -> 0 bytes libs/thirdParty/libxbee/pdf/api.h.pdf | Bin 11188 -> 0 bytes libs/thirdParty/libxbee/pdf/main.c.pdf | Bin 8923 -> 0 bytes libs/thirdParty/libxbee/pdf/xbee.h.pdf | Bin 11925 -> 0 bytes libs/thirdParty/libxbee/sample/README | 12 - libs/thirdParty/libxbee/sample/analog.c | 71 - libs/thirdParty/libxbee/sample/api.c | 42 - libs/thirdParty/libxbee/sample/atis.c | 81 - libs/thirdParty/libxbee/sample/atsetup.c | 157 -- libs/thirdParty/libxbee/sample/callback.c | 88 - libs/thirdParty/libxbee/sample/digital.c | 146 - libs/thirdParty/libxbee/sample/digitalout.c | 128 - libs/thirdParty/libxbee/sample/multi.c | 100 - libs/thirdParty/libxbee/sample/scan.c | 144 - libs/thirdParty/libxbee/sample/scan_adv.c | 589 ---- libs/thirdParty/libxbee/sample/simple.c | 68 - libs/thirdParty/libxbee/sample/talk_to_me.c | 82 - libs/thirdParty/libxbee/sample/vb6/README.txt | 8 - .../libxbee/sample/vb6/demo/Form1.frm | 64 - .../libxbee/sample/vb6/demo/demo.bas | 19 - .../libxbee/sample/vb6/demo/demo.vbp | 33 - .../thirdParty/libxbee/sample/vb6/libxbee.bas | 285 -- .../libxbee/sample/vb6/talk_to_me/Form1.frm | 1197 -------- .../sample/vb6/talk_to_me/talk_to_me.bas | 431 --- .../sample/vb6/talk_to_me/talk_to_me.vbp | 33 - libs/thirdParty/libxbee/sample/xbee2_rx.c | 60 - libs/thirdParty/libxbee/sample/xbee2_tx.c | 54 - libs/thirdParty/libxbee/umakefile | 91 - libs/thirdParty/libxbee/win32.README.txt | 31 - libs/thirdParty/libxbee/win32.makefile | 48 - libs/thirdParty/libxbee/xbee.h | 218 -- libs/thirdParty/libxbee/xsys/README | 1 - libs/thirdParty/libxbee/xsys/linux.c | 148 - libs/thirdParty/libxbee/xsys/linux.h | 57 - libs/thirdParty/libxbee/xsys/pdf/linux.c.pdf | Bin 8394 -> 0 bytes libs/thirdParty/libxbee/xsys/pdf/linux.h.pdf | Bin 5205 -> 0 bytes libs/thirdParty/libxbee/xsys/pdf/win32.c.pdf | Bin 14179 -> 0 bytes .../thirdParty/libxbee/xsys/pdf/win32.def.pdf | Bin 3538 -> 0 bytes .../libxbee/xsys/pdf/win32.dll.c.pdf | Bin 7893 -> 0 bytes libs/thirdParty/libxbee/xsys/pdf/win32.h.pdf | Bin 5959 -> 0 bytes libs/thirdParty/libxbee/xsys/pdf/win32.rc.pdf | Bin 4744 -> 0 bytes libs/thirdParty/libxbee/xsys/win32.c | 279 -- libs/thirdParty/libxbee/xsys/win32.def | 71 - libs/thirdParty/libxbee/xsys/win32.dll.c | 131 - libs/thirdParty/libxbee/xsys/win32.h | 73 - libs/thirdParty/libxbee/xsys/win32.rc | 47 - src/comm/HexSpinBox.cpp | 35 - src/comm/HexSpinBox.h | 25 - src/comm/LinkConfiguration.h | 6 - src/comm/XbeeLink.cpp | 239 -- src/comm/XbeeLink.h | 77 - src/comm/XbeeLinkInterface.h | 27 - src/ui/XbeeConfigurationWindow.cpp | 444 --- src/ui/XbeeConfigurationWindow.h | 62 - 108 files changed, 13011 deletions(-) delete mode 100644 libs/thirdParty/libxbee/LICENSE delete mode 100644 libs/thirdParty/libxbee/README delete mode 100644 libs/thirdParty/libxbee/api.c delete mode 100644 libs/thirdParty/libxbee/api.h delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/libxbee.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_con.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_end.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_endcon.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_flushcon.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_getanalog.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_getdigital.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_getpacket.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_hasanalog.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_hasdigital.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_logit.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_newcon.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_nsenddata.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_pkt.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_senddata.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_setup.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_setupAPI.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_setuplog.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_setuplogAPI.3.html delete mode 100644 libs/thirdParty/libxbee/doc/man/man3/xbee_vsenddata.3.html delete mode 100644 libs/thirdParty/libxbee/lib/libxbee.dll delete mode 100644 libs/thirdParty/libxbee/lib/libxbee.exp delete mode 100644 libs/thirdParty/libxbee/lib/libxbee.lib delete mode 100644 libs/thirdParty/libxbee/lib/libxbee.map delete mode 100644 libs/thirdParty/libxbee/main.c delete mode 100644 libs/thirdParty/libxbee/makefile delete mode 100644 libs/thirdParty/libxbee/man/man3/libxbee.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_con.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_end.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_endcon.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_flushcon.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_getanalog.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_getdigital.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_getpacket.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_hasanalog.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_hasdigital.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_logit.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_newcon.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_nsenddata.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_pkt.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_purgecon.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_senddata.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_setup.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_setupAPI.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_setuplog.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_setuplogAPI.3 delete mode 100644 libs/thirdParty/libxbee/man/man3/xbee_vsenddata.3 delete mode 100644 libs/thirdParty/libxbee/notes/Notepad++ Style.xml delete mode 100644 libs/thirdParty/libxbee/notes/v1-v2.txt delete mode 100644 libs/thirdParty/libxbee/pdf/api.c.pdf delete mode 100644 libs/thirdParty/libxbee/pdf/api.h.pdf delete mode 100644 libs/thirdParty/libxbee/pdf/main.c.pdf delete mode 100644 libs/thirdParty/libxbee/pdf/xbee.h.pdf delete mode 100644 libs/thirdParty/libxbee/sample/README delete mode 100644 libs/thirdParty/libxbee/sample/analog.c delete mode 100644 libs/thirdParty/libxbee/sample/api.c delete mode 100644 libs/thirdParty/libxbee/sample/atis.c delete mode 100644 libs/thirdParty/libxbee/sample/atsetup.c delete mode 100644 libs/thirdParty/libxbee/sample/callback.c delete mode 100644 libs/thirdParty/libxbee/sample/digital.c delete mode 100644 libs/thirdParty/libxbee/sample/digitalout.c delete mode 100644 libs/thirdParty/libxbee/sample/multi.c delete mode 100644 libs/thirdParty/libxbee/sample/scan.c delete mode 100644 libs/thirdParty/libxbee/sample/scan_adv.c delete mode 100644 libs/thirdParty/libxbee/sample/simple.c delete mode 100644 libs/thirdParty/libxbee/sample/talk_to_me.c delete mode 100644 libs/thirdParty/libxbee/sample/vb6/README.txt delete mode 100644 libs/thirdParty/libxbee/sample/vb6/demo/Form1.frm delete mode 100644 libs/thirdParty/libxbee/sample/vb6/demo/demo.bas delete mode 100644 libs/thirdParty/libxbee/sample/vb6/demo/demo.vbp delete mode 100644 libs/thirdParty/libxbee/sample/vb6/libxbee.bas delete mode 100644 libs/thirdParty/libxbee/sample/vb6/talk_to_me/Form1.frm delete mode 100644 libs/thirdParty/libxbee/sample/vb6/talk_to_me/talk_to_me.bas delete mode 100644 libs/thirdParty/libxbee/sample/vb6/talk_to_me/talk_to_me.vbp delete mode 100644 libs/thirdParty/libxbee/sample/xbee2_rx.c delete mode 100644 libs/thirdParty/libxbee/sample/xbee2_tx.c delete mode 100644 libs/thirdParty/libxbee/umakefile delete mode 100644 libs/thirdParty/libxbee/win32.README.txt delete mode 100644 libs/thirdParty/libxbee/win32.makefile delete mode 100644 libs/thirdParty/libxbee/xbee.h delete mode 100644 libs/thirdParty/libxbee/xsys/README delete mode 100644 libs/thirdParty/libxbee/xsys/linux.c delete mode 100644 libs/thirdParty/libxbee/xsys/linux.h delete mode 100644 libs/thirdParty/libxbee/xsys/pdf/linux.c.pdf delete mode 100644 libs/thirdParty/libxbee/xsys/pdf/linux.h.pdf delete mode 100644 libs/thirdParty/libxbee/xsys/pdf/win32.c.pdf delete mode 100644 libs/thirdParty/libxbee/xsys/pdf/win32.def.pdf delete mode 100644 libs/thirdParty/libxbee/xsys/pdf/win32.dll.c.pdf delete mode 100644 libs/thirdParty/libxbee/xsys/pdf/win32.h.pdf delete mode 100644 libs/thirdParty/libxbee/xsys/pdf/win32.rc.pdf delete mode 100644 libs/thirdParty/libxbee/xsys/win32.c delete mode 100644 libs/thirdParty/libxbee/xsys/win32.def delete mode 100644 libs/thirdParty/libxbee/xsys/win32.dll.c delete mode 100644 libs/thirdParty/libxbee/xsys/win32.h delete mode 100644 libs/thirdParty/libxbee/xsys/win32.rc delete mode 100644 src/comm/HexSpinBox.cpp delete mode 100644 src/comm/HexSpinBox.h delete mode 100644 src/comm/XbeeLink.cpp delete mode 100644 src/comm/XbeeLink.h delete mode 100644 src/comm/XbeeLinkInterface.h delete mode 100644 src/ui/XbeeConfigurationWindow.cpp delete mode 100644 src/ui/XbeeConfigurationWindow.h diff --git a/QGCExternalLibs.pri b/QGCExternalLibs.pri index 0f31a6e15..52e5de7fb 100644 --- a/QGCExternalLibs.pri +++ b/QGCExternalLibs.pri @@ -65,103 +65,6 @@ DEPENDPATH += libs/qwt INCLUDEPATH += libs/qwt } -# -# [OPTIONAL] XBee wireless support. This is not necessary for basic serial/UART communications. -# It's only required for speaking directly to the Xbee using their proprietary API. -# Unsupported on Mac. -# Installation on Windows is unnecessary, as we just link to our included .dlls directly. -# Installing on Linux involves running `make;sudo make install` in `libs/thirdParty/libxbee` -# Uninstalling from Linux can be done with `sudo make uninstall`. -# -XBEE_DEPENDENT_HEADERS += \ - src/comm/XbeeLinkInterface.h \ - src/comm/XbeeLink.h \ - src/comm/HexSpinBox.h \ - src/ui/XbeeConfigurationWindow.h \ - src/comm/CallConv.h -XBEE_DEPENDENT_SOURCES += \ - src/comm/XbeeLink.cpp \ - src/comm/HexSpinBox.cpp \ - src/ui/XbeeConfigurationWindow.cpp -XBEE_DEFINES = QGC_XBEE_ENABLED - -contains(DEFINES, DISABLE_XBEE) { - message("Skipping support for native XBee API (manual override from command line)") - DEFINES -= DISABLE_XBEE -# Otherwise the user can still disable this feature in the user_config.pri file. -} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_XBEE) { - message("Skipping support for native XBee API (manual override from user_config.pri)") -} else:LinuxBuild { - linux-g++-64 { - message("Skipping support for XBee API (64-bit Linux builds not supported)") - } else:exists(/usr/include/xbee.h) { - message("Including support for XBee API") - - HEADERS += $$XBEE_DEPENDENT_HEADERS - SOURCES += $$XBEE_DEPENDENT_SOURCES - DEFINES += $$XBEE_DEFINES - LIBS += -L/usr/lib -lxbee - } else { - warning("Skipping support for XBee API (missing libraries, see README)") - } -} else:WindowsBuild { - message("Including support for XBee API") - HEADERS += $$XBEE_DEPENDENT_HEADERS - SOURCES += $$XBEE_DEPENDENT_SOURCES - DEFINES += $$XBEE_DEFINES - INCLUDEPATH += libs/thirdParty/libxbee - LIBS += -l$$BASEDIR/libs/thirdParty/libxbee/lib/libxbee -} else { - message("Skipping support for XBee API (unsupported platform)") -} - -# -# [OPTIONAL] Opal RT-LAB Library. Provides integration with Opal-RT's RT-LAB simulator. -# -contains(DEFINES, DISABLE_RTLAB) { - message("Skipping support for RT-LAB (manual override from command line)") - DEFINES -= DISABLE_RTLAB -# Otherwise the user can still disable this feature in the user_config.pri file. -} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_RTLAB) { - message("Skipping support for RT-LAB (manual override from user_config.pri)") -} else:WindowsBuild { - exists(src/lib/opalrt/OpalApi.h) : exists(C:/OPAL-RT/RT-LAB7.2.4/Common/bin) { - message("Including support for RT-LAB") - - DEFINES += QGC_RTLAB_ENABLED - - INCLUDEPATH += - src/lib/opalrt - libs/lib/opal/include \ - - FORMS += src/ui/OpalLinkSettings.ui - - HEADERS += \ - src/comm/OpalRT.h \ - src/comm/OpalLink.h \ - src/comm/Parameter.h \ - src/comm/QGCParamID.h \ - src/comm/ParameterList.h \ - src/ui/OpalLinkConfigurationWindow.h - - SOURCES += \ - src/comm/OpalRT.cc \ - src/comm/OpalLink.cc \ - src/comm/Parameter.cc \ - src/comm/QGCParamID.cc \ - src/comm/ParameterList.cc \ - src/ui/OpalLinkConfigurationWindow.cc - - LIBS += \ - -LC:/OPAL-RT/RT-LAB7.2.4/Common/bin \ - -lOpalApi - } else { - warning("Skipping support for RT-LAB (missing libraries, see README)") - } -} else { - message("Skipping support for RT-LAB (unsupported platform)") -} - # # [REQUIRED] SDL dependency. Provides joystick/gamepad support. # The SDL is packaged with QGC for the Mac and Windows. Linux support requires installing the SDL diff --git a/libs/thirdParty/libxbee/LICENSE b/libs/thirdParty/libxbee/LICENSE deleted file mode 100644 index 94a9ed024..000000000 --- a/libs/thirdParty/libxbee/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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. - - This program 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 this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/libs/thirdParty/libxbee/README b/libs/thirdParty/libxbee/README deleted file mode 100644 index a5dbbfe0f..000000000 --- a/libs/thirdParty/libxbee/README +++ /dev/null @@ -1,39 +0,0 @@ -Welcome to libxbee! - -I have proveded sample code in the ./sample directory. Hopefully this will help -get you up and running with libxbee. If you would like samples showing a different -aspect of libxbee, then please do not hesitate to file an 'issue' on the project -site, and I will get to it ASAP: - http://code.google.com/p/libxbee/issues/list - - -Documentation is avaliable via the man page system once you have installed the -library, or as HTML in the 'doc' directory. - $ man libxbee - - -Please note that this project is still in development, so should not be used for -any purpose other than learning/playing/testing etc... Basically don't use it to -make money, and then hold me responsible if it breaks! - -Feel free to contact me directly with any queries: - attie@attie.co.uk - - -For those of you that are planning to use this on an embedded board, I have -included a small makefile (umakefile) that has only the information needed to -compile the library. I suggest you use this instead! - -=== Installation === -To install simply type: - $ make install - -For more information, or if you can't install it, please see the wiki: - http://code.google.com/p/libxbee/wiki/install_libxbee - - -=== Usage === -If you are compiling the object file directly into your executable instead -of making use of the shared library, you must include the following link -flags: - -lpthread -lrt diff --git a/libs/thirdParty/libxbee/api.c b/libs/thirdParty/libxbee/api.c deleted file mode 100644 index ef5923b56..000000000 --- a/libs/thirdParty/libxbee/api.c +++ /dev/null @@ -1,2433 +0,0 @@ -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ -const char *SVN_REV = "$Id: api.c 508 2011-06-12 23:22:34Z attie@attie.co.uk $"; -char svn_rev[128] = "\0"; - -#include "api.h" - -const char *xbee_svn_version(void) { - if (svn_rev[0] == '\0') { - char *t; - sprintf(svn_rev,"r%s",&SVN_REV[11]); - t = strrchr(svn_rev,' '); - if (t) { - t[0] = '\0'; - } - } - return svn_rev; -} - -const char *xbee_build_info(void) { - return "Built on " __DATE__ " @ " __TIME__ " for " HOST_OS; -} - -/* ################################################################# */ -/* ### Memory Handling ############################################# */ -/* ################################################################# */ - -/* malloc wrapper function */ -static void *Xmalloc2(xbee_hnd xbee, size_t size) { - void *t; - t = malloc(size); - if (!t) { - /* uhoh... thats pretty bad... */ - xbee_perror("libxbee:malloc()"); - exit(1); - } - return t; -} - -/* calloc wrapper function */ -static void *Xcalloc2(xbee_hnd xbee, size_t size) { - void *t; - t = calloc(1, size); - if (!t) { - /* uhoh... thats pretty bad... */ - xbee_perror("libxbee:calloc()"); - exit(1); - } - return t; -} - -/* realloc wrapper function */ -static void *Xrealloc2(xbee_hnd xbee, void *ptr, size_t size) { - void *t; - t = realloc(ptr,size); - if (!t) { - /* uhoh... thats pretty bad... */ - fprintf(stderr,"libxbee:realloc(): Returned NULL\n"); - exit(1); - } - return t; -} - -/* free wrapper function (uses the Xfree macro and sets the pointer to NULL after freeing it) */ -static void Xfree2(void **ptr) { - if (!*ptr) return; - free(*ptr); - *ptr = NULL; -} - -/* ################################################################# */ -/* ### Helper Functions ############################################ */ -/* ################################################################# */ - -/* ################################################################# - returns 1 if the packet has data for the digital input else 0 */ -int xbee_hasdigital(xbee_pkt *pkt, int sample, int input) { - int mask = 0x0001; - if (input < 0 || input > 7) return 0; - if (sample >= pkt->samples) return 0; - - mask <<= input; - return !!(pkt->IOdata[sample].IOmask & mask); -} - -/* ################################################################# - returns 1 if the digital input is high else 0 (or 0 if no digital data present) */ -int xbee_getdigital(xbee_pkt *pkt, int sample, int input) { - int mask = 0x0001; - if (!xbee_hasdigital(pkt,sample,input)) return 0; - - mask <<= input; - return !!(pkt->IOdata[sample].IOdigital & mask); -} - -/* ################################################################# - returns 1 if the packet has data for the analog input else 0 */ -int xbee_hasanalog(xbee_pkt *pkt, int sample, int input) { - int mask = 0x0200; - if (input < 0 || input > 5) return 0; - if (sample >= pkt->samples) return 0; - - mask <<= input; - return !!(pkt->IOdata[sample].IOmask & mask); -} - -/* ################################################################# - returns analog input as a voltage if vRef is non-zero, else raw value (or 0 if no analog data present) */ -double xbee_getanalog(xbee_pkt *pkt, int sample, int input, double Vref) { - if (!xbee_hasanalog(pkt,sample,input)) return 0; - - if (Vref) return (Vref / 1023) * pkt->IOdata[sample].IOanalog[input]; - return pkt->IOdata[sample].IOanalog[input]; -} - -/* ################################################################# */ -/* ### XBee Functions ############################################## */ -/* ################################################################# */ - -static void xbee_logf(xbee_hnd xbee, const char *logformat, const char *file, - const int line, const char *function, char *format, ...) { - char buf[128]; - va_list ap; - if (!xbee) return; - if (!xbee->log) return; - va_start(ap,format); - vsnprintf(buf,127,format,ap); - va_end(ap); - fprintf(xbee->log,logformat,file,line,function,buf); -} -void xbee_logitf(char *format, ...) { - char buf[128]; - va_list ap; - va_start(ap,format); - vsnprintf(buf,127,format,ap); - va_end(ap); - xbee_logit(buf); -} -void _xbee_logitf(xbee_hnd xbee, char *format, ...) { - char buf[128]; - va_list ap; - va_start(ap,format); - vsnprintf(buf,127,format,ap); - va_end(ap); - _xbee_logit(xbee, buf); -} -void xbee_logit(char *str) { - _xbee_logit(default_xbee, str); -} -void _xbee_logit(xbee_hnd xbee, char *str) { - if (!xbee) return; - if (!xbee->log) return; - xbee_mutex_lock(xbee->logmutex); - fprintf(xbee->log,LOG_FORMAT"\n",__FILE__,__LINE__,__FUNCTION__,str); - xbee_mutex_unlock(xbee->logmutex); -} - -/* ################################################################# - xbee_sendAT - INTERNAL - allows for an at command to be send, and the reply to be captured */ -static int xbee_sendAT(xbee_hnd xbee, char *command, char *retBuf, int retBuflen) { - return xbee_sendATdelay(xbee, 0, command, retBuf, retBuflen); -} -static int xbee_sendATdelay(xbee_hnd xbee, int guardTime, char *command, char *retBuf, int retBuflen) { - struct timeval to; - - int ret; - int bufi = 0; - - /* if there is a guardTime given, then use it and a bit more */ - if (guardTime) usleep(guardTime * 1200); - - /* get rid of any pre-command sludge... */ - memset(&to, 0, sizeof(to)); - ret = xbee_select(xbee,&to); - if (ret > 0) { - char t[128]; - while (xbee_read(xbee,t,127)); - } - - /* send the requested command */ - xbee_log("sendATdelay: Sending '%s'", command); - xbee_write(xbee,command, strlen(command)); - - /* if there is a guardTime, then use it */ - if (guardTime) { - usleep(guardTime * 900); - - /* get rid of any post-command sludge... */ - memset(&to, 0, sizeof(to)); - ret = xbee_select(xbee,&to); - if (ret > 0) { - char t[128]; - while (xbee_read(xbee,t,127)); - } - } - - /* retrieve the data */ - memset(retBuf, 0, retBuflen); - memset(&to, 0, sizeof(to)); - if (guardTime) { - /* select on the xbee fd... wait at most 0.2 the guardTime for the response */ - to.tv_usec = guardTime * 200; - } else { - /* or 250ms */ - to.tv_usec = 250000; - } - if ((ret = xbee_select(xbee,&to)) == -1) { - xbee_perror("libxbee:xbee_sendATdelay()"); - exit(1); - } - - if (!ret) { - /* timed out, and there is nothing to be read */ - xbee_log("sendATdelay: No Data to read - Timeout..."); - return 1; - } - - /* check for any dribble... */ - do { - /* if there is actually no space in the retBuf then break out */ - if (bufi >= retBuflen - 1) { - break; - } - - /* read as much data as is possible into retBuf */ - if ((ret = xbee_read(xbee,&retBuf[bufi], retBuflen - bufi - 1)) == 0) { - break; - } - - /* advance the 'end of string' pointer */ - bufi += ret; - - /* wait at most 150ms for any more data */ - memset(&to, 0, sizeof(to)); - to.tv_usec = 150000; - if ((ret = xbee_select(xbee,&to)) == -1) { - xbee_perror("libxbee:xbee_sendATdelay()"); - exit(1); - } - - /* loop while data was read */ - } while (ret); - - if (!bufi) { - xbee_log("sendATdelay: No response..."); - return 1; - } - - /* terminate the string */ - retBuf[bufi] = '\0'; - - xbee_log("sendATdelay: Recieved '%s'",retBuf); - return 0; -} - - -/* ################################################################# - xbee_start - sets up the correct API mode for the xbee - cmdSeq = CC - cmdTime = GT */ -static int xbee_startAPI(xbee_hnd xbee) { - char buf[256]; - - if (xbee->cmdSeq == 0 || xbee->cmdTime == 0) return 1; - - /* setup the command sequence string */ - memset(buf,xbee->cmdSeq,3); - buf[3] = '\0'; - - /* try the command sequence */ - if (xbee_sendATdelay(xbee, xbee->cmdTime, buf, buf, sizeof(buf))) { - /* if it failed... try just entering 'AT' which should return OK */ - if (xbee_sendAT(xbee, "AT\r", buf, 4) || strncmp(buf,"OK\r",3)) return 1; - } else if (strncmp(&buf[strlen(buf)-3],"OK\r",3)) { - /* if data was returned, but it wasn't OK... then something went wrong! */ - return 1; - } - - /* get the current API mode */ - if (xbee_sendAT(xbee, "ATAP\r", buf, 3)) return 1; - buf[1] = '\0'; - xbee->oldAPI = atoi(buf); - - if (xbee->oldAPI != 2) { - /* if it wasnt set to mode 2 already, then set it to mode 2 */ - if (xbee_sendAT(xbee, "ATAP2\r", buf, 4) || strncmp(buf,"OK\r",3)) return 1; - } - - /* quit from command mode, ready for some packets! :) */ - if (xbee_sendAT(xbee, "ATCN\r", buf, 4) || strncmp(buf,"OK\r",3)) return 1; - - return 0; -} - -/* ################################################################# - xbee_end - resets the API mode to the saved value - you must have called xbee_setup[log]API */ -int xbee_end(void) { - return _xbee_end(default_xbee); -} -int _xbee_end(xbee_hnd xbee) { - int ret = 1; - xbee_con *con, *ncon; - xbee_pkt *pkt, *npkt; - xbee_hnd xbeet; - - ISREADYR(0); - xbee_log("Stopping libxbee instance..."); - - /* unlink the instance from list... */ - xbee_log("Unlinking instance from list..."); - xbee_mutex_lock(xbee_hnd_mutex); - if (xbee == default_xbee) { - default_xbee = default_xbee->next; - if (!default_xbee) { - xbee_mutex_destroy(xbee_hnd_mutex); - } - } else { - xbeet = default_xbee; - while (xbeet) { - if (xbeet->next == xbee) { - xbeet->next = xbee->next; - break; - } - xbeet = xbeet->next; - } - } - if (default_xbee) xbee_mutex_unlock(xbee_hnd_mutex); - - /* if the api mode was not 2 to begin with then put it back */ - if (xbee->oldAPI == 2) { - xbee_log("XBee was already in API mode 2, no need to reset"); - ret = 0; - } else { - int to = 5; - - con = _xbee_newcon(xbee,'I',xbee_localAT); - con->callback = NULL; - con->waitforACK = 1; - _xbee_senddata(xbee,con,"AP%c",xbee->oldAPI); - - pkt = NULL; - - while (!pkt && to--) { - pkt = _xbee_getpacketwait(xbee,con); - } - if (pkt) { - ret = pkt->status; - Xfree(pkt); - } - _xbee_endcon(xbee,con); - } - - /* xbee_* functions may no longer run... */ - xbee->xbee_ready = 0; - - /* nullify everything */ - - /* stop listening for data... either after timeout or next char read which ever is first */ - xbee->run = 0; - - xbee_thread_cancel(xbee->listent,0); - xbee_thread_join(xbee->listent); - - xbee_thread_cancel(xbee->threadt,0); - xbee_thread_join(xbee->threadt); - - /* free all connections */ - con = xbee->conlist; - xbee->conlist = NULL; - while (con) { - ncon = con->next; - Xfree(con); - con = ncon; - } - - /* free all packets */ - xbee->pktlast = NULL; - pkt = xbee->pktlist; - xbee->pktlist = NULL; - while (pkt) { - npkt = pkt->next; - Xfree(pkt); - pkt = npkt; - } - - /* destroy mutexes */ - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - - /* close the serial port */ - Xfree(xbee->path); - if (xbee->tty) xbee_close(xbee->tty); - - /* close log and tty */ - if (xbee->log) { - fflush(xbee->log); - xbee_close(xbee->log); - } - xbee_mutex_destroy(xbee->logmutex); - - Xfree(xbee); - - return ret; -} - -/* ################################################################# - xbee_setup - opens xbee serial port & creates xbee listen thread - the xbee must be configured for API mode 2 - THIS MUST BE CALLED BEFORE ANY OTHER XBEE FUNCTION */ -int xbee_setup(char *path, int baudrate) { - return xbee_setuplogAPI(path,baudrate,0,0,0); -} -xbee_hnd _xbee_setup(char *path, int baudrate) { - return _xbee_setuplogAPI(path,baudrate,0,0,0); -} -int xbee_setuplog(char *path, int baudrate, int logfd) { - return xbee_setuplogAPI(path,baudrate,logfd,0,0); -} -xbee_hnd _xbee_setuplog(char *path, int baudrate, int logfd) { - return _xbee_setuplogAPI(path,baudrate,logfd,0,0); -} -int xbee_setupAPI(char *path, int baudrate, char cmdSeq, int cmdTime) { - return xbee_setuplogAPI(path,baudrate,0,cmdSeq,cmdTime); -} -xbee_hnd _xbee_setupAPI(char *path, int baudrate, char cmdSeq, int cmdTime) { - return _xbee_setuplogAPI(path,baudrate,0,cmdSeq,cmdTime); -} -int xbee_setuplogAPI(char *path, int baudrate, int logfd, char cmdSeq, int cmdTime) { - if (default_xbee) return 0; - default_xbee = _xbee_setuplogAPI(path,baudrate,logfd,cmdSeq,cmdTime); - return (default_xbee?0:-1); -} -xbee_hnd _xbee_setuplogAPI(char *path, int baudrate, int logfd, char cmdSeq, int cmdTime) { - int ret; - xbee_hnd xbee = NULL; - - /* create a new instance */ - xbee = Xcalloc(sizeof(struct xbee_hnd)); - xbee->next = NULL; - - xbee_mutex_init(xbee->logmutex); -#ifdef DEBUG - if (!logfd) logfd = 2; -#endif - if (logfd) { - xbee->logfd = dup(logfd); - xbee->log = fdopen(xbee->logfd,"w"); - if (!xbee->log) { - /* errno == 9 is bad file descriptor (probrably not provided) */ - if (errno != 9) xbee_perror("xbee_setup(): Failed opening logfile"); - xbee->logfd = 0; - } else { -#ifdef __GNUC__ /* ---- */ - /* set to line buffer - ensure lines are written to file when complete */ - setvbuf(xbee->log,NULL,_IOLBF,BUFSIZ); -#else /* -------------- */ - /* Win32 is rubbish... so we have to completely disable buffering... */ - setvbuf(xbee->log,NULL,_IONBF,BUFSIZ); -#endif /* ------------- */ - } - } - - xbee_logS("---------------------------------------------------------------------"); - xbee_logI("libxbee Starting..."); - xbee_logI("SVN Info: %s",xbee_svn_version()); - xbee_logI("Build Info: %s",xbee_build_info()); - xbee_logE("---------------------------------------------------------------------"); - - /* setup the connection stuff */ - xbee->conlist = NULL; - - /* setup the packet stuff */ - xbee->pktlist = NULL; - xbee->pktlast = NULL; - xbee->pktcount = 0; - xbee->run = 1; - - /* setup the mutexes */ - if (xbee_mutex_init(xbee->conmutex)) { - xbee_perror("xbee_setup():xbee_mutex_init(conmutex)"); - if (xbee->log) xbee_close(xbee->log); - Xfree(xbee); - return NULL; - } - if (xbee_mutex_init(xbee->pktmutex)) { - xbee_perror("xbee_setup():xbee_mutex_init(pktmutex)"); - if (xbee->log) xbee_close(xbee->log); - xbee_mutex_destroy(xbee->conmutex); - Xfree(xbee); - return NULL; - } - if (xbee_mutex_init(xbee->sendmutex)) { - xbee_perror("xbee_setup():xbee_mutex_init(sendmutex)"); - if (xbee->log) xbee_close(xbee->log); - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - Xfree(xbee); - return NULL; - } - - /* take a copy of the XBee device path */ - if ((xbee->path = Xmalloc(sizeof(char) * (strlen(path) + 1))) == NULL) { - xbee_perror("xbee_setup():Xmalloc(path)"); - if (xbee->log) xbee_close(xbee->log); - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - Xfree(xbee); - return NULL; - } - strcpy(xbee->path,path); - if (xbee->log) xbee_log("Opening serial port '%s'...",xbee->path); - - /* call the relevant init function */ - if ((ret = init_serial(xbee,baudrate)) != 0) { - xbee_log("Something failed while opening the serial port..."); - if (xbee->log) xbee_close(xbee->log); - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - Xfree(xbee->path); - Xfree(xbee); - return NULL; - } - - /* when xbee_end() is called, if this is not 2 then ATAP will be set to this value */ - xbee->oldAPI = 2; - xbee->cmdSeq = cmdSeq; - xbee->cmdTime = cmdTime; - if (xbee->cmdSeq && xbee->cmdTime) { - if (xbee_startAPI(xbee)) { - if (xbee->log) { - xbee_log("Couldn't communicate with XBee..."); - xbee_close(xbee->log); - } - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - Xfree(xbee->path); -#ifdef __GNUC__ /* ---- */ - close(xbee->ttyfd); -#endif /* ------------- */ - xbee_close(xbee->tty); - Xfree(xbee); - return NULL; - } - } - - /* allow the listen thread to start */ - xbee->xbee_ready = -1; - - /* can start xbee_listen thread now */ - if (xbee_thread_create(xbee->listent, xbee_listen_wrapper, xbee)) { - xbee_perror("xbee_setup():xbee_thread_create(listent)"); - if (xbee->log) xbee_close(xbee->log); - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - Xfree(xbee->path); -#ifdef __GNUC__ /* ---- */ - close(xbee->ttyfd); -#endif /* ------------- */ - xbee_close(xbee->tty); - Xfree(xbee); - return NULL; - } - - /* can start xbee_thread_watch thread thread now */ - if (xbee_thread_create(xbee->threadt, xbee_thread_watch, xbee)) { - xbee_perror("xbee_setup():xbee_thread_create(threadt)"); - if (xbee->log) xbee_close(xbee->log); - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - Xfree(xbee->path); -#ifdef __GNUC__ /* ---- */ - close(xbee->ttyfd); -#endif /* ------------- */ - xbee_close(xbee->tty); - Xfree(xbee); - return NULL; - } - - usleep(500); - while (xbee->xbee_ready != -2) { - usleep(500); - xbee_log("Waiting for xbee_listen() to be ready..."); - } - - /* allow other functions to be used! */ - xbee->xbee_ready = 1; - - xbee_log("Linking xbee instance..."); - if (!default_xbee) { - xbee_mutex_init(xbee_hnd_mutex); - xbee_mutex_lock(xbee_hnd_mutex); - default_xbee = xbee; - xbee_mutex_unlock(xbee_hnd_mutex); - } else { - xbee_hnd xbeet; - xbee_mutex_lock(xbee_hnd_mutex); - xbeet = default_xbee; - while (xbeet->next) { - xbeet = xbeet->next; - } - xbeet->next = xbee; - xbee_mutex_unlock(xbee_hnd_mutex); - } - - xbee_log("libxbee: Started!"); - - return xbee; -} - -/* ################################################################# - xbee_con - produces a connection to the specified device and frameID - if a connection had already been made, then this connection will be returned */ -xbee_con *xbee_newcon(unsigned char frameID, xbee_types type, ...) { - xbee_con *ret; - va_list ap; - - /* xbee_vnewcon() wants a va_list... */ - va_start(ap, type); - /* hand it over :) */ - ret = _xbee_vnewcon(default_xbee, frameID, type, ap); - va_end(ap); - return ret; -} -xbee_con *_xbee_newcon(xbee_hnd xbee, unsigned char frameID, xbee_types type, ...) { - xbee_con *ret; - va_list ap; - - /* xbee_vnewcon() wants a va_list... */ - va_start(ap, type); - /* hand it over :) */ - ret = _xbee_vnewcon(xbee, frameID, type, ap); - va_end(ap); - return ret; -} -xbee_con *_xbee_vnewcon(xbee_hnd xbee, unsigned char frameID, xbee_types type, va_list ap) { - xbee_con *con, *ocon; - unsigned char tAddr[8]; - int t; - int i; - - ISREADYR(NULL); - - if (!type || type == xbee_unknown) type = xbee_localAT; /* default to local AT */ - else if (type == xbee_remoteAT) type = xbee_64bitRemoteAT; /* if remote AT, default to 64bit */ - - /* if: 64 bit address expected (2 ints) */ - if ((type == xbee_64bitRemoteAT) || - (type == xbee_64bitData) || - (type == xbee_64bitIO) || - (type == xbee2_data)) { - t = va_arg(ap, int); - tAddr[0] = (t >> 24) & 0xFF; - tAddr[1] = (t >> 16) & 0xFF; - tAddr[2] = (t >> 8) & 0xFF; - tAddr[3] = (t ) & 0xFF; - t = va_arg(ap, int); - tAddr[4] = (t >> 24) & 0xFF; - tAddr[5] = (t >> 16) & 0xFF; - tAddr[6] = (t >> 8) & 0xFF; - tAddr[7] = (t ) & 0xFF; - - /* if: 16 bit address expected (1 int) */ - } else if ((type == xbee_16bitRemoteAT) || - (type == xbee_16bitData) || - (type == xbee_16bitIO)) { - t = va_arg(ap, int); - tAddr[0] = (t >> 8) & 0xFF; - tAddr[1] = (t ) & 0xFF; - tAddr[2] = 0; - tAddr[3] = 0; - tAddr[4] = 0; - tAddr[5] = 0; - tAddr[6] = 0; - tAddr[7] = 0; - - /* otherwise clear the address */ - } else { - memset(tAddr,0,8); - } - - /* lock the connection mutex */ - xbee_mutex_lock(xbee->conmutex); - - /* are there any connections? */ - if (xbee->conlist) { - con = xbee->conlist; - while (con) { - /* if: looking for a modemStatus, and the types match! */ - if ((type == xbee_modemStatus) && - (con->type == type)) { - xbee_mutex_unlock(xbee->conmutex); - return con; - - /* if: looking for a txStatus and frameIDs match! */ - } else if ((type == xbee_txStatus) && - (con->type == type) && - (frameID == con->frameID)) { - xbee_mutex_unlock(xbee->conmutex); - return con; - - /* if: looking for a localAT, and the frameIDs match! */ - } else if ((type == xbee_localAT) && - (con->type == type) && - (frameID == con->frameID)) { - xbee_mutex_unlock(xbee->conmutex); - return con; - - /* if: connection types match, the frameIDs match, and the addresses match! */ - } else if ((type == con->type) && - (frameID == con->frameID) && - (!memcmp(tAddr,con->tAddr,8))) { - xbee_mutex_unlock(xbee->conmutex); - return con; - } - - /* if there are more, move along, dont want to loose that last item! */ - if (con->next == NULL) break; - con = con->next; - } - - /* keep hold of the last connection... we will need to link it up later */ - ocon = con; - } - - /* unlock the connection mutex */ - xbee_mutex_unlock(xbee->conmutex); - - /* create a new connection and set its attributes */ - con = Xcalloc(sizeof(xbee_con)); - con->type = type; - /* is it a 64bit connection? */ - if ((type == xbee_64bitRemoteAT) || - (type == xbee_64bitData) || - (type == xbee_64bitIO) || - (type == xbee2_data)) { - con->tAddr64 = TRUE; - } - con->atQueue = 0; /* queue AT commands? */ - con->txDisableACK = 0; /* disable ACKs? */ - con->txBroadcastPAN = 0; /* broadcast? */ - con->frameID = frameID; - con->waitforACK = 0; - memcpy(con->tAddr,tAddr,8); /* copy in the remote address */ - xbee_mutex_init(con->callbackmutex); - xbee_mutex_init(con->callbackListmutex); - xbee_mutex_init(con->Txmutex); - xbee_sem_init(con->waitforACKsem); - - if (xbee->log) { - switch(type) { - case xbee_localAT: - xbee_log("New local AT connection!"); - break; - case xbee_16bitRemoteAT: - case xbee_64bitRemoteAT: - xbee_logc("New %d-bit remote AT connection! (to: ",(con->tAddr64?64:16)); - for (i=0;i<(con->tAddr64?8:2);i++) { - fprintf(xbee->log,(i?":%02X":"%02X"),tAddr[i]); - } - fprintf(xbee->log,")"); - xbee_logcf(); - break; - case xbee_16bitData: - case xbee_64bitData: - xbee_logc("New %d-bit data connection! (to: ",(con->tAddr64?64:16)); - for (i=0;i<(con->tAddr64?8:2);i++) { - fprintf(xbee->log,(i?":%02X":"%02X"),tAddr[i]); - } - fprintf(xbee->log,")"); - xbee_logcf(); - break; - case xbee_16bitIO: - case xbee_64bitIO: - xbee_logc("New %d-bit IO connection! (to: ",(con->tAddr64?64:16)); - for (i=0;i<(con->tAddr64?8:2);i++) { - fprintf(xbee->log,(i?":%02X":"%02X"),tAddr[i]); - } - fprintf(xbee->log,")"); - xbee_logcf(); - break; - case xbee2_data: - xbee_logc("New Series 2 data connection! (to: "); - for (i=0;i<8;i++) { - fprintf(xbee->log,(i?":%02X":"%02X"),tAddr[i]); - } - fprintf(xbee->log,")"); - xbee_logcf(); - break; - case xbee_txStatus: - xbee_log("New Tx status connection!"); - break; - case xbee_modemStatus: - xbee_log("New modem status connection!"); - break; - case xbee_unknown: - default: - xbee_log("New unknown connection!"); - } - } - - /* lock the connection mutex */ - xbee_mutex_lock(xbee->conmutex); - - /* make it the last in the list */ - con->next = NULL; - /* add it to the list */ - if (xbee->conlist) { - ocon->next = con; - } else { - xbee->conlist = con; - } - - /* unlock the mutex */ - xbee_mutex_unlock(xbee->conmutex); - return con; -} - -/* ################################################################# - xbee_conflush - removes any packets that have been collected for the specified - connection */ -void xbee_purgecon(xbee_con *con) { - _xbee_purgecon(default_xbee, con); -} -void _xbee_purgecon(xbee_hnd xbee, xbee_con *con) { - xbee_pkt *r, *p, *n; - - ISREADYP(); - - /* lock the packet mutex */ - xbee_mutex_lock(xbee->pktmutex); - - /* if: there are packets */ - if ((p = xbee->pktlist) != NULL) { - r = NULL; - /* get all packets for this connection */ - do { - /* does the packet match the connection? */ - if (xbee_matchpktcon(xbee,p,con)) { - /* if it was the first packet */ - if (!r) { - /* move the chain along */ - xbee->pktlist = p->next; - } else { - /* otherwise relink the list */ - r->next = p->next; - } - xbee->pktcount--; - - /* free this packet! */ - n = p->next; - Xfree(p); - /* move on */ - p = n; - } else { - /* move on */ - r = p; - p = p->next; - } - } while (p); - xbee->pktlast = r; - } - - /* unlock the packet mutex */ - xbee_mutex_unlock(xbee->pktmutex); -} - -/* ################################################################# - xbee_endcon - close the unwanted connection - free wrapper function (uses the Xfree macro and sets the pointer to NULL after freeing it) */ -void xbee_endcon2(xbee_con **con, int alreadyUnlinked) { - _xbee_endcon2(default_xbee, con, alreadyUnlinked); -} -void _xbee_endcon2(xbee_hnd xbee, xbee_con **con, int alreadyUnlinked) { - xbee_con *t, *u; - - ISREADYP(); - - /* lock the connection mutex */ - xbee_mutex_lock(xbee->conmutex); - - u = t = xbee->conlist; - while (t && t != *con) { - u = t; - t = t->next; - } - if (!t) { - /* this could be true if comming from the destroySelf signal... */ - if (!alreadyUnlinked) { - /* invalid connection given... */ - if (xbee->log) { - xbee_log("Attempted to close invalid connection..."); - } - /* unlock the connection mutex */ - xbee_mutex_unlock(xbee->conmutex); - return; - } - } else { - /* extract this connection from the list */ - if (t == xbee->conlist) { - xbee->conlist = t->next; - } else { - u->next = t->next; - } - } - - /* unlock the connection mutex */ - xbee_mutex_unlock(xbee->conmutex); - - /* check if a callback thread is running... */ - if (t->callback && xbee_mutex_trylock(t->callbackmutex)) { - /* if it is running... tell it to destroy the connection on completion */ - xbee_log("Attempted to close a connection with active callbacks... " - "Connection will be destroyed when callbacks have completeted..."); - t->destroySelf = 1; - return; - } - - /* remove all packets for this connection */ - _xbee_purgecon(xbee,t); - - /* destroy the callback mutex */ - xbee_mutex_destroy(t->callbackmutex); - xbee_mutex_destroy(t->callbackListmutex); - xbee_mutex_destroy(t->Txmutex); - xbee_sem_destroy(t->waitforACKsem); - - /* free the connection! */ - Xfree(*con); -} - -/* ################################################################# - xbee_senddata - send the specified data to the provided connection */ -int xbee_senddata(xbee_con *con, char *format, ...) { - int ret; - va_list ap; - - /* xbee_vsenddata() wants a va_list... */ - va_start(ap, format); - /* hand it over :) */ - ret = _xbee_vsenddata(default_xbee, con, format, ap); - va_end(ap); - return ret; -} -int _xbee_senddata(xbee_hnd xbee, xbee_con *con, char *format, ...) { - int ret; - va_list ap; - - /* xbee_vsenddata() wants a va_list... */ - va_start(ap, format); - /* hand it over :) */ - ret = _xbee_vsenddata(xbee, con, format, ap); - va_end(ap); - return ret; -} - -int xbee_vsenddata(xbee_con *con, char *format, va_list ap) { - return _xbee_vsenddata(default_xbee, con, format, ap); -} -int _xbee_vsenddata(xbee_hnd xbee, xbee_con *con, char *format, va_list ap) { - unsigned char data[128]; /* max payload is 100 bytes... plus a bit of fluff... */ - int length; - - /* make up the data and keep the length, its possible there are nulls in there */ - length = vsnprintf((char *)data, 128, format, ap); - - /* hand it over :) */ - return _xbee_nsenddata(xbee, con, (char *)data, length); -} - -/* returns: - 1 - if NAC was recieved - 0 - if packet was successfully sent (or just sent if waitforACK is off) - -1 - if there was an error building the packet - -2 - if the connection type was unknown */ -int xbee_nsenddata(xbee_con *con, char *data, int length) { - return _xbee_nsenddata(default_xbee, con, data, length); -} -int _xbee_nsenddata(xbee_hnd xbee, xbee_con *con, char *data, int length) { - t_data *pkt; - int i; - unsigned char buf[128]; /* max payload is 100 bytes... plus a bit for the headers etc... */ - - ISREADYR(-1); - - if (!con) return -1; - if (con->type == xbee_unknown) return -1; - if (length > 127) return -1; - - if (xbee->log) { - xbee_logS("--== TX Packet ============--"); - xbee_logIc("Connection Type: "); - switch (con->type) { - case xbee_unknown: fprintf(xbee->log,"Unknown"); break; - case xbee_localAT: fprintf(xbee->log,"Local AT"); break; - case xbee_remoteAT: fprintf(xbee->log,"Remote AT"); break; - case xbee_16bitRemoteAT: fprintf(xbee->log,"Remote AT (16-bit)"); break; - case xbee_64bitRemoteAT: fprintf(xbee->log,"Remote AT (64-bit)"); break; - case xbee_16bitData: fprintf(xbee->log,"Data (16-bit)"); break; - case xbee_64bitData: fprintf(xbee->log,"Data (64-bit)"); break; - case xbee_16bitIO: fprintf(xbee->log,"IO (16-bit)"); break; - case xbee_64bitIO: fprintf(xbee->log,"IO (64-bit)"); break; - case xbee2_data: fprintf(xbee->log,"Series 2 Data"); break; - case xbee2_txStatus: fprintf(xbee->log,"Series 2 Tx Status"); break; - case xbee_txStatus: fprintf(xbee->log,"Tx Status"); break; - case xbee_modemStatus: fprintf(xbee->log,"Modem Status"); break; - } - xbee_logIcf(); - switch (con->type) { - case xbee_localAT: case xbee_remoteAT: case xbee_txStatus: case xbee_modemStatus: - break; - default: - xbee_logIc("Destination: "); - for (i=0;i<(con->tAddr64?8:2);i++) { - fprintf(xbee->log,(i?":%02X":"%02X"),con->tAddr[i]); - } - xbee_logIcf(); - } - xbee_logI("Length: %d",length); - for (i=0;i 32) && (data[i] < 127)) { - fprintf(xbee->log,"'%c'",data[i]); - } else{ - fprintf(xbee->log," _"); - } - xbee_logIcf(); - } - xbee_logEf(); - } - - /* ########################################## */ - /* if: local AT */ - if (con->type == xbee_localAT) { - /* AT commands are 2 chars long (plus optional parameter) */ - if (length < 2) return -1; - if (length > 32) return -1; - - /* use the command? */ - buf[0] = ((!con->atQueue)?XBEE_LOCAL_ATREQ:XBEE_LOCAL_ATQUE); - buf[1] = con->frameID; - - /* copy in the data */ - for (i=0;itype == xbee_16bitRemoteAT) || - (con->type == xbee_64bitRemoteAT)) { - if (length < 2) return -1; /* at commands are 2 chars long (plus optional parameter) */ - if (length > 32) return -1; - buf[0] = XBEE_REMOTE_ATREQ; - buf[1] = con->frameID; - - /* copy in the relevant address */ - if (con->tAddr64) { - memcpy(&buf[2],con->tAddr,8); - buf[10] = 0xFF; - buf[11] = 0xFE; - } else { - memset(&buf[2],0,8); - memcpy(&buf[10],con->tAddr,2); - } - /* queue the command? */ - buf[12] = ((!con->atQueue)?0x02:0x00); - - /* copy in the data */ - for (i=0;itype == xbee_16bitData) || - (con->type == xbee_64bitData)) { - int offset; - if (length > 100) return -1; - - /* if: 16bit Data */ - if (con->type == xbee_16bitData) { - buf[0] = XBEE_16BIT_DATATX; - offset = 5; - /* copy in the address */ - memcpy(&buf[2],con->tAddr,2); - - /* if: 64bit Data */ - } else { /* 64bit Data */ - buf[0] = XBEE_64BIT_DATATX; - offset = 11; - /* copy in the address */ - memcpy(&buf[2],con->tAddr,8); - } - - /* copy frameID */ - buf[1] = con->frameID; - - /* disable ack? broadcast? */ - buf[offset-1] = ((con->txDisableACK)?0x01:0x00) | ((con->txBroadcastPAN)?0x04:0x00); - - /* copy in the data */ - for (i=0;itype == xbee_64bitIO) || - (con->type == xbee_16bitIO)) { - /* not currently implemented... is it even allowed? */ - if (xbee->log) { - xbee_log("******* TODO ********\n"); - } - - /* ########################################## */ - /* if: Series 2 Data */ - } else if (con->type == xbee2_data) { - if (length > 72) return -1; - - buf[0] = XBEE2_DATATX; - buf[1] = con->frameID; - - /* copy in the relevant address */ - memcpy(&buf[2],con->tAddr,8); - buf[10] = 0xFF; - buf[11] = 0xFE; - - /* Maximum Radius/hops */ - buf[12] = 0x00; - - /* Options */ - buf[13] = 0x00; - - /* copy in the data */ - for (i=0;ipktmutex); - - /* if: there are no packets */ - if ((p = xbee->pktlist) == NULL) { - xbee_mutex_unlock(xbee->pktmutex); - /*if (xbee->log) { - xbee_log("No packets avaliable..."); - }*/ - return NULL; - } - - l = NULL; - q = NULL; - /* get the first avaliable packet for this connection */ - do { - /* does the packet match the connection? */ - if (xbee_matchpktcon(xbee, p, con)) { - q = p; - break; - } - /* move on */ - l = p; - p = p->next; - } while (p); - - /* if: no packet was found */ - if (!q) { - xbee_mutex_unlock(xbee->pktmutex); - if (xbee->log) { - struct timeval tv; - xbee_logS("--== Get Packet ==========--"); - gettimeofday(&tv,NULL); - xbee_logE("Didn't get a packet @ %ld.%06ld",tv.tv_sec,tv.tv_usec); - } - return NULL; - } - - /* if it was the first packet */ - if (l) { - /* relink the list */ - l->next = p->next; - if (!l->next) xbee->pktlast = l; - } else { - /* move the chain along */ - xbee->pktlist = p->next; - if (!xbee->pktlist) { - xbee->pktlast = NULL; - } else if (!xbee->pktlist->next) { - xbee->pktlast = xbee->pktlist; - } - } - xbee->pktcount--; - - /* unlink this packet from the chain! */ - q->next = NULL; - - if (xbee->log) { - struct timeval tv; - xbee_logS("--== Get Packet ==========--"); - gettimeofday(&tv,NULL); - xbee_logI("Got a packet @ %ld.%06ld",tv.tv_sec,tv.tv_usec); - xbee_logE("Packets left: %d",xbee->pktcount); - } - - /* unlock the packet mutex */ - xbee_mutex_unlock(xbee->pktmutex); - - /* and return the packet (must be free'd by caller!) */ - return q; -} - -/* ################################################################# - xbee_matchpktcon - INTERNAL - checks if the packet matches the connection */ -static int xbee_matchpktcon(xbee_hnd xbee, xbee_pkt *pkt, xbee_con *con) { - /* if: the connection type matches the packet type OR - the connection is 16/64bit remote AT, and the packet is a remote AT response */ - if ((pkt->type == con->type) || /* -- */ - ((pkt->type == xbee_remoteAT) && /* -- */ - ((con->type == xbee_16bitRemoteAT) || - (con->type == xbee_64bitRemoteAT)))) { - - - /* if: is a modem status (there can only be 1 modem status connection) */ - if (pkt->type == xbee_modemStatus) return 1; - - /* if: the packet is a txStatus or localAT and the frameIDs match */ - if ((pkt->type == xbee_txStatus) || - (pkt->type == xbee_localAT)) { - if (pkt->frameID == con->frameID) { - return 1; - } - /* if: the packet was sent as a 16bit remoteAT, and the 16bit addresss match */ - } else if ((pkt->type == xbee_remoteAT) && - (con->type == xbee_16bitRemoteAT) && - !memcmp(pkt->Addr16,con->tAddr,2)) { - return 1; - /* if: the packet was sent as a 64bit remoteAT, and the 64bit addresss match */ - } else if ((pkt->type == xbee_remoteAT) && - (con->type == xbee_64bitRemoteAT) && - !memcmp(pkt->Addr64,con->tAddr,8)) { - return 1; - /* if: the packet is 64bit addressed, and the addresses match */ - } else if (pkt->sAddr64 && !memcmp(pkt->Addr64,con->tAddr,8)) { - return 1; - /* if: the packet is 16bit addressed, and the addresses match */ - } else if (!pkt->sAddr64 && !memcmp(pkt->Addr16,con->tAddr,2)) { - return 1; - } else if (con->type == pkt->type && - (con->type == xbee_16bitData || con->type == xbee_64bitData) && - (pkt->isBroadcastADR || pkt->isBroadcastPAN)) { - unsigned char t[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; - if ((con->tAddr64 && !memcmp(con->tAddr,t,8)) || - (!con->tAddr64 && !memcmp(con->tAddr,t,2))) { - return 1; - } - } - } - return 0; -} - -/* ################################################################# - xbee_parse_io - INTERNAL - parses the data given into the packet io information */ -static int xbee_parse_io(xbee_hnd xbee, xbee_pkt *p, unsigned char *d, - int maskOffset, int sampleOffset, int sample) { - xbee_sample *s = &(p->IOdata[sample]); - - /* copy in the I/O data mask */ - s->IOmask = (((d[maskOffset]<<8) | d[maskOffset + 1]) & 0x7FFF); - - /* copy in the digital I/O data */ - s->IOdigital = (((d[sampleOffset]<<8) | d[sampleOffset+1]) & 0x01FF); - - /* advance over the digital data, if its there */ - sampleOffset += ((s->IOmask & 0x01FF)?2:0); - - /* copy in the analog I/O data */ - if (s->IOmask & 0x0200) { - s->IOanalog[0] = (((d[sampleOffset]<<8) | d[sampleOffset+1]) & 0x03FF); - sampleOffset+=2; - } - if (s->IOmask & 0x0400) { - s->IOanalog[1] = (((d[sampleOffset]<<8) | d[sampleOffset+1]) & 0x03FF); - sampleOffset+=2; - } - if (s->IOmask & 0x0800) { - s->IOanalog[2] = (((d[sampleOffset]<<8) | d[sampleOffset+1]) & 0x03FF); - sampleOffset+=2; - } - if (s->IOmask & 0x1000) { - s->IOanalog[3] = (((d[sampleOffset]<<8) | d[sampleOffset+1]) & 0x03FF); - sampleOffset+=2; - } - if (s->IOmask & 0x2000) { - s->IOanalog[4] = (((d[sampleOffset]<<8) | d[sampleOffset+1]) & 0x03FF); - sampleOffset+=2; - } - if (s->IOmask & 0x4000) { - s->IOanalog[5] = (((d[sampleOffset]<<8) | d[sampleOffset+1]) & 0x03FF); - sampleOffset+=2; - } - - if (xbee->log) { - if (s->IOmask & 0x0001) - xbee_logI("Digital 0: %c",((s->IOdigital & 0x0001)?'1':'0')); - if (s->IOmask & 0x0002) - xbee_logI("Digital 1: %c",((s->IOdigital & 0x0002)?'1':'0')); - if (s->IOmask & 0x0004) - xbee_logI("Digital 2: %c",((s->IOdigital & 0x0004)?'1':'0')); - if (s->IOmask & 0x0008) - xbee_logI("Digital 3: %c",((s->IOdigital & 0x0008)?'1':'0')); - if (s->IOmask & 0x0010) - xbee_logI("Digital 4: %c",((s->IOdigital & 0x0010)?'1':'0')); - if (s->IOmask & 0x0020) - xbee_logI("Digital 5: %c",((s->IOdigital & 0x0020)?'1':'0')); - if (s->IOmask & 0x0040) - xbee_logI("Digital 6: %c",((s->IOdigital & 0x0040)?'1':'0')); - if (s->IOmask & 0x0080) - xbee_logI("Digital 7: %c",((s->IOdigital & 0x0080)?'1':'0')); - if (s->IOmask & 0x0100) - xbee_logI("Digital 8: %c",((s->IOdigital & 0x0100)?'1':'0')); - if (s->IOmask & 0x0200) - xbee_logI("Analog 0: %d (~%.2fv)",s->IOanalog[0],(3.3/1023)*s->IOanalog[0]); - if (s->IOmask & 0x0400) - xbee_logI("Analog 1: %d (~%.2fv)",s->IOanalog[1],(3.3/1023)*s->IOanalog[1]); - if (s->IOmask & 0x0800) - xbee_logI("Analog 2: %d (~%.2fv)",s->IOanalog[2],(3.3/1023)*s->IOanalog[2]); - if (s->IOmask & 0x1000) - xbee_logI("Analog 3: %d (~%.2fv)",s->IOanalog[3],(3.3/1023)*s->IOanalog[3]); - if (s->IOmask & 0x2000) - xbee_logI("Analog 4: %d (~%.2fv)",s->IOanalog[4],(3.3/1023)*s->IOanalog[4]); - if (s->IOmask & 0x4000) - xbee_logI("Analog 5: %d (~%.2fv)",s->IOanalog[5],(3.3/1023)*s->IOanalog[5]); - } - - return sampleOffset; -} - -/* ################################################################# - xbee_listen_stop - stops the listen thread after the current packet has been processed */ -void xbee_listen_stop(xbee_hnd xbee) { - ISREADYP(); - xbee->run = 0; -} - -/* ################################################################# - xbee_listen_wrapper - INTERNAL - the xbee_listen wrapper. Prints an error when xbee_listen ends */ -static void xbee_listen_wrapper(xbee_hnd xbee) { - int ret; - - /* just falls out if the proper 'go-ahead' isn't given */ - if (xbee->xbee_ready != -1) return; - /* now allow the parent to continue */ - xbee->xbee_ready = -2; - -#ifdef _WIN32 /* ---- */ - /* win32 requires this delay... no idea why */ - usleep(1000000); -#endif /* ----------- */ - - while (xbee->run) { - ret = xbee_listen(xbee); - if (!xbee->run) break; - xbee_log("xbee_listen() returned [%d]... Restarting in 25ms!",ret); - usleep(25000); - } -} - -/* xbee_listen - INTERNAL - the xbee xbee_listen thread - reads data from the xbee and puts it into a linked list to keep the xbee buffers free */ -static int xbee_listen(xbee_hnd xbee) { -#define LISTEN_BUFLEN 1024 - unsigned char c, t, d[LISTEN_BUFLEN]; - unsigned int l, i, chksum, o; - int j; - xbee_pkt *p = NULL, *q; - xbee_con *con; - int hasCon; - - /* do this forever :) */ - while (xbee->run) { - /* clean up any undesired storage */ - if (p) Xfree(p); - - /* wait for a valid start byte */ - if ((c = xbee_getrawbyte(xbee)) != 0x7E) { - if (xbee->log) xbee_log("***** Unexpected byte (0x%02X)... *****",c); - continue; - } - if (!xbee->run) return 0; - - xbee_logSf(); - if (xbee->log) { - struct timeval tv; - xbee_logI("--== RX Packet ===========--"); - gettimeofday(&tv,NULL); - xbee_logI("Got a packet @ %ld.%06ld",tv.tv_sec,tv.tv_usec); - } - - /* get the length */ - l = xbee_getbyte(xbee) << 8; - l += xbee_getbyte(xbee); - - /* check it is a valid length... */ - if (!l) { - if (xbee->log) { - xbee_logI("Recived zero length packet!"); - } - continue; - } - if (l > 100) { - if (xbee->log) { - xbee_logI("Recived oversized packet! Length: %d",l - 1); - } - } - if (l > LISTEN_BUFLEN) { - if (xbee->log) { - xbee_logI("Recived packet larger than buffer! Discarding..."); - } - continue; - } - - if (xbee->log) { - xbee_logI("Length: %d",l - 1); - } - - /* get the packet type */ - t = xbee_getbyte(xbee); - - /* start the checksum */ - chksum = t; - - /* suck in all the data */ - for (i = 0; l > 1 && i < LISTEN_BUFLEN; l--, i++) { - /* get an unescaped byte */ - c = xbee_getbyte(xbee); - d[i] = c; - chksum += c; - if (xbee->log) { - xbee_logIc("%3d | 0x%02X | ",i,c); - if ((c > 32) && (c < 127)) fprintf(xbee->log,"'%c'",c); else fprintf(xbee->log," _ "); - - if ((t == XBEE_LOCAL_AT && i == 4) || - (t == XBEE_REMOTE_AT && i == 14) || - (t == XBEE_64BIT_DATARX && i == 10) || - (t == XBEE_16BIT_DATARX && i == 4) || - (t == XBEE_64BIT_IO && i == 13) || - (t == XBEE_16BIT_IO && i == 7)) { - /* mark the beginning of the 'data' bytes */ - fprintf(xbee->log," <-- data starts"); - } else if (t == XBEE_64BIT_IO) { - if (i == 10) fprintf(xbee->log," <-- sample count"); - else if (i == 11) fprintf(xbee->log," <-- mask (msb)"); - else if (i == 12) fprintf(xbee->log," <-- mask (lsb)"); - } else if (t == XBEE_16BIT_IO) { - if (i == 4) fprintf(xbee->log," <-- sample count"); - else if (i == 5) fprintf(xbee->log," <-- mask (msb)"); - else if (i == 6) fprintf(xbee->log," <-- mask (lsb)"); - } - xbee_logIcf(); - } - } - i--; /* it went up too many times!... */ - - /* add the checksum */ - chksum += xbee_getbyte(xbee); - - /* check if the whole packet was recieved, or something else occured... unlikely... */ - if (l>1) { - if (xbee->log) { - xbee_logE("Didn't get whole packet... :("); - } - continue; - } - - /* check the checksum */ - if ((chksum & 0xFF) != 0xFF) { - if (xbee->log) { - chksum &= 0xFF; - xbee_logE("Invalid Checksum: 0x%02X",chksum); - } - continue; - } - - /* make a new packet */ - p = Xcalloc(sizeof(xbee_pkt)); - q = NULL; - p->datalen = 0; - - /* ########################################## */ - /* if: modem status */ - if (t == XBEE_MODEM_STATUS) { - if (xbee->log) { - xbee_logI("Packet type: Modem Status (0x8A)"); - xbee_logIc("Event: "); - switch (d[0]) { - case 0x00: fprintf(xbee->log,"Hardware reset"); break; - case 0x01: fprintf(xbee->log,"Watchdog timer reset"); break; - case 0x02: fprintf(xbee->log,"Associated"); break; - case 0x03: fprintf(xbee->log,"Disassociated"); break; - case 0x04: fprintf(xbee->log,"Synchronization lost"); break; - case 0x05: fprintf(xbee->log,"Coordinator realignment"); break; - case 0x06: fprintf(xbee->log,"Coordinator started"); break; - } - fprintf(xbee->log,"... (0x%02X)",d[0]); - xbee_logIcf(); - } - p->type = xbee_modemStatus; - - p->sAddr64 = FALSE; - p->dataPkt = FALSE; - p->txStatusPkt = FALSE; - p->modemStatusPkt = TRUE; - p->remoteATPkt = FALSE; - p->IOPkt = FALSE; - - /* modem status can only ever give 1 'data' byte */ - p->datalen = 1; - p->data[0] = d[0]; - - /* ########################################## */ - /* if: local AT response */ - } else if (t == XBEE_LOCAL_AT) { - if (xbee->log) { - xbee_logI("Packet type: Local AT Response (0x88)"); - xbee_logI("FrameID: 0x%02X",d[0]); - xbee_logI("AT Command: %c%c",d[1],d[2]); - xbee_logIc("Status: "); - if (d[3] == 0x00) fprintf(xbee->log,"OK"); - else if (d[3] == 0x01) fprintf(xbee->log,"Error"); - else if (d[3] == 0x02) fprintf(xbee->log,"Invalid Command"); - else if (d[3] == 0x03) fprintf(xbee->log,"Invalid Parameter"); - fprintf(xbee->log," (0x%02X)",d[3]); - xbee_logIcf(); - } - p->type = xbee_localAT; - - p->sAddr64 = FALSE; - p->dataPkt = FALSE; - p->txStatusPkt = FALSE; - p->modemStatusPkt = FALSE; - p->remoteATPkt = FALSE; - p->IOPkt = FALSE; - - p->frameID = d[0]; - p->atCmd[0] = d[1]; - p->atCmd[1] = d[2]; - - p->status = d[3]; - - /* copy in the data */ - p->datalen = i-3; - for (;i>3;i--) p->data[i-4] = d[i]; - - /* ########################################## */ - /* if: remote AT response */ - } else if (t == XBEE_REMOTE_AT) { - if (xbee->log) { - xbee_logI("Packet type: Remote AT Response (0x97)"); - xbee_logI("FrameID: 0x%02X",d[0]); - xbee_logIc("64-bit Address: "); - for (j=0;j<8;j++) { - fprintf(xbee->log,(j?":%02X":"%02X"),d[1+j]); - } - xbee_logIcf(); - xbee_logIc("16-bit Address: "); - for (j=0;j<2;j++) { - fprintf(xbee->log,(j?":%02X":"%02X"),d[9+j]); - } - xbee_logIcf(); - xbee_logI("AT Command: %c%c",d[11],d[12]); - xbee_logIc("Status: "); - if (d[13] == 0x00) fprintf(xbee->log,"OK"); - else if (d[13] == 0x01) fprintf(xbee->log,"Error"); - else if (d[13] == 0x02) fprintf(xbee->log,"Invalid Command"); - else if (d[13] == 0x03) fprintf(xbee->log,"Invalid Parameter"); - else if (d[13] == 0x04) fprintf(xbee->log,"No Response"); - fprintf(xbee->log," (0x%02X)",d[13]); - xbee_logIcf(); - } - p->type = xbee_remoteAT; - - p->sAddr64 = FALSE; - p->dataPkt = FALSE; - p->txStatusPkt = FALSE; - p->modemStatusPkt = FALSE; - p->remoteATPkt = TRUE; - p->IOPkt = FALSE; - - p->frameID = d[0]; - - p->Addr64[0] = d[1]; - p->Addr64[1] = d[2]; - p->Addr64[2] = d[3]; - p->Addr64[3] = d[4]; - p->Addr64[4] = d[5]; - p->Addr64[5] = d[6]; - p->Addr64[6] = d[7]; - p->Addr64[7] = d[8]; - - p->Addr16[0] = d[9]; - p->Addr16[1] = d[10]; - - p->atCmd[0] = d[11]; - p->atCmd[1] = d[12]; - - p->status = d[13]; - - p->samples = 1; - - if (p->status == 0x00 && p->atCmd[0] == 'I' && p->atCmd[1] == 'S') { - /* parse the io data */ - xbee_logI("--- Sample -----------------"); - xbee_parse_io(xbee, p, d, 15, 17, 0); - xbee_logI("----------------------------"); - } else { - /* copy in the data */ - p->datalen = i-13; - for (;i>13;i--) p->data[i-14] = d[i]; - } - - /* ########################################## */ - /* if: TX status */ - } else if (t == XBEE_TX_STATUS) { - if (xbee->log) { - xbee_logI("Packet type: TX Status Report (0x89)"); - xbee_logI("FrameID: 0x%02X",d[0]); - xbee_logIc("Status: "); - if (d[1] == 0x00) fprintf(xbee->log,"Success"); - else if (d[1] == 0x01) fprintf(xbee->log,"No ACK"); - else if (d[1] == 0x02) fprintf(xbee->log,"CCA Failure"); - else if (d[1] == 0x03) fprintf(xbee->log,"Purged"); - fprintf(xbee->log," (0x%02X)",d[1]); - xbee_logIcf(); - } - p->type = xbee_txStatus; - - p->sAddr64 = FALSE; - p->dataPkt = FALSE; - p->txStatusPkt = TRUE; - p->modemStatusPkt = FALSE; - p->remoteATPkt = FALSE; - p->IOPkt = FALSE; - - p->frameID = d[0]; - - p->status = d[1]; - - /* never returns data */ - p->datalen = 0; - - /* check for any connections waiting for a status update */ - /* lock the connection mutex */ - xbee_mutex_lock(xbee->conmutex); - xbee_logI("Looking for a connection that wants a status update..."); - con = xbee->conlist; - while (con) { - if ((con->frameID == p->frameID) && - (con->ACKstatus == 0xFF)) { - xbee_logI("Found @ 0x%08X!",con); - con->ACKstatus = p->status; - xbee_sem_post(con->waitforACKsem); - } - con = con->next; - } - - /* unlock the connection mutex */ - xbee_mutex_unlock(xbee->conmutex); - - /* ########################################## */ - /* if: 16 / 64bit data recieve */ - } else if ((t == XBEE_64BIT_DATARX) || - (t == XBEE_16BIT_DATARX)) { - int offset; - if (t == XBEE_64BIT_DATARX) { /* 64bit */ - offset = 8; - } else { /* 16bit */ - offset = 2; - } - if (xbee->log) { - xbee_logI("Packet type: %d-bit RX Data (0x%02X)",((t == XBEE_64BIT_DATARX)?64:16),t); - xbee_logIc("%d-bit Address: ",((t == XBEE_64BIT_DATARX)?64:16)); - for (j=0;jlog,(j?":%02X":"%02X"),d[j]); - } - xbee_logIcf(); - xbee_logI("RSSI: -%ddB",d[offset]); - if (d[offset + 1] & 0x02) xbee_logI("Options: Address Broadcast"); - if (d[offset + 1] & 0x04) xbee_logI("Options: PAN Broadcast"); - } - p->isBroadcastADR = !!(d[offset+1] & 0x02); - p->isBroadcastPAN = !!(d[offset+1] & 0x04); - p->dataPkt = TRUE; - p->txStatusPkt = FALSE; - p->modemStatusPkt = FALSE; - p->remoteATPkt = FALSE; - p->IOPkt = FALSE; - - if (t == XBEE_64BIT_DATARX) { /* 64bit */ - p->type = xbee_64bitData; - - p->sAddr64 = TRUE; - - p->Addr64[0] = d[0]; - p->Addr64[1] = d[1]; - p->Addr64[2] = d[2]; - p->Addr64[3] = d[3]; - p->Addr64[4] = d[4]; - p->Addr64[5] = d[5]; - p->Addr64[6] = d[6]; - p->Addr64[7] = d[7]; - } else { /* 16bit */ - p->type = xbee_16bitData; - - p->sAddr64 = FALSE; - - p->Addr16[0] = d[0]; - p->Addr16[1] = d[1]; - } - - /* save the RSSI / signal strength - this can be used with printf as: - printf("-%ddB\n",p->RSSI); */ - p->RSSI = d[offset]; - - p->status = d[offset + 1]; - - /* copy in the data */ - p->datalen = i-(offset + 1); - for (;i>offset + 1;i--) p->data[i-(offset + 2)] = d[i]; - - /* ########################################## */ - /* if: 16 / 64bit I/O recieve */ - } else if ((t == XBEE_64BIT_IO) || - (t == XBEE_16BIT_IO)) { - int offset,i2; - if (t == XBEE_64BIT_IO) { /* 64bit */ - p->type = xbee_64bitIO; - - p->sAddr64 = TRUE; - - p->Addr64[0] = d[0]; - p->Addr64[1] = d[1]; - p->Addr64[2] = d[2]; - p->Addr64[3] = d[3]; - p->Addr64[4] = d[4]; - p->Addr64[5] = d[5]; - p->Addr64[6] = d[6]; - p->Addr64[7] = d[7]; - - offset = 8; - p->samples = d[10]; - } else { /* 16bit */ - p->type = xbee_16bitIO; - - p->sAddr64 = FALSE; - - p->Addr16[0] = d[0]; - p->Addr16[1] = d[1]; - - offset = 2; - p->samples = d[4]; - } - if (p->samples > 1) { - p = Xrealloc(p, sizeof(xbee_pkt) + (sizeof(xbee_sample) * (p->samples - 1))); - } - if (xbee->log) { - xbee_logI("Packet type: %d-bit RX I/O Data (0x%02X)",((t == XBEE_64BIT_IO)?64:16),t); - xbee_logIc("%d-bit Address: ",((t == XBEE_64BIT_IO)?64:16)); - for (j = 0; j < offset; j++) { - fprintf(xbee->log,(j?":%02X":"%02X"),d[j]); - } - xbee_logIcf(); - xbee_logI("RSSI: -%ddB",d[offset]); - xbee_logI("Samples: %d",d[offset + 2]); - } - i2 = offset + 5; - - /* never returns data */ - p->datalen = 0; - - p->dataPkt = FALSE; - p->txStatusPkt = FALSE; - p->modemStatusPkt = FALSE; - p->remoteATPkt = FALSE; - p->IOPkt = TRUE; - - /* save the RSSI / signal strength - this can be used with printf as: - printf("-%ddB\n",p->RSSI); */ - p->RSSI = d[offset]; - - p->status = d[offset + 1]; - - /* each sample is split into its own packet here, for simplicity */ - for (o = 0; o < p->samples; o++) { - if (i2 >= i) { - xbee_logI("Invalid I/O data! Actually contained %d samples...",o); - p = Xrealloc(p, sizeof(xbee_pkt) + (sizeof(xbee_sample) * ((o>1)?o:1))); - p->samples = o; - break; - } - xbee_logI("--- Sample %3d -------------", o); - - /* parse the io data */ - i2 = xbee_parse_io(xbee, p, d, offset + 3, i2, o); - } - xbee_logI("----------------------------"); - - /* ########################################## */ - /* if: Series 2 Transmit status */ - } else if (t == XBEE2_TX_STATUS) { - if (xbee->log) { - xbee_logI("Packet type: Series 2 Transmit Status (0x%02X)", t); - xbee_logI("FrameID: 0x%02X",d[0]); - xbee_logI("16-bit Delivery Address: %02X:%02X",d[1],d[2]); - xbee_logI("Transmit Retry Count: %02X",d[3]); - xbee_logIc("Delivery Status: "); - if (d[4] == 0x00) fprintf(xbee->log,"Success"); - else if (d[4] == 0x02) fprintf(xbee->log,"CCA Failure"); - else if (d[4] == 0x15) fprintf(xbee->log,"Invalid Destination"); - else if (d[4] == 0x21) fprintf(xbee->log,"Network ACK Failure"); - else if (d[4] == 0x22) fprintf(xbee->log,"Not Joined to Network"); - else if (d[4] == 0x23) fprintf(xbee->log,"Self-Addressed"); - else if (d[4] == 0x24) fprintf(xbee->log,"Address Not Found"); - else if (d[4] == 0x25) fprintf(xbee->log,"Route Not Found"); - else if (d[4] == 0x74) fprintf(xbee->log,"Data Payload Too Large"); /* ??? */ - fprintf(xbee->log," (0x%02X)",d[4]); - xbee_logIcf(); - - xbee_logIc("Discovery Status: "); - if (d[5] == 0x00) fprintf(xbee->log,"No Discovery Overhead"); - else if (d[5] == 0x01) fprintf(xbee->log,"Address Discovery"); - else if (d[5] == 0x02) fprintf(xbee->log,"Route Discovery"); - else if (d[5] == 0x03) fprintf(xbee->log,"Address & Route Discovery"); - fprintf(xbee->log," (0x%02X)",d[5]); - xbee_logIcf(); - } - - p->type = xbee2_txStatus; - - p->sAddr64 = FALSE; - p->dataPkt = FALSE; - p->txStatusPkt = TRUE; - p->modemStatusPkt = FALSE; - p->remoteATPkt = FALSE; - p->IOPkt = FALSE; - - p->frameID = d[0]; - - p->status = d[4]; - - /* never returns data */ - p->datalen = 0; - - /* ########################################## */ - /* if: Series 2 data recieve */ - } else if (t == XBEE2_DATARX) { - int offset; - offset = 10; - if (xbee->log) { - xbee_logI("Packet type: Series 2 Data Rx (0x%02X)", t); - - xbee_logIc("64-bit Address: "); - for (j=0;j<8;j++) { - fprintf(xbee->log,(j?":%02X":"%02X"),d[j]); - } - xbee_logIcf(); - - xbee_logIc("16-bit Address: "); - for (j=0;j<2;j++) { - fprintf(xbee->log,(j?":%02X":"%02X"),d[j+8]); - } - xbee_logIcf(); - - if (d[offset] & 0x01) xbee_logI("Options: Packet Acknowledged"); - if (d[offset] & 0x02) xbee_logI("Options: Packet was a broadcast packet"); - if (d[offset] & 0x20) xbee_logI("Options: Packet Encrypted"); /* ??? */ - if (d[offset] & 0x40) xbee_logI("Options: Packet from end device"); /* ??? */ - } - p->dataPkt = TRUE; - p->txStatusPkt = FALSE; - p->modemStatusPkt = FALSE; - p->remoteATPkt = FALSE; - p->IOPkt = FALSE; - p->type = xbee2_data; - p->sAddr64 = TRUE; - - p->Addr64[0] = d[0]; - p->Addr64[1] = d[1]; - p->Addr64[2] = d[2]; - p->Addr64[3] = d[3]; - p->Addr64[4] = d[4]; - p->Addr64[5] = d[5]; - p->Addr64[6] = d[6]; - p->Addr64[7] = d[7]; - - p->Addr16[0] = d[8]; - p->Addr16[1] = d[9]; - - p->status = d[offset]; - - /* copy in the data */ - p->datalen = i - (offset + 1); - for (;i>offset;i--) { - p->data[i-(offset + 1)] = d[i]; - } - - /* ########################################## */ - /* if: Unknown */ - } else { - xbee_logE("Packet type: Unknown (0x%02X)",t); - continue; - } - p->next = NULL; - - /* lock the connection mutex */ - xbee_mutex_lock(xbee->conmutex); - - hasCon = 0; - if (p->isBroadcastADR || p->isBroadcastPAN) { - unsigned char t[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; - /* if the packet was broadcast, search for a broadcast accepting connection */ - con = xbee->conlist; - while (con) { - if (con->type == p->type && - (con->type == xbee_16bitData || con->type == xbee_64bitData) && - ((con->tAddr64 && !memcmp(con->tAddr,t,8)) || - (!con->tAddr64 && !memcmp(con->tAddr,t,2)))) { - hasCon = 1; - xbee_logI("Found broadcasting connection @ 0x%08X",con); - break; - } - con = con->next; - } - } - if (!hasCon || !con) { - con = xbee->conlist; - while (con) { - if (xbee_matchpktcon(xbee, p, con)) { - hasCon = 1; - break; - } - con = con->next; - } - } - - /* unlock the connection mutex */ - xbee_mutex_unlock(xbee->conmutex); - - /* if the packet doesn't have a connection, don't add it! */ - if (!hasCon) { - xbee_logE("Connectionless packet... discarding!"); - continue; - } - - /* if the connection has a callback function then it is passed the packet - and the packet is not added to the list */ - if (con && con->callback) { - t_callback_list *l, *q; - - xbee_mutex_lock(con->callbackListmutex); - l = con->callbackList; - q = NULL; - while (l) { - q = l; - l = l->next; - } - l = Xcalloc(sizeof(t_callback_list)); - l->pkt = p; - if (!con->callbackList || q == NULL) { - con->callbackList = l; - } else { - q->next = l; - } - xbee_mutex_unlock(con->callbackListmutex); - - xbee_logI("Using callback function!"); - xbee_logI(" info block @ 0x%08X",l); - xbee_logI(" function @ 0x%08X",con->callback); - xbee_logI(" connection @ 0x%08X",con); - xbee_logE(" packet @ 0x%08X",p); - - /* if the callback thread not still running, then start a new one! */ - if (!xbee_mutex_trylock(con->callbackmutex)) { - xbee_thread_t t; - int ret; - t_threadList *p, *q; - t_CBinfo info; - info.xbee = xbee; - info.con = con; - xbee_log("Starting new callback thread!"); - if ((ret = xbee_thread_create(t,xbee_callbackWrapper,&info)) != 0) { - xbee_mutex_unlock(con->callbackmutex); - /* this MAY help with future attempts... */ - xbee_sem_post(xbee->threadsem); - xbee_logS("An error occured while starting thread (%d)... Out of resources?", ret); - xbee_logE("This packet has been lost!"); - continue; - } - xbee_log("Started thread 0x%08X!", t); - xbee_mutex_lock(xbee->threadmutex); - p = xbee->threadList; - q = NULL; - while (p) { - q = p; - p = p->next; - } - p = Xcalloc(sizeof(t_threadList)); - if (q == NULL) { - xbee->threadList = p; - } else { - q->next = p; - } - p->thread = t; - p->next = NULL; - xbee_mutex_unlock(xbee->threadmutex); - } else { - xbee_logE("Using existing callback thread... callback has been scheduled."); - } - /* prevent the packet from being free'd */ - p = NULL; - continue; - } - - /* lock the packet mutex, so we can safely add the packet to the list */ - xbee_mutex_lock(xbee->pktmutex); - - /* if: the list is empty */ - if (!xbee->pktlist) { - /* start the list! */ - xbee->pktlist = p; - } else if (xbee->pktlast) { - /* add the packet to the end */ - xbee->pktlast->next = p; - } else { - /* pktlast wasnt set... look for the end and then set it */ - i = 0; - q = xbee->pktlist; - while (q->next) { - q = q->next; - i++; - } - q->next = p; - xbee->pktcount = i; - } - xbee->pktlast = p; - xbee->pktcount++; - - /* unlock the packet mutex */ - xbee_mutex_unlock(xbee->pktmutex); - - xbee_logI("--========================--"); - xbee_logE("Packets: %d",xbee->pktcount); - - p = q = NULL; - } - return 0; -} - -static void xbee_callbackWrapper(t_CBinfo *info) { - xbee_hnd xbee; - xbee_con *con; - xbee_pkt *pkt; - t_callback_list *temp; - xbee = info->xbee; - con = info->con; - /* dont forget! the callback mutex is already locked... by the parent thread :) */ - xbee_mutex_lock(con->callbackListmutex); - while (con->callbackList) { - /* shift the list along 1 */ - temp = con->callbackList; - con->callbackList = temp->next; - xbee_mutex_unlock(con->callbackListmutex); - /* get the packet */ - pkt = temp->pkt; - - xbee_logS("Starting callback function..."); - xbee_logI(" info block @ 0x%08X",temp); - xbee_logI(" function @ 0x%08X",con->callback); - xbee_logI(" connection @ 0x%08X",con); - xbee_logE(" packet @ 0x%08X",pkt); - Xfree(temp); - if (con->callback) { - con->callback(con,pkt); - xbee_log("Callback complete!"); - if (!con->noFreeAfterCB) Xfree(pkt); - } else { - xbee_pkt *q; - int i; - xbee_log("Callback function was removed! Appending packet to main list..."); - /* lock the packet mutex, so we can safely add the packet to the list */ - xbee_mutex_lock(xbee->pktmutex); - - /* if: the list is empty */ - if (!xbee->pktlist) { - /* start the list! */ - xbee->pktlist = pkt; - } else if (xbee->pktlast) { - /* add the packet to the end */ - xbee->pktlast->next = pkt; - } else { - /* pktlast wasnt set... look for the end and then set it */ - i = 0; - q = xbee->pktlist; - while (q->next) { - q = q->next; - i++; - } - q->next = pkt; - xbee->pktcount = i; - } - xbee->pktlast = pkt; - xbee->pktcount++; - - /* unlock the packet mutex */ - xbee_mutex_unlock(xbee->pktmutex); - } - - xbee_mutex_lock(con->callbackListmutex); - } - xbee_mutex_unlock(con->callbackListmutex); - - xbee_log("Callback thread ending..."); - /* releasing the thread mutex is the last thing we do! */ - xbee_mutex_unlock(con->callbackmutex); - - if (con->destroySelf) { - _xbee_endcon2(xbee,&con,1); - } - xbee_sem_post(xbee->threadsem); -} - -/* ################################################################# - xbee_thread_watch - INTERNAL - watches for dead threads and tidies up */ -static void xbee_thread_watch(xbee_hnd xbee) { - -#ifdef _WIN32 /* ---- */ - /* win32 requires this delay... no idea why */ - usleep(1000000); -#endif /* ----------- */ - - xbee_mutex_init(xbee->threadmutex); - xbee_sem_init(xbee->threadsem); - - while (xbee->run) { - t_threadList *p, *q, *t; - xbee_mutex_lock(xbee->threadmutex); - p = xbee->threadList; - q = NULL; - - while (p) { - t = p; - p = p->next; - if (!(xbee_thread_tryjoin(t->thread))) { - xbee_log("Joined with thread 0x%08X...",t->thread); - if (t == xbee->threadList) { - xbee->threadList = t->next; - } else if (q) { - q->next = t->next; - } - free(t); - } else { - q = t; - } - } - - xbee_mutex_unlock(xbee->threadmutex); - xbee_sem_wait(xbee->threadsem); - usleep(100000); /* 100ms to allow the thread to end before we try to join */ - } - - xbee_mutex_destroy(xbee->threadmutex); - xbee_sem_destroy(xbee->threadsem); -} - - -/* ################################################################# - xbee_getbyte - INTERNAL - waits for an escaped byte of data */ -static unsigned char xbee_getbyte(xbee_hnd xbee) { - unsigned char c; - - /* take a byte */ - c = xbee_getrawbyte(xbee); - /* if its escaped, take another and un-escape */ - if (c == 0x7D) c = xbee_getrawbyte(xbee) ^ 0x20; - - return (c & 0xFF); -} - -/* ################################################################# - xbee_getrawbyte - INTERNAL - waits for a raw byte of data */ -static unsigned char xbee_getrawbyte(xbee_hnd xbee) { - int ret; - unsigned char c = 0x00; - - /* the loop is just incase there actually isnt a byte there to be read... */ - do { - /* wait for a read to be possible */ - if ((ret = xbee_select(xbee,NULL)) == -1) { - xbee_perror("libxbee:xbee_getrawbyte()"); - exit(1); - } - if (!xbee->run) break; - if (ret == 0) continue; - - /* read 1 character */ - if (xbee_read(xbee,&c,1) == 0) { - /* for some reason no characters were read... */ - if (xbee_ferror(xbee) || xbee_feof(xbee)) { - xbee_log("Error or EOF detected"); - fprintf(stderr,"libxbee:xbee_read(): Error or EOF detected\n"); - exit(1); /* this should have something nicer... */ - } - /* no error... try again */ - usleep(10); - continue; - } - } while (0); - - return (c & 0xFF); -} - -/* ################################################################# - _xbee_send_pkt - INTERNAL - sends a complete packet of data */ -static int _xbee_send_pkt(xbee_hnd xbee, t_data *pkt, xbee_con *con) { - int retval = 0; - - /* lock connection mutex */ - xbee_mutex_lock(con->Txmutex); - /* lock the send mutex */ - xbee_mutex_lock(xbee->sendmutex); - - /* write and flush the data */ - xbee_write(xbee,pkt->data,pkt->length); - - /* unlock the mutex */ - xbee_mutex_unlock(xbee->sendmutex); - - xbee_logSf(); - if (xbee->log) { - int i,x,y; - /* prints packet in hex byte-by-byte */ - xbee_logIc("TX Packet:"); - for (i=0,x=0,y=0;ilength;i++,x--) { - if (x == 0) { - fprintf(xbee->log,"\n 0x%04X | ",y); - x = 0x8; - y += x; - } - if (x == 4) { - fprintf(xbee->log," "); - } - fprintf(xbee->log,"0x%02X ",pkt->data[i]); - } - xbee_logIcf(); - } - xbee_logEf(); - - if (con->waitforACK && - ((con->type == xbee_16bitData) || - (con->type == xbee_64bitData))) { - con->ACKstatus = 0xFF; /* waiting */ - xbee_log("Waiting for ACK/NAK response..."); - xbee_sem_wait1sec(con->waitforACKsem); - switch (con->ACKstatus) { - case 0: xbee_log("ACK recieved!"); break; - case 1: xbee_log("NAK recieved..."); break; - case 2: xbee_log("CCA failure..."); break; - case 3: xbee_log("Purged..."); break; - case 255: default: xbee_log("Timeout..."); - } - if (con->ACKstatus) retval = 1; /* error */ - } - - /* unlock connection mutex */ - xbee_mutex_unlock(con->Txmutex); - - /* free the packet */ - Xfree(pkt); - - return retval; -} - -/* ################################################################# - xbee_make_pkt - INTERNAL - adds delimiter field - calculates length and checksum - escapes bytes */ -static t_data *xbee_make_pkt(xbee_hnd xbee, unsigned char *data, int length) { - t_data *pkt; - unsigned int l, i, o, t, x, m; - char d = 0; - - /* check the data given isnt too long - 100 bytes maximum payload + 12 bytes header information */ - if (length > 100 + 12) return NULL; - - /* calculate the length of the whole packet - start, length (MSB), length (LSB), DATA, checksum */ - l = 3 + length + 1; - - /* prepare memory */ - pkt = Xcalloc(sizeof(t_data)); - - /* put start byte on */ - pkt->data[0] = 0x7E; - - /* copy data into packet */ - for (t = 0, i = 0, o = 1, m = 1; i <= length; o++, m++) { - /* if: its time for the checksum */ - if (i == length) d = M8((0xFF - M8(t))); - /* if: its time for the high length byte */ - else if (m == 1) d = M8(length >> 8); - /* if: its time for the low length byte */ - else if (m == 2) d = M8(length); - /* if: its time for the normal data */ - else if (m > 2) d = data[i]; - - x = 0; - /* check for any escapes needed */ - if ((d == 0x11) || /* XON */ - (d == 0x13) || /* XOFF */ - (d == 0x7D) || /* Escape */ - (d == 0x7E)) { /* Frame Delimiter */ - l++; - pkt->data[o++] = 0x7D; - x = 1; - } - - /* move data in */ - pkt->data[o] = ((!x)?d:d^0x20); - if (m > 2) { - i++; - t += d; - } - } - - /* remember the length */ - pkt->length = l; - - return pkt; -} diff --git a/libs/thirdParty/libxbee/api.h b/libs/thirdParty/libxbee/api.h deleted file mode 100644 index 692bd7b16..000000000 --- a/libs/thirdParty/libxbee/api.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -#include -#include - -#include - -#include -#include -#include -#include - -#ifdef __GNUC__ /* ---- */ -#include -#include -#define __USE_GNU -#include -#undef __USE_GNU -#include -#else /* -------------- */ -#include -#include -#include -#include -#endif /* ------------- */ - -#ifdef __UMAKEFILE - #define HOST_OS "Embedded" -#elif defined(__GNUC__) - #define HOST_OS "Linux" -#elif defined(_WIN32) - #define HOST_OS "Win32" -#else - #define HOST_OS "UNKNOWN" -#endif - -#define TRUE 1 -#define FALSE 0 - -#define M8(x) (x & 0xFF) - -/* various connection types */ -#define XBEE_LOCAL_AT 0x88 -#define XBEE_LOCAL_ATREQ 0x08 -#define XBEE_LOCAL_ATQUE 0x09 - -#define XBEE_REMOTE_AT 0x97 -#define XBEE_REMOTE_ATREQ 0x17 - -#define XBEE_MODEM_STATUS 0x8A - -/* XBee Series 1 stuff */ -#define XBEE_TX_STATUS 0x89 -#define XBEE_64BIT_DATATX 0x00 -#define XBEE_64BIT_DATARX 0x80 -#define XBEE_16BIT_DATATX 0x01 -#define XBEE_16BIT_DATARX 0x81 -#define XBEE_64BIT_IO 0x82 -#define XBEE_16BIT_IO 0x83 - -/* XBee Series 2 stuff */ -#define XBEE2_DATATX 0x10 -#define XBEE2_DATARX 0x90 -#define XBEE2_TX_STATUS 0x8B - -typedef struct xbee_hnd* xbee_hnd; - -#define __LIBXBEE_API_H -#include "xbee.h" - -typedef struct t_threadList t_threadList; -struct t_threadList { - xbee_thread_t thread; - t_threadList *next; -}; - -struct xbee_hnd { - xbee_file_t tty; -#ifdef __GNUC__ /* ---- */ - int ttyfd; -#else /* -------------- */ - int ttyr; - int ttyw; - int ttyeof; - - OVERLAPPED ttyovrw; - OVERLAPPED ttyovrr; - OVERLAPPED ttyovrs; -#endif /* ------------- */ - - char *path; /* serial port path */ - - xbee_mutex_t logmutex; - FILE *log; - int logfd; - - xbee_mutex_t conmutex; - xbee_con *conlist; - - xbee_mutex_t pktmutex; - xbee_pkt *pktlist; - xbee_pkt *pktlast; - int pktcount; - - xbee_mutex_t sendmutex; - - xbee_thread_t listent; - - xbee_thread_t threadt; - xbee_mutex_t threadmutex; - xbee_sem_t threadsem; - t_threadList *threadList; - - int run; - - int oldAPI; - char cmdSeq; - int cmdTime; - - /* ready flag. - needs to be set to -1 so that the listen thread can begin. */ - volatile int xbee_ready; - - xbee_hnd next; -}; -xbee_hnd default_xbee = NULL; -xbee_mutex_t xbee_hnd_mutex; - -typedef struct t_data t_data; -struct t_data { - unsigned char data[128]; - unsigned int length; -}; - -typedef struct t_LTinfo t_LTinfo; -struct t_LTinfo { - int i; - xbee_hnd xbee; -}; - -typedef struct t_CBinfo t_CBinfo; -struct t_CBinfo { - xbee_hnd xbee; - xbee_con *con; -}; - -typedef struct t_callback_list t_callback_list; -struct t_callback_list { - xbee_pkt *pkt; - t_callback_list *next; -}; - -static void *Xmalloc2(xbee_hnd xbee, size_t size); -static void *Xcalloc2(xbee_hnd xbee, size_t size); -static void *Xrealloc2(xbee_hnd xbee, void *ptr, size_t size); -static void Xfree2(void **ptr); -#define Xmalloc(x) Xmalloc2(xbee,(x)) -#define Xcalloc(x) Xcalloc2(xbee,(x)) -#define Xrealloc(x,y) Xrealloc2(xbee,(x),(y)) -#define Xfree(x) Xfree2((void **)&x) - -/* usage: - xbee_logSf() lock the log - xbee_logEf() unlock the log - - xbee_log() lock print with \n unlock # to print a single line - xbee_logc() lock print with no \n # to print a single line with a custom ending - xbee_logcf() print \n unlock # to end a custom-ended single line - - xbee_logS() lock print with \n # to start a continuous block - xbee_logI() print with \n # to continue a continuous block - xbee_logIc() print with no \n # to continue a continuous block with a custom ending - xbee_logIcf() print \n # to continue a continuous block with ended custom-ended line - xbee_logE() print with \n unlock # to end a continuous block -*/ -static void xbee_logf(xbee_hnd xbee, const char *logformat, const char *file, - const int line, const char *function, char *format, ...); -#define LOG_FORMAT "[%s:%d] %s(): %s" - -#define xbee_logSf() if (xbee->log) { xbee_mutex_lock(xbee->logmutex); } -#define xbee_logEf() if (xbee->log) { xbee_mutex_unlock(xbee->logmutex); } - -#define xbee_log(...) if (xbee->log) { xbee_logSf(); xbee_logf(xbee,LOG_FORMAT"\n",__FILE__,__LINE__,__FUNCTION__,__VA_ARGS__); xbee_logEf(); } -#define xbee_logc(...) if (xbee->log) { xbee_logSf(); xbee_logf(xbee,LOG_FORMAT ,__FILE__,__LINE__,__FUNCTION__,__VA_ARGS__); } -#define xbee_logcf() if (xbee->log) { fprintf(xbee->log, "\n"); xbee_logEf(); } - -#define xbee_logS(...) if (xbee->log) { xbee_logSf(); xbee_logf(xbee,LOG_FORMAT"\n",__FILE__,__LINE__,__FUNCTION__,__VA_ARGS__); } -#define xbee_logI(...) if (xbee->log) { xbee_logf(xbee,LOG_FORMAT"\n",__FILE__,__LINE__,__FUNCTION__,__VA_ARGS__); } -#define xbee_logIc(...) if (xbee->log) { xbee_logf(xbee,LOG_FORMAT ,__FILE__,__LINE__,__FUNCTION__,__VA_ARGS__); } -#define xbee_logIcf() if (xbee->log) { fprintf(xbee->log, "\n"); } -#define xbee_logE(...) if (xbee->log) { xbee_logf(xbee,LOG_FORMAT"\n",__FILE__,__LINE__,__FUNCTION__,__VA_ARGS__); xbee_logEf(); } - -#define xbee_perror(str) \ - if (xbee->log) xbee_logI("%s:%s",str,strerror(errno)); \ - perror(str); - -static int xbee_startAPI(xbee_hnd xbee); - -static int xbee_sendAT(xbee_hnd xbee, char *command, char *retBuf, int retBuflen); -static int xbee_sendATdelay(xbee_hnd xbee, int guardTime, char *command, char *retBuf, int retBuflen); - -static int xbee_parse_io(xbee_hnd xbee, xbee_pkt *p, unsigned char *d, - int maskOffset, int sampleOffset, int sample); - -static void xbee_thread_watch(xbee_hnd xbee); -static void xbee_listen_wrapper(xbee_hnd xbee); -static int xbee_listen(xbee_hnd xbee); -static unsigned char xbee_getbyte(xbee_hnd xbee); -static unsigned char xbee_getrawbyte(xbee_hnd xbee); -static int xbee_matchpktcon(xbee_hnd xbee, xbee_pkt *pkt, xbee_con *con); - -static t_data *xbee_make_pkt(xbee_hnd xbee, unsigned char *data, int len); -static int _xbee_send_pkt(xbee_hnd xbee, t_data *pkt, xbee_con *con); -static void xbee_callbackWrapper(t_CBinfo *info); - -/* these functions can be found in the xsys files */ -static int init_serial(xbee_hnd xbee, int baudrate); -static int xbee_select(xbee_hnd xbee, struct timeval *timeout); - -#ifdef __GNUC__ /* ---- */ -#include "xsys/linux.c" -#else /* -------------- */ -#include "xsys\win32.c" -#endif /* ------------- */ - -#ifndef Win32Message -#define Win32Message() -#endif - -#define ISREADY(a) if (!xbee || !xbee->xbee_ready) { \ - if (stderr) fprintf(stderr,"libxbee: Run xbee_setup() first!...\n"); \ - Win32Message(); \ - a; \ - } -#define ISREADYP() ISREADY(return) -#define ISREADYR(a) ISREADY(return a) diff --git a/libs/thirdParty/libxbee/doc/man/man3/libxbee.3.html b/libs/thirdParty/libxbee/doc/man/man3/libxbee.3.html deleted file mode 100644 index 57b7f6a0c..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/libxbee.3.html +++ /dev/null @@ -1,127 +0,0 @@ -Manpage of LIBXBEE - -

LIBXBEE

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -libxbee -  -

DESCRIPTION

- -libxbee is a C library to aid the use of Series 1 Digi XBee radios running in API mode (AP=2). -

-I have tried to keep flexibility to a maximum. -By allowing connections to individual nodes to be created you don't have to address each packet, -or filter through incomming packets to get at the one you are after. This is all taken care of -for you by -libxbee! - -

-libxbee is still in development, so if you find any bugs or have any enhancement requests, please -feel free to submit an issue on the project page: - -

-http://code.google.com/p/libxbee/
-
- - -or contact me (Attie) directly: - -
-attie@attie.co.uk
-
- - -  -

MAN PAGES

- -Documentation is avaliable via the following man pages, or by example in the 'sample' folder in the SVN repository - -

-xbee_pkt(3) - libxbee's packet structure - -xbee_con(3) - libxbee's connection structure - -

-xbee_setup(3) - function to setup libxbee (and its variants) - -xbee_end(3) - function to end the libxbee session and close any open handles - -

-xbee_logit(3) - function that allows the user to add to the xbee log output - -

-xbee_newcon(3) - function to create a new connection - -xbee_flushcon(3) - function to flush packets from a connection - -xbee_endcon(3) - function to end a connection - -

-xbee_senddata(3) - function to send data to a remote XBee (and its variants) - -xbee_getpacket(3) - function to get a packet from a connection (and its variants) - -

-xbee_hasdigital(3) - function to check if digital sample is in the packet - -xbee_getdigital(3) - function to get digital sample from the packet - -

-xbee_hasanalog(3) - function to check if analog sample is in the packet - -xbee_getanalog(3) - function to get the analog sample from the packet - - - -  -

SEE ALSO

- -xbee_pkt(3), - -xbee_con(3), - -xbee_setup(3), - -xbee_end(3), - -xbee_logit(3), - -xbee_newcon(3), - -xbee_flushcon(3), - -xbee_endcon(3), - -xbee_senddata(3), - -xbee_getpacket(3), - -xbee_hasdigital(3), - -xbee_getdigital(3), - -xbee_hasanalog(3), - -xbee_getanalog(3) - -

- -


- 

Index

-
-
NAME
-
DESCRIPTION
-
MAN PAGES
-
SEE ALSO
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_con.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_con.3.html deleted file mode 100644 index 9990d7f2e..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_con.3.html +++ /dev/null @@ -1,26 +0,0 @@ -Manpage of LIBXBEE - -

LIBXBEE

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -libxbee -

-This page has not been written yet... -

- -


- 

Index

-
-
NAME
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_end.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_end.3.html deleted file mode 100644 index 7eaa6c270..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_end.3.html +++ /dev/null @@ -1,27 +0,0 @@ -Manpage of LIBXBEE - -

LIBXBEE

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -libxbee -

-This page has not been written yet... -

-

- -


- 

Index

-
-
NAME
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_endcon.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_endcon.3.html deleted file mode 100644 index d7250a3cc..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_endcon.3.html +++ /dev/null @@ -1,4 +0,0 @@ -Invalid Manpage - -

Invalid Manpage

-The requested file ./man/man3/xbee_endcon.3 is not a valid (unformatted) man page. diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_flushcon.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_flushcon.3.html deleted file mode 100644 index 1d046d792..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_flushcon.3.html +++ /dev/null @@ -1,4 +0,0 @@ -Invalid Manpage - -

Invalid Manpage

-The requested file ./man/man3/xbee_flushcon.3 is not a valid (unformatted) man page. diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_getanalog.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_getanalog.3.html deleted file mode 100644 index 1883c3262..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_getanalog.3.html +++ /dev/null @@ -1,140 +0,0 @@ -Manpage of XBEE_GETPACKET - -

XBEE_GETPACKET

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -xbee_hasanalog, xbee_getanalog -  -

SYNOPSIS

- -#include <xbee.h> - -

-int xbee_hasanalog(xbee_pkt *pkt,int sample, int input); - -

-double xbee_getanalog(xbee_pkt *pkt,int sample, int input, double Vref); - - -  -

DESCRIPTION

- -The -xbee_hasanalog() - -function will check the packet for the presence of an analog sample on the specified input. -

-The -xbee_getanalog() - -function will read the packet and return the sample value for the specified analog input. -

-They both take 3 arguments, with the same purposes. -

-The argument -pkt - -points to a packet that was previously retrieved with -xbee_getpacket() - -

-The argument -sample - -selects the sample within the packet to use. -

-The argument -input - -specifies which input you are interested in testing. -

-xbee_getanalog() - -also takes a fourth argument that allows you to provide a -Vref - -value. This allows the function to convert the raw ADC value into a voltage for you. -  -

RETURN VALUE

- -The -xbee_hasanalog() - -function will return -1 - -if the provided packet has sample data for the specified input, otherwise -0. - -

-The -xbee_getanalog() - -function will return the raw ADC value (0 - 1023) if the provided packet has sample data for the specified input and Vref was given as zero. -If Vref was non-zero, then the return value will be the voltage read. -A --1 - -will be returned if the packet does not contain sample data. -

-  -

EXAMPLE

- -To read sample data from previously made connection: - -
-#include <xbee.h>
-xbee_pkt *pkt;
-double Vref = 3.3;
-if ((pkt = xbee_getpacket(con)) != NULL) {
-  if (xbee_hasanalog(pkt,0,0)) {
-    printf("A0 read %fv,xbee_getanalog(pkt,0,0,Vref));
-  } else {
-    printf("No A0 data);
-  }
-  free(pkt);
-}
-
- - -  -

AUTHOR

- -Attie Grande <attie@attie.co.uk> -  -

SEE ALSO

- -libxbee(3), - -xbee_pkt(3), - -xbee_getpacket(3), - -xbee_hasdigital(3), - -xbee_getdigital(3) - -

- -


- 

Index

-
-
NAME
-
SYNOPSIS
-
DESCRIPTION
-
RETURN VALUE
-
EXAMPLE
-
AUTHOR
-
SEE ALSO
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_getdigital.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_getdigital.3.html deleted file mode 100644 index 2df913622..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_getdigital.3.html +++ /dev/null @@ -1,134 +0,0 @@ -Manpage of XBEE_GETPACKET - -

XBEE_GETPACKET

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -xbee_hasdigital, xbee_getdigital -  -

SYNOPSIS

- -#include <xbee.h> - -

-int xbee_hasdigital(xbee_pkt *pkt, int sample, int input); - -

-int xbee_getdigital(xbee_pkt *pkt, int sample, int input); - - -  -

DESCRIPTION

- -The -xbee_hasdigital() - -function will check the packet for the presence of a given sample on the specified input. -

-The -xbee_getdigital() - -function will read the packet and return the sample value for the specified input. -

-They both take 3 arguments, with the same purposes. -

-The argument -pkt - -points to a packet that was previously retrieved with -xbee_getpacket() - -

-The argument -sample - -selects the sample within the packet to use. -

-The argument -input - -specifies which input you are interested in testing. -  -

RETURN VALUE

- -The -xbee_hasdigital() - -function will return -1 - -if the provided packet has sample data for the specified input, otherwise -0. - -

-The -xbee_getdigital() - -function will return -1 - -if the provided packet has sample data for the specified input and the sample was HIGH. -A -0 - -will be returned if the sample was LOW, or the packet does not contain sample data. -

-  -

EXAMPLE

- -To read sample data from previously made connection: - -
-#include <xbee.h>
-xbee_pkt *pkt;
-if ((pkt = xbee_getpacket(con)) != NULL) {
-  if (xbee_hasdigital(pkt,0,0)) {
-    printf("D0 read %d,xbee_getdigital(pkt,0));
-  } else {
-    printf("No D0 data);
-  }
-  free(pkt);
-}
-
- - -  -

AUTHOR

- -Attie Grande <attie@attie.co.uk> -  -

SEE ALSO

- -libxbee(3), - -xbee_pkt(3), - -xbee_getpacket(3), - -xbee_hasanalog(3), - -xbee_getanalog(3) - -

- -


- 

Index

-
-
NAME
-
SYNOPSIS
-
DESCRIPTION
-
RETURN VALUE
-
EXAMPLE
-
AUTHOR
-
SEE ALSO
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_getpacket.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_getpacket.3.html deleted file mode 100644 index 45063f773..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_getpacket.3.html +++ /dev/null @@ -1,130 +0,0 @@ -Manpage of XBEE_GETPACKET - -

XBEE_GETPACKET

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -xbee_getpacket -  -

SYNOPSIS

- -#include <xbee.h> - -

-xbee_pkt *xbee_getpacket(xbee_con *con); - -

-xbee_pkt *xbee_getpacketwait(xbee_con *con); - - -  -

DESCRIPTION

- -The -xbee_getpacket() - -function will return the next avaliable packet for the provided connection. -It takes 1 argument. -

-The argument -con - -points to a connection made previously with -xbee_newcon(). - -

-The -xbee_getpacketwait() - -function behaves the same, but will wait for an internally specified time for a packet to arrive (currently around 1 second). -  -

RETURN VALUE

- -Upon successful return, this function returns the packet, having unlinked it from the internal list of packets. -You must keep hold of the packet until you are finished with it, and then you must -free() - -it to prevent memory leaks. -

-If a packet was not avaliable for the provided connection, a -NULL - -is returned. -

-If an error occured a -NULL - -is also returned (though unlikely). -

-For more information on the structure of the packet, please see -xbee_pkt(3) - -

-For information on using callback functions with connections instead, please see -xbee_con(3) - -  -

EXAMPLE

- -To recieve a packet from a previously made connection: - -
-#include <xbee.h>
-xbee_pkt *pkt;
-if ((pkt = xbee_getpacket(con)) != NULL) {
-  /* process packet... */
-  free(pkt);
-}
-
- - -  -

AUTHOR

- -Attie Grande <attie@attie.co.uk> -  -

SEE ALSO

- -libxbee(3), - -xbee_setup(3), - -xbee_newcon(3), - -xbee_senddata(3), - -xbee_pkt(3), - -xbee_con(3), - -xbee_hasDigital(3), - -xbee_getDigital(3), - -xbee_hasAnalog(3), - -xbee_getAnalog(3) - -

- -


- 

Index

-
-
NAME
-
SYNOPSIS
-
DESCRIPTION
-
RETURN VALUE
-
EXAMPLE
-
AUTHOR
-
SEE ALSO
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_hasanalog.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_hasanalog.3.html deleted file mode 100644 index e2c495c41..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_hasanalog.3.html +++ /dev/null @@ -1,4 +0,0 @@ -Invalid Manpage - -

Invalid Manpage

-The requested file ./man/man3/xbee_hasanalog.3 is not a valid (unformatted) man page. diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_hasdigital.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_hasdigital.3.html deleted file mode 100644 index 9774f4081..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_hasdigital.3.html +++ /dev/null @@ -1,4 +0,0 @@ -Invalid Manpage - -

Invalid Manpage

-The requested file ./man/man3/xbee_hasdigital.3 is not a valid (unformatted) man page. diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_logit.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_logit.3.html deleted file mode 100644 index 7eaa6c270..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_logit.3.html +++ /dev/null @@ -1,27 +0,0 @@ -Manpage of LIBXBEE - -

LIBXBEE

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -libxbee -

-This page has not been written yet... -

-

- -


- 

Index

-
-
NAME
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_newcon.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_newcon.3.html deleted file mode 100644 index 32f085b26..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_newcon.3.html +++ /dev/null @@ -1,201 +0,0 @@ -Manpage of XBEE_NEWCON - -

XBEE_NEWCON

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -xbee_newcon -  -

SYNOPSIS

- -#include <xbee.h> - -

-xbee_con *xbee_newcon(unsigned char frameID, xbee_types type, ...); - -

-void xbee_flushcon(xbee_con *con); - -

-void xbee_endcon(xbee_con *con); - - -  -

DESCRIPTION

- -The -xbee_newcon() - -function will setup a new connection with the specified settings. -It takes at least 2 arguments, and possibly up to 4 depending on the -type. - -

-NOTE: - -Packets will only be collected when they match an active connection. -You must setup a connection in order to recieve packets. -

-The argument -frameID - -allows similar functionality to that of TCP/IP port numbers. This is 1 character (or 8-bit integer) that -identifies where the data is coming from or going to. - -The -type - -specifies the type of connection you would like. The following types are avaliable: -

-
xbee_localAT - -
-communicates AT commands with the local XBee -
xbee_txStatus - -
-recieves transmit status information from the local XBee -
xbee_modemStatus - -
-recieves modem status information from the local XBee -
xbee_16bitRemoteAT - -
-communicates AT commands with a remote node (using 16-bit addressing) -
xbee_64bitRemoteAT - -
-communicates AT commands with a remote node (using 64-bit addressing) -
xbee_16bitData - -
-sends/recieves data through a remote node (using 16-bit addressing) -
xbee_64bitData - -
-sends/recieves data through a remote node (using 64-bit addressing) -
xbee_16bitIO - -
-sends/recieves I/O data through a remote node (using 16-bit addressing) -
xbee_64bitIO - -
-sends/recieves I/O data through a remote node (using 64-bit addressing) -
-

- -If you are using -xbee_localAT, xbee_txStatus or xbee_modemStatus - -then only the -frameID - -and -type - -arguments are required. -

-If you are using any 16-bit connection, you must also specify 1 right aligned integer, -containing the 16-bit address (e.g. 0x1234). -

-If you are using any 64-bit connection, you must also specify 2 integers containing the -64-bit address, first the high 32-bits, then the low 32-bits. -

-The -xbee_flushcon() - -function is very basic. It removes any packets that have been collected in the buffer for the specified connection. -

-The -xbee_endcon() - -function is used to end a connection. This will stop collecting packets for the given connection, and remove any packets from the buffer. -  -

RETURN VALUE

- -A pointer to the connection is returned. A connection can only be made once, using the same -type - -, -frameID - -and address (if needed). The second call using the same parameters will return the same -connection. -

-For information on using callback functions for packet handling please see -xbee_con(3) - -  -

EXAMPLE

- -To create a local AT connection: - -
-#include <xbee.h>
-xbee_con *con;
-con = xbee_newcon('A', xbee_localAT);
-
- - -

-To create a 16-bit Data connection: - -

-#include <xbee.h>
-xbee_con *con;
-con = xbee_newcon('A', xbee_16bitData, 0x1234);
-
- - -

-To create a 64-bit Data connection: - -

-#include <xbee.h>
-xbee_con *con;
-con = xbee_newcon('A', xbee_64bitData, 0x0013A200, 0x40081826);
-
- - -  -

AUTHOR

- -Attie Grande <attie@attie.co.uk> -  -

SEE ALSO

- -libxbee(3), - -xbee_setup(3), - -xbee_getpacket(3), - -xbee_con(3), - -xbee_senddata(3) - -

- -


- 

Index

-
-
NAME
-
SYNOPSIS
-
DESCRIPTION
-
RETURN VALUE
-
EXAMPLE
-
AUTHOR
-
SEE ALSO
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_nsenddata.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_nsenddata.3.html deleted file mode 100644 index 3da3c6f21..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_nsenddata.3.html +++ /dev/null @@ -1,4 +0,0 @@ -Invalid Manpage - -

Invalid Manpage

-The requested file ./man/man3/xbee_nsenddata.3 is not a valid (unformatted) man page. diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_pkt.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_pkt.3.html deleted file mode 100644 index 1859405aa..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_pkt.3.html +++ /dev/null @@ -1,107 +0,0 @@ -Manpage of XBEE_PKT - -

XBEE_PKT

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -xbee_pkt -  -

SYNOPSIS

- -#include <xbee.h> - - -  -

DESCRIPTION

- -This is the packet structure. If you want to get more advanced information from connections (such as RSSI) then this is where it lives. -

- -

-struct xbee_pkt {
-  unsigned char frameID;          /* AT        Status    */
-  unsigned char atCmd[2];         /* AT                  */
-  unsigned char status;           /* AT  Data  Status    */ /* status / options */
-  unsigned char Addr64[8];        /* AT  Data            */
-  unsigned char Addr16[2];        /* AT  Data            */
-  unsigned char data[128];        /* AT  Data            */
-  unsigned char RSSI;             /*     Data            */
-  unsigned int datalen;
-
-  /* X  A5 A4 A3 A2 A1 A0 D8    D7 D6 D5 D4 D3 D2 D1 D0 */
-  unsigned short IOmask;          /*                  IO */
-
-  /* X  X  X  X  X  X  X  D8    D7 D6 D5 D4 D3 D2 D1 D0 */
-  unsigned short IOdata;          /*                  IO */
-
-  /* X  X  X  X  X  D  D  D     D  D  D  D  D  D  D  D  */
-  unsigned short IOanalog[6];     /*                  IO */
-};
-typedef struct xbee_pkt xbee_pkt;
-
- - -

-Most of these fields are fairly self explanatory, however some need attention brought to them -and others need explaining. I will touch on the most important here: -

-
atCmd - -
-This is the 2 character identifier for the AT command response you just recieved. -Of course if you didnt setup an AT connection, you should never see, or try to see data here. -
Addr64 and Addr16 - -
-These contain the address of the XBee that you recieved the packet from. You should really know this -because you setup the connection. However remote AT packets will contain both 16 and 64 bit -addresses. -
data - -
-This is the data you just recieved. Either the AT reponse, or the data from the remote XBee node. -
datalen - -
-Would you be suprised if I told you this is how much data there is?... Dont try and -printf() - -the -data - -as it isn't null terminated. Use this for processing instead. - - -
-  -

AUTHOR

- -Attie Grande <attie@attie.co.uk> -  -

SEE ALSO

- -libxbee(3), - -xbee_getpacket(3) - -

- -


- 

Index

-
-
NAME
-
SYNOPSIS
-
DESCRIPTION
-
AUTHOR
-
SEE ALSO
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_senddata.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_senddata.3.html deleted file mode 100644 index 31baf1c73..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_senddata.3.html +++ /dev/null @@ -1,129 +0,0 @@ -Manpage of XBEE_SENDDATA - -

XBEE_SENDDATA

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -xbee_senddata, xbee_vsenddata -  -

SYNOPSIS

- -#include <xbee.h> - -

-int xbee_senddata(xbee_con *con, char *format, ...); - -

-int xbee_nsenddata(xbee_con *con, char *data, int length); - -

-#include <stdarg.h> - -

-int xbee_vsenddata(xbee_con *con, char *format, va_list ap); - - -  -

DESCRIPTION

- -The -xbee_senddata() - -function will send data via a provided connection. -It takes at least 2 arguments, and possibly more depending on the format string. -

-The argument -con - -points to a connection made previously with -xbee_newcon(). - -

-The -format - -string and any following parameters are passed to -sprintf() - -within these functions. -Please see the -printf(3) - -man page for more information. -

-If you are using -xbee_nsenddata() - -you must provide a character array of the data, and the data's length. -

-If you are using -xbee_vsenddata() - -you must provide a va_list. See -stdarg(3). - -  -

RETURN VALUE

- -Upon successful completion, these functions return 0. -

-If an invalid packet or connection was provided, -1 is returned. -

-If an unknown error occured, -2 is returned. -

-If -con - -has -waitforACK - -enabled, then these functions return 1 when an ACK was not recieved within 1 second. -  -

EXAMPLE

- -To send the string "Hello World!" through a previously made connection: - -
-#include <xbee.h>
-xbee_senddata(con,"Hello World!");
-
- - -  -

AUTHOR

- -Attie Grande <attie@attie.co.uk> -  -

SEE ALSO

- -libxbee(3), - -xbee_setup(3), - -xbee_newcon(3), - -xbee_getpacket(3) - -

- -


- 

Index

-
-
NAME
-
SYNOPSIS
-
DESCRIPTION
-
RETURN VALUE
-
EXAMPLE
-
AUTHOR
-
SEE ALSO
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_setup.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_setup.3.html deleted file mode 100644 index 5b69945a5..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_setup.3.html +++ /dev/null @@ -1,142 +0,0 @@ -Manpage of XBEE_SETUP - -

XBEE_SETUP

-Section: Linux Programmer's Manual (3)
Updated: 2009-11-01
Index -Return to Main Contents
- -  -

NAME

- -xbee_setup -  -

SYNOPSIS

- -#include <xbee.h> - -

-int xbee_setup(char *path, int baudrate); - -

-int xbee_setuplog(char *path, int baudrate, int logfd); - -

-int xbee_setupAPI(char *path, char cmdSeq, int cmdTime); - -

-int xbee_setuplogAPI(char *path, int baudrate, int logfd, char cmdSeq, int cmdTime); - - -  -

DESCRIPTION

- -

-A VERSION OF THIS FUNCTION MUST BE CALLED BEFORE ANY OTHER libxbee FUNCTION! - -The -xbee_setup() - -function will setup libxbee so that it can handle an XBee. -It takes 2 arguments. -

-The argument -path - -is the path to the serial port that the XBee is connected to (e.g. /dev/ttyUSB0). -

-The -baudrate - -is the baud rate that the local XBee is configured to run at. The following are avaliable: - -

-1200
-2400
-4800
-9600
-19200
-38400
-57600
-115200 - this is potentially unstable (read the XBee manual to find out why...)
-
- - -

-Using -xbee_setuplog() - -is exactly the same, but instead you give an open file descriptor. All log messages will be written to this file (you can use stderr or stdout if you want!). -

-Using -xbee_setupAPI() - -is exactly the same, but instead you provide the 'Command Sequence' character and the 'Guard Time' that your local XBee has been configured with. -libxbee will then place your XBee in API mode 2, and when you call xbee_end() it will return your XBee to its previous API mode. -

-Using -xbee_setuplogAPI() - -is simply a combination of -xbee_setuplog() - -and -xbee_setupAPI() - -  -

RETURN VALUE

- -If any error occures, --1 - -is returned. Otherwise -0 - -is returned. -  -

EXAMPLE

- -To setup libxbee to use /dev/ttyUSB0 at 57600 baud: - -
-#include <xbee.h>
-if (xbee_setup("/dev/ttyUSB0",57600) == -1) {
-  printf("Oh no...);
-  exit(1);
-}
-
- - -  -

AUTHOR

- -Attie Grande <attie@attie.co.uk> -  -

SEE ALSO

- -libxbee(3), - -xbee_newcon(3), - -xbee_getpacket(3), - -xbee_senddata(3) - -

- -


- 

Index

-
-
NAME
-
SYNOPSIS
-
DESCRIPTION
-
RETURN VALUE
-
EXAMPLE
-
AUTHOR
-
SEE ALSO
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 00:08:23 GMT, March 30, 2011 - - diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_setupAPI.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_setupAPI.3.html deleted file mode 100644 index 158f1857c..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_setupAPI.3.html +++ /dev/null @@ -1,4 +0,0 @@ -Invalid Manpage - -

Invalid Manpage

-The requested file ./man/man3/xbee_setupAPI.3 is not a valid (unformatted) man page. diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_setuplog.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_setuplog.3.html deleted file mode 100644 index 16accc571..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_setuplog.3.html +++ /dev/null @@ -1,4 +0,0 @@ -Invalid Manpage - -

Invalid Manpage

-The requested file ./man/man3/xbee_setuplog.3 is not a valid (unformatted) man page. diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_setuplogAPI.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_setuplogAPI.3.html deleted file mode 100644 index 801cbfaf9..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_setuplogAPI.3.html +++ /dev/null @@ -1,4 +0,0 @@ -Invalid Manpage - -

Invalid Manpage

-The requested file ./man/man3/xbee_setuplogAPI.3 is not a valid (unformatted) man page. diff --git a/libs/thirdParty/libxbee/doc/man/man3/xbee_vsenddata.3.html b/libs/thirdParty/libxbee/doc/man/man3/xbee_vsenddata.3.html deleted file mode 100644 index 5a9b7d948..000000000 --- a/libs/thirdParty/libxbee/doc/man/man3/xbee_vsenddata.3.html +++ /dev/null @@ -1,4 +0,0 @@ -Invalid Manpage - -

Invalid Manpage

-The requested file ./man/man3/xbee_vsenddata.3 is not a valid (unformatted) man page. diff --git a/libs/thirdParty/libxbee/lib/libxbee.dll b/libs/thirdParty/libxbee/lib/libxbee.dll deleted file mode 100644 index cf1af098e6c3a5fb130ab8d248fe873fe594db94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151552 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 diff --git a/libs/thirdParty/libxbee/lib/libxbee.exp b/libs/thirdParty/libxbee/lib/libxbee.exp deleted file mode 100644 index 1ab830676fc609ead5c1aaab15a204bc98345123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7707 zcmeI1e{38_6~~`rr!iu$?tHe-At{&GgoHSb8z&)@Yn}7$+P>y| zcilVx2r5#cLFym*qeu}15kUn7BDH@+sE7iUh(uJiQY9)8sg0d8 z&CK5JZ1|HukXXgADH0 zT&Cf2d8kl1St(Zw&S-Uk%SQ{P3jZE=r%UyQ>y5kKyz4PJS@FVbg8P|pD-QXpSgoXW zY1(bn3dOT-!!9orN`{rI(_uZOD_7hFbY%*4oI_qcb)MRsH|;jvmbdOU=4!g7=>21d zgGHRvDmE+3`+e~}%k32!jY4r|s8B9X;%*e1oGX=`iBe^%s>+TVt>cvHg~_tJf9QzZ zuO6!ZfK2yw)t_78dc$tL;Z@I#yX7f^9bd>mOQ%zw>ne;9FH{PAf8s#VDPepIWxuQ+ zh;gf8^ZI5A^wi4cA!u#6=+bSv!+a{_T7U2Tk9@u@N+OUvw=!oG>C3;xYGBAV-{3T&O zE@~y%GEo`WoTzrNJ4Iz-_lxQT<1iDWy|4#Ftp{5nDhE3xstb&-Hb%p+{1>A**j=Iy z!G1ziH`ppsBd`ZW^?=J01=QG3BUMLDp1?il63)`*&cJt}G#Y^|s=EQiM!9Rgb?ss?*Z)CkymQ5?znx??m3 z#_={ri?EM~Isvv()Kjp>MV$uQBd=U_iAstgtvbrF`wD@HZ2t)ec$enwOS>^@PKVILK>2)0es^RS;4^%PjQ zs25;)tYh>v*!`lez&sY`dseU<;xy zg6$CXD(s}FOJEO)x&~Vmbs21@sOzwfsOQ0UiFzHDQ=%BX0G1H-ChU}`D`2}ty#+fh z>LswGs2i{|qOO9aM7;xB67@1zTGYF+Pl$R2tXI@c*t4Qu1 zbsel<)CaH?QLlq>ZWg0I!B$1R36>T0SJ;}Ux4;HPeF*!cs2gB=MEwhvv&k5}1NJdd z1XUOHF4SI8ZLojF-#4&~tf!U^NJ``p;rWjjsD!&%!}#y*;5DU{-E#0MQJrt0qotx( ztyiZS@t)(`<0FShkI=ViUk4Qz94hX~pR8l8%X@Q9sd6?yTrJMcx|K#fzu%j5OO5>4 z%y53(#Y$bT7QFnE(?$K~Rp%-W;uC^bIp3HmdCpkDYn(HeMDC(XLwoXLUUk|l%*GFv z%5FX1ypmI;`dpzLA8+8a)p#nINajxsX%FA z1zxu>5fx`xi&nhMYmaFp7sN}w&k-$Ao$s*S!U&Lj4tDVz47R|1@VIor#cRLi;)dxY zR^4m|M*;2iqbhg03cgPEA@FjUpBG00^*qAq86FK^0|y1=Zf0uwNpoyau5i+ZmfZ3B zraP3s!OeHT5yQ-bKq?3C7I-;!1idCnsbkdQ@N*mq`U43bdfO9q^rVXi?Bl2F>`!gD#!d@sr`Xyfx@kS)smTjyHaX&3sXxjw6rq z`l%y#$&a%;=n9;UeH@5Xvp`CTE_tqVK+-XqY1lnPV*#_?!!NDI`LgqBai^O-}N?bGiZcgj&N;MVUdFP9wa!k)mZ z%0W*%n+Y+dE6+d7jTZ# z|FyuAU#y?2=NC$q-ZZ|@Owk{I^3(Y4;gON}?qerU>@fk;!L~S8tj^XFC8s+7b-Hzn z184Bl58ps5)ju~{m_;ZWMX*uCo373C_4BkeMAd3T(U65>9x|SrKItA!;z-e>em{z& z=?RPUl4p?&owrCIU9w0&eaj*Pbk!nRx@M6ey|f%zhq`yU zuN2lPi}X>CMfxdYkpUXANS2OUWRRRNL11ZEBt?rBNz(<3^wMREWaz3z`slhv`sr

^4kc?5@=Sz$ zH9}sDkRL_JYZ3B`2zft3Zbir%tcB)KPG0rRp~zr_j7G>~5pp&{J|7`pj*u%6^5Y2k zd4#+dB7Z~aHe1l(*7LSoPKLMHYUuCgJ3ahW{`olbrw46=R;Fc}O!&^1u;Vqi4_0~+4^_EN(LR&E(1@=Tf^S53W zk>_fzG_=)H6`Nn`WuWDT!dojM<}o)AVnh Cp~Q>; diff --git a/libs/thirdParty/libxbee/lib/libxbee.lib b/libs/thirdParty/libxbee/lib/libxbee.lib deleted file mode 100644 index 7b42cadbaede1530f4c126e5c81306195d19784e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12566 zcmcgx&u<&Y6@HSPI+fK#k?q9RPfDVGOO!;BlpPcWWvhT4%Zed8xiXZvvY0TWAW}+u z>Mii0$SJ3whg_ON4mlJ#q(BZiWlni}HBxL#xY{|xnzm9LegK0rMrbL_H}PE17?dNXQ8KEM)$3C8KHZr%R?e2`vfT zs@3k5tM%eqR%?V2!B{#t_Pk<_N=`x9lu*-aog5Xf`wFI{G*l}Kx-EiMYK=#-KUPa4 zA#0|hovy_<@86Ll4mtnrXJgCTI|O*+zvn#`5T3c32VJl;P^&guUcJ<8HI9sH1Te-`_ukuY)ctwV1eN z61_x1C~HxvHlvz^Vb(_3+wz*NaQ4+bi$C(=_v@EIK%ARc^J) z`-i&LkcDB^rs74m3B#<-@k!l~h#(}VI|wp;cpuGGG%zJvKqjw z~|ri3nP{4qiU;Mvkx+WF>RO$X$LT--8`*}mwB@a7uJzH zfHCd8lWMI}s@4x0M%jg!F6M#7GgDF;%D)t7=GGSNoJ#D#UkkbrvH=BV@qjwdb8{xo z-9V=HnoDeTdBMn`xqtmVu2Ey}5#nFGX}7+23a zF_3*vFjXu#Ka2_Qj;e6u2lHO>YT_-ToZd}tRO6^%t!lzA8ing1?(*3*n{``)ZW60) zAa6$(Wn|*rmMu`>W{s**RP@(73uQyb$k=3|ZQO}X7ZT)1EE8jWiO+T-vn!{y%#&S2 z=OGN$yCep+eJiw&>DKu~@-3gDe&;Bsbl-RJFRJ!0n)a!>bXk!RF>=?9C8z7f3}Oj4 zv*4%Qkx8^)XH$FLPWw6YQAuXjh1=7Z>`_~CMiy8w(saanv3SDm7aM|JOu-Ro++Adf z$$haiV{G+_UAxrQp-mTTP?L!DDD$#5kO^c`Q$2d4WuCgMG!I;r^lZv~wd#j?B*ubP z(ml1aEseMnZ6Oe=$#NhwPZDJl!HzU!RXFrW*bO=o3Wpm7NAJ;8pkN_JDn|qth6lE0 zevPy7)}ch!=^!EtcuWy_W>kXMF74LALYi~)Sq+8E1ww<=Q=Xysx7smemG%o(U?G5` zcJXu6E_;P)pOGFQA>&t?Ke))HmTqUZUZFE7{R;HeQEwM>0Mou^VeOL+;;OleRw^7sq=B26s@SWhv%2asZvFxJj}M%~wMeU9`Fc3LRKI>)euij0ffgzCRWGiC$Q;G* zA{*2!T^hImOxP2@K1kzq@LqNQxY2AJv{G}s^QrASJ9lMm;7^c=hQa`nc6m2||L5c# zW1-@H3v`WgLGbfSg$iO%(s9&(XLcK1*ta&V%>IgR9m4gfMbd5Z`zG?|9ZWu7}pwzd)cKa`ddltgpPDDB+4?eeoY#Upb8ny?^S0 ze?8OLO**4(zbJG%qq&?vp(*h#N-WOp9uc*$O~-Dw-`V{!+r;h@`FqZM3v+pJ6oAkH z9-c8V_ZvFFBn~$d7J{@ zg$O=BkL-#ww-G%?9Fxd%4Sq`0?f7zqXf7Q4;QjTy_7gwR;lpD0iJn{>Q=et>vnXbr zKfpvxdH)nF74XOu#&pp>Gv}zGD?a^d3Gj&(&~N!n_U5`IV@@=>oDRtWHXM%Oq{=)o zlLa#S9nWN(C%#}urgt-(s`EG!v$9_daQO-BGvgZw@cB7!cYJLk|0JH9f%z1lHl`C$JjVJ=E%py}`oRZxq^3Z&nw_O?@dM&`HKgf!2 z#f*pFC*y1rukmpM-z2ohMxDKO!y1=o4l`D90Mivuo6(84(Fo`94|lraYO^jxPCIJ2 z{DUJ-bfznQ%rH5pQr+>zWGv&HkDXC*LUy0bC)-47k+GyWpE*ur4BTImvBj+Oi7=ag zRM!<_OfE5L7@cE4PS?4=#5}(#&UaSNFNQB|_}ueLK0tP#=n2Nte-OBfS#CD|PXBNjaYnURoBONp4WBh;4%${PhC&t~(VjSaqkkOn*KP$$CAfq|y z?us#HjW1e8y$=$n=$x+Orn>-+wwaAK*$89SK`z90CgY2FhIz~AeB)xH>iikT#Ib_mW1I9q G9Q!Xg(NR - 0000:00000003 ___safe_se_handler_count 00000003 - 0000:00000000 ___ImageBase 10000000 - 0001:00000000 _ver@16 10001000 f api.obj - 0001:000000b0 _xbee_UNLOADALL@0 100010b0 f api.obj - 0001:000000e0 _DllMain@12 100010e0 f api.obj - 0001:00000120 _DllCanUnloadNow@0 10001120 f api.obj - 0001:00000140 _RegWriteKey@24 10001140 f api.obj - 0001:00000210 _DllRegisterServer@0 10001210 f api.obj - 0001:000004b0 _DllUnregisterServer@0 100014b0 f api.obj - 0001:00000670 _xbee_write@12 10001670 f api.obj - 0001:00000720 _xbee_read@12 10001720 f api.obj - 0001:000007d0 _xbee_free@4 100017d0 f api.obj - 0001:00000800 _gettimeofday@8 10001800 f api.obj - 0001:000008a0 _xbee_setupDebugAPI@20 100018a0 f api.obj - 0001:000009b0 _xbee_setupDebug@12 100019b0 f api.obj - 0001:000009e0 _xbee_newcon_simple@8 100019e0 f api.obj - 0001:00000a00 _xbee_newcon_16bit@12 10001a00 f api.obj - 0001:00000a30 _xbee_newcon_64bit@16 10001a30 f api.obj - 0001:00000a60 _xbee_enableACKwait@4 10001a60 f api.obj - 0001:00000a80 _xbee_disableACKwait@4 10001a80 f api.obj - 0001:00000aa0 _xbee_enableDestroySelf@4 10001aa0 f api.obj - 0001:00000ac0 _xbee_callback@8 10001ac0 f api.obj - 0001:00000c70 _xbee_runCallback@12 10001c70 f api.obj - 0001:00000ca0 _xbee_enableCallbacks@8 10001ca0 f api.obj - 0001:00000df0 _xbee_attachCallback@4 10001df0 f api.obj - 0001:00000ea0 _xbee_detachCallback@4 10001ea0 f api.obj - 0001:00000f50 _xbee_svn_version@0 10001f50 f api.obj - 0001:00000fc0 _xbee_build_info@0 10001fc0 f api.obj - 0001:00000fd0 _xbee_hasdigital@12 10001fd0 f api.obj - 0001:00001030 _xbee_getdigital@12 10002030 f api.obj - 0001:00001090 _xbee_hasanalog@12 10002090 f api.obj - 0001:000010f0 _xbee_getanalog@20 100020f0 f api.obj - 0001:00001270 _xbee_logitf 10002270 f api.obj - 0001:00001320 __xbee_logitf 10002320 f api.obj - 0001:000013d0 _xbee_logit@4 100023d0 f api.obj - 0001:000013f0 __xbee_logit@8 100023f0 f api.obj - 0001:00001470 _xbee_end@0 10002470 f api.obj - 0001:00001490 __xbee_end@4 10002490 f api.obj - 0001:00001a30 _xbee_setup@8 10002a30 f api.obj - 0001:00001a60 __xbee_setup@8 10002a60 f api.obj - 0001:00001a90 _xbee_setuplog@12 10002a90 f api.obj - 0001:00001ac0 __xbee_setuplog@12 10002ac0 f api.obj - 0001:00001af0 _xbee_setupAPI@16 10002af0 f api.obj - 0001:00001b20 __xbee_setupAPI@16 10002b20 f api.obj - 0001:00001b50 _xbee_setuplogAPI@20 10002b50 f api.obj - 0001:00001ba0 __xbee_setuplogAPI@20 10002ba0 f api.obj - 0001:00003820 _xbee_newcon 10004820 f api.obj - 0001:00003870 __xbee_newcon 10004870 f api.obj - 0001:000038c0 __xbee_vnewcon@16 100048c0 f api.obj - 0001:000043f0 _xbee_purgecon@4 100053f0 f api.obj - 0001:00004410 __xbee_purgecon@8 10005410 f api.obj - 0001:00004590 _xbee_endcon2@8 10005590 f api.obj - 0001:000045c0 __xbee_endcon2@12 100055c0 f api.obj - 0001:00004880 _xbee_senddata 10005880 f api.obj - 0001:000048d0 __xbee_senddata 100058d0 f api.obj - 0001:00004920 _xbee_vsenddata@12 10005920 f api.obj - 0001:00004950 __xbee_vsenddata@16 10005950 f api.obj - 0001:00004a00 _xbee_nsenddata@12 10005a00 f api.obj - 0001:00004a30 __xbee_nsenddata@16 10005a30 f api.obj - 0001:000053a0 _xbee_getpacketwait@4 100063a0 f api.obj - 0001:000053c0 __xbee_getpacketwait@8 100063c0 f api.obj - 0001:00005440 _xbee_getpacket@4 10006440 f api.obj - 0001:00005460 __xbee_getpacket@8 10006460 f api.obj - 0001:00005ab0 _xbee_listen_stop@4 10006ab0 f api.obj - 0001:0000a47f _sprintf 1000b47f f LIBCMT:sprintf.obj - 0001:0000a503 @__security_check_cookie@4 1000b503 f LIBCMT:secchk.obj - 0001:0000a512 __RTC_CheckEsp 1000b512 f LIBCMT:_stack_.obj - 0001:0000a535 @_RTC_CheckStackVars@8 1000b535 f LIBCMT:_stack_.obj - 0001:0000a591 _free 1000b591 f LIBCMT:free.obj - 0001:0000a5cb __ftime64_s 1000b5cb f LIBCMT:ftime64.obj - 0001:0000a73b __ftime64 1000b73b f LIBCMT:ftime64.obj - 0001:0000a746 __get_errno_from_oserr 1000b746 f LIBCMT:dosmap.obj - 0001:0000a788 __errno 1000b788 f LIBCMT:dosmap.obj - 0001:0000a79b ___doserrno 1000b79b f LIBCMT:dosmap.obj - 0001:0000a7ae __dosmaperr 1000b7ae f LIBCMT:dosmap.obj - 0001:0000af05 __open 1000bf05 f LIBCMT:open.obj - 0001:0000afc0 _strrchr 1000bfc0 f LIBCMT:strrchr.obj - 0001:0000aff0 __cfltcvt_init 1000bff0 f LIBCMT:_fpinit_.obj - 0001:0000b050 __fpmath 1000c050 f LIBCMT:_fpinit_.obj - 0001:0000b069 _fprintf 1000c069 f LIBCMT:fprintf.obj - 0001:0000b175 __flush 1000c175 f LIBCMT:fflush.obj - 0001:0000b1dd __fflush_nolock 1000c1dd f LIBCMT:fflush.obj - 0001:0000b2ff _fflush 1000c2ff f LIBCMT:fflush.obj - 0001:0000b352 __flushall 1000c352 f LIBCMT:fflush.obj - 0001:0000b35b __fclose_nolock 1000c35b f LIBCMT:fclose.obj - 0001:0000b3c8 _fclose 1000c3c8 f LIBCMT:fclose.obj - 0001:0000b43c ___iob_func 1000c43c f LIBCMT:_file.obj - 0001:0000b442 ___initstdio 1000c442 f LIBCMT:_file.obj - 0001:0000b4f3 ___endstdio 1000c4f3 f LIBCMT:_file.obj - 0001:0000b513 __lock_file 1000c513 f LIBCMT:_file.obj - 0001:0000b554 __lock_file2 1000c554 f LIBCMT:_file.obj - 0001:0000b586 __unlock_file 1000c586 f LIBCMT:_file.obj - 0001:0000b5c2 __unlock_file2 1000c5c2 f LIBCMT:_file.obj - 0001:0000b600 _strcpy 1000c600 f LIBCMT:strcat.obj - 0001:0000b610 _strcat 1000c610 f LIBCMT:strcat.obj - 0001:0000b700 _strlen 1000c700 f LIBCMT:strlen.obj - 0001:0000b78b _setvbuf 1000c78b f LIBCMT:setvbuf.obj - 0001:0000b881 __get_sys_err_msg 1000c881 f i LIBCMT:perror.obj - 0001:0000b8a9 _perror 1000c8a9 f LIBCMT:perror.obj - 0001:0000b937 _strerror 1000c937 f LIBCMT:strerror.obj - 0001:0000b9a1 ___crtCorExitProcess 1000c9a1 f LIBCMT:crt0dat.obj - 0001:0000b9cc ___crtExitProcess 1000c9cc f LIBCMT:crt0dat.obj - 0001:0000b9e4 __lockexit 1000c9e4 f LIBCMT:crt0dat.obj - 0001:0000b9ed __unlockexit 1000c9ed f LIBCMT:crt0dat.obj - 0001:0000b9f6 __init_pointers 1000c9f6 f LIBCMT:crt0dat.obj - 0001:0000ba29 __initterm_e 1000ca29 f LIBCMT:crt0dat.obj - 0001:0000ba4d __cinit 1000ca4d f LIBCMT:crt0dat.obj - 0001:0000bc24 _exit 1000cc24 f LIBCMT:crt0dat.obj - 0001:0000bc3a __exit 1000cc3a f LIBCMT:crt0dat.obj - 0001:0000bc50 __cexit 1000cc50 f LIBCMT:crt0dat.obj - 0001:0000bc5f __amsg_exit 1000cc5f f LIBCMT:crt0dat.obj - 0001:0000bc7d _malloc 1000cc7d f LIBCMT:malloc.obj - 0001:0000bd11 _calloc 1000cd11 f LIBCMT:calloc.obj - 0001:0000bd51 _atol 1000cd51 f LIBCMT:atox.obj - 0001:0000bd67 _atoi 1000cd67 f LIBCMT:atox.obj - 0001:0000bd72 _strncmp 1000cd72 f LIBCMT:strncmp.obj - 0001:0000be40 _memset 1000ce40 f LIBCMT:memset.obj - 0001:0000bec0 _memcpy 1000cec0 f LIBCMT:memcpy.obj - 0001:0000c221 _memcmp 1000d221 f LIBCMT:memcmp.obj - 0001:0000d775 _realloc 1000e775 f LIBCMT:realloc.obj - 0001:0000d822 __CRT_INIT@12 1000e822 f LIBCMT:dllcrt0.obj - 0001:0000da7c __DllMainCRTStartup@12 1000ea7c f LIBCMT:dllcrt0.obj - 0001:0000da9f __flsbuf 1000ea9f f LIBCMT:_flsbuf.obj - 0001:0000dc03 ??0_LocaleUpdate@@QAE@PAUlocaleinfo_struct@@@Z 1000ec03 f i LIBCMT:output.obj - 0001:0000dd0a __output_l 1000ed0a f LIBCMT:output.obj - 0001:0000e8b6 __initp_misc_invarg 1000f8b6 f LIBCMT:invarg.obj - 0001:0000e8c5 __call_reportfault 1000f8c5 f LIBCMT:invarg.obj - 0001:0000e9ee __invoke_watson 1000f9ee f LIBCMT:invarg.obj - 0001:0000ea13 __invalid_parameter 1000fa13 f LIBCMT:invarg.obj - 0001:0000ea40 __invalid_parameter_noinfo 1000fa40 f LIBCMT:invarg.obj - 0001:0000ea50 ___report_gsfailure 1000fa50 f LIBCMT:gs_report.obj - 0001:0000ee0e ?_RTC_Failure@@YAXPAXH@Z 1000fe0e f LIBCMT:_error_.obj - 0001:0000ee49 ?_RTC_StackFailure@@YAXPAXPBD@Z 1000fe49 f LIBCMT:_error_.obj - 0001:0000ef3c ?_RTC_GetErrorFunc@@YAP6AHHPBDH00ZZPBX@Z 1000ff3c f LIBCMT:_userapi_.obj - 0001:0000ef42 ?_RTC_GetErrorFuncW@@YAP6AHHPB_WH00ZZPBX@Z 1000ff42 f LIBCMT:_userapi_.obj - 0001:0000ef48 __heap_init 1000ff48 f LIBCMT:heapinit.obj - 0001:0000ef66 __heap_term 1000ff66 f LIBCMT:heapinit.obj - 0001:0000ef7a __get_daylight 1000ff7a f LIBCMT:timeset.obj - 0001:0000efa7 __get_dstbias 1000ffa7 f LIBCMT:timeset.obj - 0001:0000efd4 __get_timezone 1000ffd4 f LIBCMT:timeset.obj - 0001:0000f001 ___daylight 10010001 f LIBCMT:timeset.obj - 0001:0000f007 ___dstbias 10010007 f LIBCMT:timeset.obj - 0001:0000f00d ___timezone 1001000d f LIBCMT:timeset.obj - 0001:0000f013 ___tzname 10010013 f LIBCMT:timeset.obj - 0001:0000f32c ___tzset 1001032c f LIBCMT:tzset.obj - 0001:0000f380 __aullrem 10010380 f LIBCMT:ullrem.obj - 0001:0000f400 __aulldiv 10010400 f LIBCMT:ulldiv.obj - 0001:0000f468 __encoded_null 10010468 f LIBCMT:tidtable.obj - 0001:0000f471 ___crtTlsAlloc@4 10010471 f LIBCMT:tidtable.obj - 0001:0000f47a ___set_flsgetvalue 1001047a f LIBCMT:tidtable.obj - 0001:0000f4ae __mtterm 100104ae f LIBCMT:tidtable.obj - 0001:0000f4eb __initptd 100104eb f LIBCMT:tidtable.obj - 0001:0000f59f __getptd_noexit 1001059f f LIBCMT:tidtable.obj - 0001:0000f618 __getptd 10010618 f LIBCMT:tidtable.obj - 0001:0000f632 __freefls@4 10010632 f LIBCMT:tidtable.obj - 0001:0000f761 __freeptd 10010761 f LIBCMT:tidtable.obj - 0001:0000f7cf __mtinit 100107cf f LIBCMT:tidtable.obj - 0001:0000f94a __set_osfhnd 1001094a f LIBCMT:osfinfo.obj - 0001:0000f9cb __free_osfhnd 100109cb f LIBCMT:osfinfo.obj - 0001:0000fa51 __get_osfhandle 10010a51 f LIBCMT:osfinfo.obj - 0001:0000faba ___lock_fhandle 10010aba f LIBCMT:osfinfo.obj - 0001:0000fb59 __unlock_fhandle 10010b59 f LIBCMT:osfinfo.obj - 0001:0000fb80 __alloc_osfhnd 10010b80 f LIBCMT:osfinfo.obj - 0001:0000fd19 __write_nolock 10010d19 f LIBCMT:write.obj - 0001:00010416 __write 10011416 f LIBCMT:write.obj - 0001:000104ea __lseeki64_nolock 100114ea f LIBCMT:lseeki64.obj - 0001:0001056f __lseeki64 1001156f f LIBCMT:lseeki64.obj - 0001:00010659 __chsize_nolock 10011659 f LIBCMT:chsize.obj - 0001:0001080f __read_nolock 1001180f f LIBCMT:read.obj - 0001:00010dc6 __close_nolock 10011dc6 f LIBCMT:close.obj - 0001:00010e62 __close 10011e62 f LIBCMT:close.obj - 0001:00010f26 __lseek_nolock 10011f26 f LIBCMT:lseek.obj - 0001:00010f9b __ioinit 10011f9b f LIBCMT:ioinit.obj - 0001:000111e0 __ioterm 100121e0 f LIBCMT:ioinit.obj - 0001:00011233 __setmode_nolock 10012233 f LIBCMT:setmode.obj - 0001:000112ee __get_fmode 100122ee f LIBCMT:setmode.obj - 0001:00011320 __SEH_prolog4 10012320 f LIBCMT:sehprolg4.obj - 0001:00011365 __SEH_epilog4 10012365 f LIBCMT:sehprolg4.obj - 0001:00011380 __except_handler4 10012380 f LIBCMT:chandler4.obj - 0001:0001150f __forcdecpt_l 1001250f f LIBCMT:cvt.obj - 0001:00011583 __cropzeros_l 10012583 f LIBCMT:cvt.obj - 0001:00011605 __positive 10012605 f LIBCMT:cvt.obj - 0001:00011621 __fassign_l 10012621 f LIBCMT:cvt.obj - 0001:00011663 __fassign 10012663 f LIBCMT:cvt.obj - 0001:0001169c __forcdecpt 1001269c f LIBCMT:cvt.obj - 0001:000116af __cropzeros 100126af f LIBCMT:cvt.obj - 0001:00011823 __cftoe_l 10012823 f LIBCMT:cvt.obj - 0001:000118ea __cftoe 100128ea f LIBCMT:cvt.obj - 0001:0001190a __cftoa_l 1001290a f LIBCMT:cvt.obj - 0001:00011d83 __cftof_l 10012d83 f LIBCMT:cvt.obj - 0001:00011e44 __cftog_l 10012e44 f LIBCMT:cvt.obj - 0001:00011f31 __cfltcvt_l 10012f31 f LIBCMT:cvt.obj - 0001:00011fb9 __cfltcvt 10012fb9 f LIBCMT:cvt.obj - 0001:00011fdc __initp_misc_cfltcvt_tab 10012fdc f LIBCMT:cmiscdat.obj - 0001:00011fff __setdefaultprecision 10012fff f LIBCMT:fp8.obj - 0001:00012027 __stbuf 10013027 f LIBCMT:_sftbuf.obj - 0001:000120c3 __ftbuf 100130c3 f LIBCMT:_sftbuf.obj - 0001:000120f7 __fileno 100130f7 f LIBCMT:fileno.obj - 0001:0001211d __vsnprintf_l 1001311d f LIBCMT:vsnprint.obj - 0001:000121c9 __vsnprintf 100131c9 f LIBCMT:vsnprint.obj - 0001:000121c9 _vsnprintf 100131c9 f LIBCMT:vsnprint.obj - 0001:000121e6 __commit 100131e6 f LIBCMT:commit.obj - 0001:000122bf __mtinitlocks 100132bf f LIBCMT:mlock.obj - 0001:00012309 __mtdeletelocks 10013309 f LIBCMT:mlock.obj - 0001:00012360 __unlock 10013360 f LIBCMT:mlock.obj - 0001:00012377 __mtinitlocknum 10013377 f LIBCMT:mlock.obj - 0001:00012439 __lock 10013439 f LIBCMT:mlock.obj - 0001:0001246c __freebuf 1001346c f LIBCMT:_freebuf.obj - 0001:0001249d __malloc_crt 1001349d f LIBCMT:crtheap.obj - 0001:000124e2 __calloc_crt 100134e2 f LIBCMT:crtheap.obj - 0001:0001252e __realloc_crt 1001352e f LIBCMT:crtheap.obj - 0001:0001257c __recalloc_crt 1001357c f LIBCMT:crtheap.obj - 0001:000125ce __fcloseall 100135ce f LIBCMT:closeall.obj - 0001:0001266a ___sys_nerr 1001366a f LIBCMT:syserr.obj - 0001:00012670 ___sys_errlist 10013670 f LIBCMT:syserr.obj - 0001:00012676 _strcpy_s 10013676 f LIBCMT:strcpy_s.obj - 0001:000126d5 _strncpy_s 100136d5 f LIBCMT:strncpy_s.obj - 0001:0001278a ?terminate@@YAXXZ 1001378a f LIBCMT:hooks.obj - 0001:000127c3 __initp_eh_hooks 100137c3 f LIBCMT:hooks.obj - 0001:000127d4 __initp_misc_winsig 100137d4 f LIBCMT:winsig.obj - 0001:00012829 ___get_sigabrt 10013829 f LIBCMT:winsig.obj - 0001:00012836 _raise 10013836 f LIBCMT:winsig.obj - 0001:000129d9 __initp_misc_rand_s 100139d9 f LIBCMT:rand_s.obj - 0001:000129e8 __initp_misc_purevirt 100139e8 f LIBCMT:inithelp.obj - 0001:000129f7 __initp_heap_handler 100139f7 f LIBCMT:handler.obj - 0001:00012a06 __callnewh 10013a06 f LIBCMT:handler.obj - 0001:00012ae4 ___onexitinit 10013ae4 f LIBCMT:onexit.obj - 0001:00012b15 __onexit 10013b15 f LIBCMT:onexit.obj - 0001:00012b51 _atexit 10013b51 f LIBCMT:onexit.obj - 0001:00012b68 __RTC_Initialize 10013b68 f LIBCMT:_initsect_.obj - 0001:00012b8e __RTC_Terminate 10013b8e f LIBCMT:_initsect_.obj - 0001:00012bc0 __ValidateImageBase 10013bc0 f LIBCMT:pesect.obj - 0001:00012c00 __FindPESection 10013c00 f LIBCMT:pesect.obj - 0001:00012c50 __IsNonwritableInCurrentImage 10013c50 f LIBCMT:pesect.obj - 0001:00012d0c __GET_RTERRMSG 10013d0c f LIBCMT:crt0msg.obj - 0001:00012d32 __NMSG_WRITE 10013d32 f LIBCMT:crt0msg.obj - 0001:00012ee1 __FF_MSGBANNER 10013ee1 f LIBCMT:crt0msg.obj - 0001:00012f1a __calloc_impl 10013f1a f LIBCMT:calloc_impl.obj - 0001:000131c7 _strtol 100141c7 f LIBCMT:strtol.obj - 0001:000131f2 __VEC_memzero 100141f2 f LIBCMT:p4_memset.obj - 0001:000132ac ___sse2_available_init 100142ac f LIBCMT:cpu_disp.obj - 0001:000132bc __VEC_memcpy 100142bc f LIBCMT:p4_memcpy.obj - 0001:000133bf __setenvp 100143bf f LIBCMT:stdenvp.obj - 0001:00013635 __setargv 10014635 f LIBCMT:stdargv.obj - 0001:000136f0 ___crtGetEnvironmentStringsA 100146f0 f LIBCMT:a_env.obj - 0001:00013787 __XcptFilter 10014787 f LIBCMT:winxfltr.obj - 0001:000138d1 ___CppXcptFilter 100148d1 f LIBCMT:winxfltr.obj - 0001:000138f1 ___security_init_cookie 100148f1 f LIBCMT:gs_support.obj - 0001:0001398c __getbuf 1001498c f LIBCMT:_getbuf.obj - 0001:000139d5 __isatty 100149d5 f LIBCMT:isatty.obj - 0001:00013c4e ___updatetmbcinfo 10014c4e f LIBCMT:mbctype.obj - 0001:00013d6e __setmbcp_nolock 10014d6e f LIBCMT:mbctype.obj - 0001:00013f57 __setmbcp 10014f57 f LIBCMT:mbctype.obj - 0001:000140f1 ___initmbctable 100150f1 f LIBCMT:mbctype.obj - 0001:0001410f ___addlocaleref 1001510f f LIBCMT:localref.obj - 0001:0001419e ___removelocaleref 1001519e f LIBCMT:localref.obj - 0001:00014237 ___freetlocinfo 10015237 f LIBCMT:localref.obj - 0001:00014382 __updatetlocinfoEx_nolock 10015382 f LIBCMT:localref.obj - 0001:000143cf ___updatetlocinfo 100153cf f LIBCMT:localref.obj - 0001:00014448 __get_printf_count_output 10015448 f LIBCMT:printf.obj - 0001:0001445e __wctomb_s_l 1001545e f LIBCMT:wctomb.obj - 0001:000145b3 _wctomb_s 100155b3 f LIBCMT:wctomb.obj - 0001:000145d0 __isleadbyte_l 100155d0 f i LIBCMT:_wctype.obj - 0001:00014608 _isleadbyte 10015608 f i LIBCMT:_wctype.obj - 0001:00014620 __aulldvrm 10015620 f LIBCMT:ulldvrm.obj - 0001:000146b5 __crt_debugger_hook 100156b5 f LIBCMT:dbghook.obj - 0001:00014849 ?_RTC_GetSrcLine@@YAHPAEPA_WKPAH1K@Z 10015849 f LIBCMT:_pdblkup_.obj - 0001:00014ad0 _strcmp 10015ad0 f LIBCMT:strcmp.obj - 0001:00014b58 __getenv_helper_nolock 10015b58 f LIBCMT:getenv.obj - 0001:00014bdf ____lc_codepage_func 10015bdf f LIBCMT:initctyp.obj - 0001:00014c05 __putwch_nolock 10015c05 f LIBCMT:putwch.obj - 0001:00014c47 __mbtowc_l 10015c47 f LIBCMT:mbtowc.obj - 0001:00014d5d _mbtowc 10015d5d f LIBCMT:mbtowc.obj - 0001:00014d80 __chkstk 10015d80 f LIBCMT:chkstk.obj - 0001:00014d80 __alloca_probe 10015d80 LIBCMT:chkstk.obj - 0001:00014db0 __local_unwind4 10015db0 f LIBCMT:exsup4.obj - 0001:00014e86 __seh_longjmp_unwind4@4 10015e86 f LIBCMT:exsup4.obj - 0001:00014ea2 @_EH4_CallFilterFunc@8 10015ea2 f LIBCMT:exsup4.obj - 0001:00014eb9 @_EH4_TransferToHandler@8 10015eb9 f LIBCMT:exsup4.obj - 0001:00014ed2 @_EH4_GlobalUnwind2@8 10015ed2 f LIBCMT:exsup4.obj - 0001:00014eeb @_EH4_LocalUnwind@16 10015eeb f LIBCMT:exsup4.obj - 0001:00014f02 __isdigit_l 10015f02 f i LIBCMT:_ctype.obj - 0001:00014f53 _isdigit 10015f53 f i LIBCMT:_ctype.obj - 0001:00014f81 __tolower_l 10015f81 f LIBCMT:tolower.obj - 0001:00015096 _tolower 10016096 f LIBCMT:tolower.obj - 0001:000150c2 __atodbl_l 100160c2 f LIBCMT:atodbl.obj - 0001:0001516a __atoflt_l 1001616a f LIBCMT:atodbl.obj - 0001:00015220 _memmove 10016220 f LIBCMT:memmove.obj - 0001:00015581 __fptostr 10016581 f LIBCMT:_fptostr.obj - 0001:00015634 ___dtold 10016634 f LIBCMT:_cfout_.obj - 0001:000156e7 __fltout2 100166e7 f LIBCMT:_cfout_.obj - 0001:00015780 __alldvrm 10016780 f LIBCMT:lldvrm.obj - 0001:00015860 __aullshr 10016860 f LIBCMT:ullshr.obj - 0001:0001587f __fptrap 1001687f f LIBCMT:crt0fp.obj - 0001:00015888 __controlfp_s 10016888 f LIBCMT:_contrlfp_.obj - 0001:000158e7 __recalloc 100168e7 f LIBCMT:recalloc.obj - 0001:00015955 _abort 10016955 f LIBCMT:abort.obj - 0001:00015988 __freea 10016988 f i LIBCMT:a_loc.obj - 0001:000159a8 __msize 100169a8 f LIBCMT:msize.obj - 0001:000159db ___crtMessageBoxW 100169db f LIBCMT:crtmboxw.obj - 0001:00015b47 _wcscat_s 10016b47 f LIBCMT:wcscat_s.obj - 0001:00015bbc _wcsncpy_s 10016bbc f LIBCMT:wcsncpy_s.obj - 0001:00015c89 _wcslen 10016c89 f LIBCMT:wcslen.obj - 0001:00015ca4 _wcscpy_s 10016ca4 f LIBCMT:wcscpy_s.obj - 0001:00015d07 __set_error_mode 10016d07 f LIBCMT:errmode.obj - 0001:00015d46 __isctype_l 10016d46 f LIBCMT:isctype.obj - 0001:00015e00 __allmul 10016e00 f LIBCMT:llmul.obj - 0001:00015e87 __ismbblead 10016e87 f LIBCMT:ismbbyte.obj - 0001:00016086 ___crtLCMapStringA 10017086 f LIBCMT:a_map.obj - 0001:000161b3 ___crtGetStringTypeA 100171b3 f LIBCMT:a_str.obj - 0001:000161f3 ___free_lc_time 100171f3 f LIBCMT:inittime.obj - 0001:0001656a ___free_lconv_num 1001756a f LIBCMT:initnum.obj - 0001:000165d3 ___free_lconv_mon 100175d3 f LIBCMT:initmon.obj - 0001:000166d1 __mbsnbicoll_l 100176d1 f LIBCMT:mbsnbico.obj - 0001:000167af __mbsnbicoll 100177af f LIBCMT:mbsnbico.obj - 0001:000167c9 ___wtomb_environ 100177c9 f LIBCMT:wtombenv.obj - 0001:00016860 ___initconout 10017860 f LIBCMT:initcon.obj - 0001:0001687f ___termconout 1001787f f LIBCMT:initcon.obj - 0001:000168a0 __global_unwind2 100178a0 f LIBCMT:exsup.obj - 0001:00016905 __local_unwind2 10017905 f LIBCMT:exsup.obj - 0001:00016989 __abnormal_termination 10017989 f LIBCMT:exsup.obj - 0001:000169ac __NLG_Notify1 100179ac f LIBCMT:exsup.obj - 0001:000169b5 __NLG_Notify 100179b5 f LIBCMT:exsup.obj - 0001:000169cc __NLG_Dispatch 100179cc LIBCMT:exsup.obj - 0001:000169cc __NLG_Dispatch2 100179cc LIBCMT:exsup.obj - 0001:000169d4 __NLG_Call 100179d4 f LIBCMT:exsup.obj - 0001:000169d6 __NLG_Return2 100179d6 LIBCMT:exsup.obj - 0001:000169d7 __ld12tod 100179d7 f LIBCMT:_intrncvt_.obj - 0001:00016f28 __ld12tof 10017f28 f LIBCMT:_intrncvt_.obj - 0001:00017479 ___strgtold12_l 10018479 f LIBCMT:_strgtold_.obj - 0001:00017b55 _$I10_OUTPUT 10018b55 f LIBCMT:_x10fout_.obj - 0001:0001857b __control87 1001957b f i LIBCMT:_ieee87_.obj - 0001:00018890 __alloca_probe_16 10019890 f LIBCMT:alloca16.obj - 0001:000188a6 __alloca_probe_8 100198a6 LIBCMT:alloca16.obj - 0001:000188c0 _strcspn 100198c0 f LIBCMT:strcspn.obj - 0001:00018910 _strpbrk 10019910 f LIBCMT:strpbrk.obj - 0001:00018bbe ___crtCompareStringA 10019bbe f LIBCMT:a_cmp.obj - 0001:00018c00 __strnicoll_l 10019c00 f LIBCMT:strnicol.obj - 0001:00018d9c ___crtsetenv 10019d9c f LIBCMT:setenv.obj - 0001:00018fde ___mtold12 10019fde f LIBCMT:_mantold_.obj - 0001:000191c2 ___set_fpsr_sse2 1001a1c2 f LIBCMT:_fpctrl_.obj - 0001:00019234 __strnicmp_l 1001a234 f LIBCMT:strnicmp.obj - 0001:00019316 __strdup 1001a316 f LIBCMT:strdup.obj - 0001:00019368 __mbschr_l 1001a368 f LIBCMT:mbschr.obj - 0001:00019418 __mbschr 1001a418 f LIBCMT:mbschr.obj - 0001:00019430 ___ascii_strnicmp 1001a430 f LIBCMT:_strnicm.obj - 0001:000194b0 _strchr 1001a4b0 f LIBCMT:strchr.obj - 0001:000194b6 ___from_strstr_to_strchr 1001a4b6 LIBCMT:strchr.obj - 0001:0001956e _RtlUnwind@16 1001a56e f kernel32:KERNEL32.dll - 0001:00019574 __fdopen 1001a574 f LIBCMT:fdopen.obj - 0001:00019574 _fdopen 1001a574 f LIBCMT:fdopen.obj - 0001:00019835 _dup 1001a835 f LIBCMT:dup.obj - 0001:00019835 __dup 1001a835 f LIBCMT:dup.obj - 0001:00019905 __getstream 1001a905 f LIBCMT:stream.obj - 0002:00000000 __imp__RegSetValueExA@24 1001b000 Advapi32:ADVAPI32.dll - 0002:00000004 __imp__RegCreateKeyA@12 1001b004 Advapi32:ADVAPI32.dll - 0002:00000008 __imp__RegDeleteKeyA@8 1001b008 Advapi32:ADVAPI32.dll - 0002:0000000c __imp__RegCloseKey@4 1001b00c Advapi32:ADVAPI32.dll - 0002:00000010 \177ADVAPI32_NULL_THUNK_DATA 1001b010 Advapi32:ADVAPI32.dll - 0002:00000014 __imp__SetEnvironmentVariableA@8 1001b014 kernel32:KERNEL32.dll - 0002:00000018 __imp__CompareStringW@24 1001b018 kernel32:KERNEL32.dll - 0002:0000001c __imp__lstrcpyA@8 1001b01c kernel32:KERNEL32.dll - 0002:00000020 __imp__GetModuleFileNameA@12 1001b020 kernel32:KERNEL32.dll - 0002:00000024 __imp__lstrlenA@4 1001b024 kernel32:KERNEL32.dll - 0002:00000028 __imp__GetOverlappedResult@16 1001b028 kernel32:KERNEL32.dll - 0002:0000002c __imp__GetLastError@0 1001b02c kernel32:KERNEL32.dll - 0002:00000030 __imp__WriteFile@20 1001b030 kernel32:KERNEL32.dll - 0002:00000034 __imp__ReadFile@20 1001b034 kernel32:KERNEL32.dll - 0002:00000038 __imp__SetEvent@4 1001b038 kernel32:KERNEL32.dll - 0002:0000003c __imp__WaitForSingleObject@8 1001b03c kernel32:KERNEL32.dll - 0002:00000040 __imp__TerminateThread@8 1001b040 kernel32:KERNEL32.dll - 0002:00000044 __imp__CloseHandle@4 1001b044 kernel32:KERNEL32.dll - 0002:00000048 __imp__Sleep@4 1001b048 kernel32:KERNEL32.dll - 0002:0000004c __imp__CreateThread@24 1001b04c kernel32:KERNEL32.dll - 0002:00000050 __imp__CreateEventA@16 1001b050 kernel32:KERNEL32.dll - 0002:00000054 __imp__SetCommMask@8 1001b054 kernel32:KERNEL32.dll - 0002:00000058 __imp__SetCommTimeouts@8 1001b058 kernel32:KERNEL32.dll - 0002:0000005c __imp__SetCommState@8 1001b05c kernel32:KERNEL32.dll - 0002:00000060 __imp__GetCommState@8 1001b060 kernel32:KERNEL32.dll - 0002:00000064 __imp__CreateFileA@28 1001b064 kernel32:KERNEL32.dll - 0002:00000068 __imp__WaitCommEvent@12 1001b068 kernel32:KERNEL32.dll - 0002:0000006c __imp__ClearCommError@12 1001b06c kernel32:KERNEL32.dll - 0002:00000070 __imp__HeapFree@12 1001b070 kernel32:KERNEL32.dll - 0002:00000074 __imp__GetTimeZoneInformation@4 1001b074 kernel32:KERNEL32.dll - 0002:00000078 __imp__GetSystemTimeAsFileTime@4 1001b078 kernel32:KERNEL32.dll - 0002:0000007c __imp__GetFileType@4 1001b07c kernel32:KERNEL32.dll - 0002:00000080 __imp__EnterCriticalSection@4 1001b080 kernel32:KERNEL32.dll - 0002:00000084 __imp__LeaveCriticalSection@4 1001b084 kernel32:KERNEL32.dll - 0002:00000088 __imp__GetProcAddress@8 1001b088 kernel32:KERNEL32.dll - 0002:0000008c __imp__GetModuleHandleW@4 1001b08c kernel32:KERNEL32.dll - 0002:00000090 __imp__ExitProcess@4 1001b090 kernel32:KERNEL32.dll - 0002:00000094 __imp__DecodePointer@4 1001b094 kernel32:KERNEL32.dll - 0002:00000098 __imp__HeapAlloc@12 1001b098 kernel32:KERNEL32.dll - 0002:0000009c __imp__HeapReAlloc@16 1001b09c kernel32:KERNEL32.dll - 0002:000000a0 __imp__GetCurrentThreadId@0 1001b0a0 kernel32:KERNEL32.dll - 0002:000000a4 __imp__GetCommandLineA@0 1001b0a4 kernel32:KERNEL32.dll - 0002:000000a8 __imp__UnhandledExceptionFilter@4 1001b0a8 kernel32:KERNEL32.dll - 0002:000000ac __imp__SetUnhandledExceptionFilter@4 1001b0ac kernel32:KERNEL32.dll - 0002:000000b0 __imp__IsDebuggerPresent@0 1001b0b0 kernel32:KERNEL32.dll - 0002:000000b4 __imp__EncodePointer@4 1001b0b4 kernel32:KERNEL32.dll - 0002:000000b8 __imp__TerminateProcess@8 1001b0b8 kernel32:KERNEL32.dll - 0002:000000bc __imp__GetCurrentProcess@0 1001b0bc kernel32:KERNEL32.dll - 0002:000000c0 __imp__RaiseException@16 1001b0c0 kernel32:KERNEL32.dll - 0002:000000c4 __imp__WideCharToMultiByte@32 1001b0c4 kernel32:KERNEL32.dll - 0002:000000c8 __imp__MultiByteToWideChar@24 1001b0c8 kernel32:KERNEL32.dll - 0002:000000cc __imp__LoadLibraryW@4 1001b0cc kernel32:KERNEL32.dll - 0002:000000d0 __imp__HeapCreate@12 1001b0d0 kernel32:KERNEL32.dll - 0002:000000d4 __imp__HeapDestroy@4 1001b0d4 kernel32:KERNEL32.dll - 0002:000000d8 __imp__TlsAlloc@0 1001b0d8 kernel32:KERNEL32.dll - 0002:000000dc __imp__TlsGetValue@4 1001b0dc kernel32:KERNEL32.dll - 0002:000000e0 __imp__TlsSetValue@8 1001b0e0 kernel32:KERNEL32.dll - 0002:000000e4 __imp__TlsFree@4 1001b0e4 kernel32:KERNEL32.dll - 0002:000000e8 __imp__InterlockedIncrement@4 1001b0e8 kernel32:KERNEL32.dll - 0002:000000ec __imp__SetLastError@4 1001b0ec kernel32:KERNEL32.dll - 0002:000000f0 __imp__InterlockedDecrement@4 1001b0f0 kernel32:KERNEL32.dll - 0002:000000f4 __imp__SetStdHandle@8 1001b0f4 kernel32:KERNEL32.dll - 0002:000000f8 __imp__InitializeCriticalSectionAndSpinCount@8 1001b0f8 kernel32:KERNEL32.dll - 0002:000000fc __imp__GetConsoleCP@0 1001b0fc kernel32:KERNEL32.dll - 0002:00000100 __imp__GetConsoleMode@8 1001b100 kernel32:KERNEL32.dll - 0002:00000104 __imp__SetFilePointer@16 1001b104 kernel32:KERNEL32.dll - 0002:00000108 __imp__SetEndOfFile@4 1001b108 kernel32:KERNEL32.dll - 0002:0000010c __imp__GetProcessHeap@0 1001b10c kernel32:KERNEL32.dll - 0002:00000110 __imp__SetHandleCount@4 1001b110 kernel32:KERNEL32.dll - 0002:00000114 __imp__GetStdHandle@4 1001b114 kernel32:KERNEL32.dll - 0002:00000118 __imp__GetStartupInfoW@4 1001b118 kernel32:KERNEL32.dll - 0002:0000011c __imp__DeleteCriticalSection@4 1001b11c kernel32:KERNEL32.dll - 0002:00000120 __imp__FlushFileBuffers@4 1001b120 kernel32:KERNEL32.dll - 0002:00000124 __imp__FreeLibrary@4 1001b124 kernel32:KERNEL32.dll - 0002:00000128 __imp__GetModuleFileNameW@12 1001b128 kernel32:KERNEL32.dll - 0002:0000012c __imp__IsProcessorFeaturePresent@4 1001b12c kernel32:KERNEL32.dll - 0002:00000130 __imp__FreeEnvironmentStringsW@4 1001b130 kernel32:KERNEL32.dll - 0002:00000134 __imp__GetEnvironmentStringsW@0 1001b134 kernel32:KERNEL32.dll - 0002:00000138 __imp__QueryPerformanceCounter@4 1001b138 kernel32:KERNEL32.dll - 0002:0000013c __imp__GetTickCount@0 1001b13c kernel32:KERNEL32.dll - 0002:00000140 __imp__GetCurrentProcessId@0 1001b140 kernel32:KERNEL32.dll - 0002:00000144 __imp__GetCPInfo@8 1001b144 kernel32:KERNEL32.dll - 0002:00000148 __imp__GetACP@0 1001b148 kernel32:KERNEL32.dll - 0002:0000014c __imp__GetOEMCP@0 1001b14c kernel32:KERNEL32.dll - 0002:00000150 __imp__IsValidCodePage@4 1001b150 kernel32:KERNEL32.dll - 0002:00000154 __imp__VirtualQuery@12 1001b154 kernel32:KERNEL32.dll - 0002:00000158 __imp__WriteConsoleW@20 1001b158 kernel32:KERNEL32.dll - 0002:0000015c __imp__RtlUnwind@16 1001b15c kernel32:KERNEL32.dll - 0002:00000160 __imp__HeapSize@12 1001b160 kernel32:KERNEL32.dll - 0002:00000164 __imp__LCMapStringW@24 1001b164 kernel32:KERNEL32.dll - 0002:00000168 __imp__GetStringTypeW@16 1001b168 kernel32:KERNEL32.dll - 0002:0000016c __imp__CreateFileW@28 1001b16c kernel32:KERNEL32.dll - 0002:00000170 __imp__DuplicateHandle@28 1001b170 kernel32:KERNEL32.dll - 0002:00000174 \177KERNEL32_NULL_THUNK_DATA 1001b174 kernel32:KERNEL32.dll - 0002:00000178 __imp__wsprintfA 1001b178 User32:USER32.dll - 0002:0000017c __imp__MessageBoxA@16 1001b17c User32:USER32.dll - 0002:00000180 __imp__SendMessageA@16 1001b180 User32:USER32.dll - 0002:00000184 \177USER32_NULL_THUNK_DATA 1001b184 User32:USER32.dll - 0002:00000188 ___xc_a 1001b188 LIBCMT:crt0init.obj - 0002:0000018c ___xc_z 1001b18c LIBCMT:crt0init.obj - 0002:00000190 ___xi_a 1001b190 LIBCMT:crt0init.obj - 0002:000001a4 ___xi_z 1001b1a4 LIBCMT:crt0init.obj - 0002:000001a8 ___xp_a 1001b1a8 LIBCMT:crt0init.obj - 0002:000001b4 ___xp_z 1001b1b4 LIBCMT:crt0init.obj - 0002:000001b8 ___xt_a 1001b1b8 LIBCMT:crt0init.obj - 0002:000001bc ___xt_z 1001b1bc LIBCMT:crt0init.obj - 0002:000001c0 __real@408ff80000000000 1001b1c0 api.obj - 0002:000001c8 __real@3f6a6d01a6d01a6d 1001b1c8 api.obj - 0002:000001d0 __FPinit 1001b1d0 LIBCMT:_fpinit_.obj - 0002:000001d4 ??_C@_01EEMJAFIK@?6?$AA@ 1001b1d4 LIBCMT:perror.obj - 0002:000001d8 ??_C@_02LMMGGCAJ@?3?5?$AA@ 1001b1d8 LIBCMT:perror.obj - 0002:000001e0 ??_C@_0EA@FCLIIPNN@Visual?5C?$CL?$CL?5CRT?3?5Not?5enough?5memor@ 1001b1e0 LIBCMT:strerror.obj - 0002:00000220 ??_C@_0P@MIGLKIOC@CorExitProcess?$AA@ 1001b220 LIBCMT:crt0dat.obj - 0002:00000230 ??_C@_1BI@BGOHAHKC@?$AAm?$AAs?$AAc?$AAo?$AAr?$AAe?$AAe?$AA?4?$AAd?$AAl?$AAl?$AA?$AA@ 1001b230 LIBCMT:crt0dat.obj - 0002:00000248 __pRawDllMain 1001b248 LIBCMT:dllcrt0.obj - 0002:00000248 __pDefaultRawDllMain 1001b248 LIBCMT:dllcrt0.obj - 0002:0000024c ??_C@_1O@CEDCILHN@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ?$AA?$AA@ 1001b24c LIBCMT:output.obj - 0002:0000025c ??_C@_06OJHGLDPL@?$CInull?$CJ?$AA@ 1001b25c LIBCMT:output.obj - 0002:00000268 ___lookuptable 1001b268 LIBCMT:output.obj - 0002:000002cc ??_C@_0BO@GNIAFIKK@Unknown?5Runtime?5Check?5Error?6?$AN?$AA@ 1001b2cc LIBCMT:_error_.obj - 0002:000002ec ??_C@_0CM@NGINOKPC@Stack?5memory?5around?5_alloca?5was?5@ 1001b2ec LIBCMT:_error_.obj - 0002:00000318 ??_C@_0DG@HKJMLLLP@A?5local?5variable?5was?5used?5before@ 1001b318 LIBCMT:_error_.obj - 0002:00000350 ??_C@_0BN@FFOINMNJ@Stack?5memory?5was?5corrupted?6?$AN?$AA@ 1001b350 LIBCMT:_error_.obj - 0002:00000370 ??_C@_0BBN@GPMLNJCF@A?5cast?5to?5a?5smaller?5data?5type?5ha@ 1001b370 LIBCMT:_error_.obj - 0002:00000490 ??_C@_0NN@NGPKDKPD@The?5value?5of?5ESP?5was?5not?5properl@ 1001b490 LIBCMT:_error_.obj - 0002:0000060c ??_C@_0CA@IODNCDPG@Run?9Time?5Check?5Failure?5?$CD?$CFd?5?9?5?$CFs?$AA@ 1001b60c LIBCMT:_error_.obj - 0002:0000062c ??_C@_0BE@GNBOBNCK@Unknown?5Module?5Name?$AA@ 1001b62c LIBCMT:_error_.obj - 0002:00000640 ??_C@_0BB@PFFGGCJP@Unknown?5Filename?$AA@ 1001b640 LIBCMT:_error_.obj - 0002:00000658 ??_C@_1EA@NFKNIFJP@?$AAR?$AAu?$AAn?$AA?9?$AAT?$AAi?$AAm?$AAe?$AA?5?$AAC?$AAh?$AAe?$AAc?$AAk?$AA?5?$AAF?$AAa?$AAi?$AAl?$AAu?$AAr?$AAe?$AA?5?$AA?$CD?$AA?$CF?$AAd?$AA?5?$AA?9?$AA?5?$AA?$CF?$AAs?$AA?$AA@ 1001b658 LIBCMT:_error_.obj - 0002:00000698 ??_C@_1GM@OLMCBDMB@?$AAR?$AAu?$AAn?$AAt?$AAi?$AAm?$AAe?$AA?5?$AAC?$AAh?$AAe?$AAc?$AAk?$AA?5?$AAE?$AAr?$AAr?$AAo?$AAr?$AA?4?$AA?6?$AA?$AN?$AA?5?$AAU?$AAn?$AAa?$AAb?$AAl?$AAe?$AA?5?$AAt?$AAo@ 1001b698 LIBCMT:_error_.obj - 0002:00000704 ??_C@_0CG@IAFNJNEE@Stack?5corrupted?5near?5unknown?5var@ 1001b704 LIBCMT:_error_.obj - 0002:0000072c ??_C@_0BP@OGBCLIBO@Stack?5around?5_alloca?5corrupted?$AA@ 1001b72c LIBCMT:_userapi_.obj - 0002:0000074c ??_C@_0CK@CNLNOEPB@Local?5variable?5used?5before?5initi@ 1001b74c LIBCMT:_userapi_.obj - 0002:00000778 ??_C@_0BI@CIGMDCBH@Stack?5memory?5corruption?$AA@ 1001b778 LIBCMT:_userapi_.obj - 0002:00000790 ??_C@_0CK@FEGOIOPB@Cast?5to?5smaller?5type?5causing?5los@ 1001b790 LIBCMT:_userapi_.obj - 0002:000007bc ??_C@_0BJ@HEGAHDFO@Stack?5pointer?5corruption?$AA@ 1001b7bc LIBCMT:_userapi_.obj - 0002:000007ec ___dnames 1001b7ec LIBCMT:timeset.obj - 0002:00000804 ___mnames 1001b804 LIBCMT:timeset.obj - 0002:0000082c ??_C@_02CLFPBFFP@TZ?$AA@ 1001b82c LIBCMT:tzset.obj - 0002:00000830 ??_C@_1BK@DBDEIDLH@?$AAK?$AAE?$AAR?$AAN?$AAE?$AAL?$AA3?$AA2?$AA?4?$AAD?$AAL?$AAL?$AA?$AA@ 1001b830 LIBCMT:tidtable.obj - 0002:0000084c ??_C@_07PEJMOBNF@FlsFree?$AA@ 1001b84c LIBCMT:tidtable.obj - 0002:00000854 ??_C@_0M@JCPCPOEF@FlsSetValue?$AA@ 1001b854 LIBCMT:tidtable.obj - 0002:00000860 ??_C@_0M@GDNOONDI@FlsGetValue?$AA@ 1001b860 LIBCMT:tidtable.obj - 0002:0000086c ??_C@_08KNHFBNJ@FlsAlloc?$AA@ 1001b86c LIBCMT:tidtable.obj - 0002:00000878 ??_C@_05KLBDPFGC@e?$CL000?$AA@ 1001b878 LIBCMT:cvt.obj - 0002:00000880 ??_C@_0BG@KLEAJEFJ@Illegal?5byte?5sequence?$AA@ 1001b880 LIBCMT:syserr.obj - 0002:00000898 ??_C@_0BE@ICMCHPHH@Directory?5not?5empty?$AA@ 1001b898 LIBCMT:syserr.obj - 0002:000008ac ??_C@_0BJ@IHEHINLI@Function?5not?5implemented?$AA@ 1001b8ac LIBCMT:syserr.obj - 0002:000008c8 ??_C@_0BD@CLHBCGPB@No?5locks?5available?$AA@ 1001b8c8 LIBCMT:syserr.obj - 0002:000008dc ??_C@_0BC@BEDIHIDK@Filename?5too?5long?$AA@ 1001b8dc LIBCMT:syserr.obj - 0002:000008f0 ??_C@_0BK@JAEBMJJM@Resource?5deadlock?5avoided?$AA@ 1001b8f0 LIBCMT:syserr.obj - 0002:0000090c ??_C@_0BB@FCBJFCAJ@Result?5too?5large?$AA@ 1001b90c LIBCMT:syserr.obj - 0002:00000920 ??_C@_0N@MMJPGLJK@Domain?5error?$AA@ 1001b920 LIBCMT:syserr.obj - 0002:00000930 ??_C@_0M@LHEPIIOM@Broken?5pipe?$AA@ 1001b930 LIBCMT:syserr.obj - 0002:0000093c ??_C@_0P@PKCJJLLM@Too?5many?5links?$AA@ 1001b93c LIBCMT:syserr.obj - 0002:0000094c ??_C@_0BG@DDBFNKBH@Read?9only?5file?5system?$AA@ 1001b94c LIBCMT:syserr.obj - 0002:00000964 ??_C@_0N@FEHLOILP@Invalid?5seek?$AA@ 1001b964 LIBCMT:syserr.obj - 0002:00000974 ??_C@_0BI@FEALHKLD@No?5space?5left?5on?5device?$AA@ 1001b974 LIBCMT:syserr.obj - 0002:0000098c ??_C@_0P@LFMMIPAE@File?5too?5large?$AA@ 1001b98c LIBCMT:syserr.obj - 0002:0000099c ??_C@_0CE@ONOKNLPF@Inappropriate?5I?1O?5control?5operat@ 1001b99c LIBCMT:syserr.obj - 0002:000009c0 ??_C@_0BE@INBJMKGG@Too?5many?5open?5files?$AA@ 1001b9c0 LIBCMT:syserr.obj - 0002:000009d4 ??_C@_0BO@IIFBODJE@Too?5many?5open?5files?5in?5system?$AA@ 1001b9d4 LIBCMT:syserr.obj - 0002:000009f4 ??_C@_0BB@HMGGCEBG@Invalid?5argument?$AA@ 1001b9f4 LIBCMT:syserr.obj - 0002:00000a08 ??_C@_0P@NDHGCGKE@Is?5a?5directory?$AA@ 1001ba08 LIBCMT:syserr.obj - 0002:00000a18 ??_C@_0BA@CJBACOOL@Not?5a?5directory?$AA@ 1001ba18 LIBCMT:syserr.obj - 0002:00000a28 ??_C@_0P@NLEIANHE@No?5such?5device?$AA@ 1001ba28 LIBCMT:syserr.obj - 0002:00000a38 ??_C@_0O@OAMDNOCP@Improper?5link?$AA@ 1001ba38 LIBCMT:syserr.obj - 0002:00000a48 ??_C@_0M@NAAJNNGH@File?5exists?$AA@ 1001ba48 LIBCMT:syserr.obj - 0002:00000a54 ??_C@_0BA@BIBLIOEK@Resource?5device?$AA@ 1001ba54 LIBCMT:syserr.obj - 0002:00000a64 ??_C@_0O@NIPGCINC@Unknown?5error?$AA@ 1001ba64 LIBCMT:syserr.obj - 0002:00000a74 ??_C@_0M@LOEHLCJD@Bad?5address?$AA@ 1001ba74 LIBCMT:syserr.obj - 0002:00000a80 ??_C@_0BC@HFNFNKAI@Permission?5denied?$AA@ 1001ba80 LIBCMT:syserr.obj - 0002:00000a94 ??_C@_0BB@IMDKMPFB@Not?5enough?5space?$AA@ 1001ba94 LIBCMT:syserr.obj - 0002:00000aa8 ??_C@_0CB@EPFKGNAK@Resource?5temporarily?5unavailable@ 1001baa8 LIBCMT:syserr.obj - 0002:00000acc ??_C@_0BD@LOHELEP@No?5child?5processes?$AA@ 1001bacc LIBCMT:syserr.obj - 0002:00000ae0 ??_C@_0BE@NFGDDCEF@Bad?5file?5descriptor?$AA@ 1001bae0 LIBCMT:syserr.obj - 0002:00000af4 ??_C@_0BC@HKPNECK@Exec?5format?5error?$AA@ 1001baf4 LIBCMT:syserr.obj - 0002:00000b08 ??_C@_0BC@MFFGCDFL@Arg?5list?5too?5long?$AA@ 1001bb08 LIBCMT:syserr.obj - 0002:00000b1c ??_C@_0BK@DPKMCKJ@No?5such?5device?5or?5address?$AA@ 1001bb1c LIBCMT:syserr.obj - 0002:00000b38 ??_C@_0BD@KKNFOBBD@Input?1output?5error?$AA@ 1001bb38 LIBCMT:syserr.obj - 0002:00000b4c ??_C@_0BK@FJBOAFDK@Interrupted?5function?5call?$AA@ 1001bb4c LIBCMT:syserr.obj - 0002:00000b68 ??_C@_0BA@FKIAIBGA@No?5such?5process?$AA@ 1001bb68 LIBCMT:syserr.obj - 0002:00000b78 ??_C@_0BK@FMDHKPNF@No?5such?5file?5or?5directory?$AA@ 1001bb78 LIBCMT:syserr.obj - 0002:00000b94 ??_C@_0BI@BJFCGOHL@Operation?5not?5permitted?$AA@ 1001bb94 LIBCMT:syserr.obj - 0002:00000bac ??_C@_08INEPGKHH@No?5error?$AA@ 1001bbac LIBCMT:syserr.obj - 0002:00000bb8 ??_C@_1BK@GAEMIDIL@?$AAA?$AAD?$AAV?$AAA?$AAP?$AAI?$AA3?$AA2?$AA?4?$AAD?$AAL?$AAL?$AA?$AA@ 1001bbb8 LIBCMT:rand_s.obj - 0002:00000bd4 ??_C@_1BO@BKOMIGKJ@?$AAr?$AAu?$AAn?$AAt?$AAi?$AAm?$AAe?$AA?5?$AAe?$AAr?$AAr?$AAo?$AAr?$AA?5?$AA?$AA@ 1001bbd4 LIBCMT:crt0msg.obj - 0002:00000bf4 ??_C@_15JNBOKNOG@?$AA?$AN?$AA?6?$AA?$AA@ 1001bbf4 LIBCMT:crt0msg.obj - 0002:00000bfc ??_C@_1BM@JBBEPPHI@?$AAT?$AAL?$AAO?$AAS?$AAS?$AA?5?$AAe?$AAr?$AAr?$AAo?$AAr?$AA?$AN?$AA?6?$AA?$AA@ 1001bbfc LIBCMT:crt0msg.obj - 0002:00000c18 ??_C@_1BK@KMOMNAAI@?$AAS?$AAI?$AAN?$AAG?$AA?5?$AAe?$AAr?$AAr?$AAo?$AAr?$AA?$AN?$AA?6?$AA?$AA@ 1001bc18 LIBCMT:crt0msg.obj - 0002:00000c34 ??_C@_1BO@BFCDCGC@?$AAD?$AAO?$AAM?$AAA?$AAI?$AAN?$AA?5?$AAe?$AAr?$AAr?$AAo?$AAr?$AA?$AN?$AA?6?$AA?$AA@ 1001bc34 LIBCMT:crt0msg.obj - 0002:00000c58 ??_C@_1BOO@KGEDBGAJ@?$AAR?$AA6?$AA0?$AA3?$AA3?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAA?$AAt?$AAt?$AAe?$AAm?$AAp?$AAt?$AA?5?$AAt?$AAo?$AA?5?$AAu?$AAs?$AAe?$AA?5?$AAM?$AAS?$AAI?$AAL?$AA?5?$AAc?$AAo?$AAd@ 1001bc58 LIBCMT:crt0msg.obj - 0002:00000e48 ??_C@_1GG@GOPILAJP@?$AAR?$AA6?$AA0?$AA3?$AA2?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAn?$AAo?$AAt?$AA?5?$AAe?$AAn?$AAo?$AAu?$AAg?$AAh?$AA?5?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?5?$AAf?$AAo?$AAr?$AA?5?$AAl?$AAo@ 1001be48 LIBCMT:crt0msg.obj - 0002:00000eb0 ??_C@_1MG@ENCOOIDF@?$AAR?$AA6?$AA0?$AA3?$AA1?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAA?$AAt?$AAt?$AAe?$AAm?$AAp?$AAt?$AA?5?$AAt?$AAo?$AA?5?$AAi?$AAn?$AAi?$AAt?$AAi?$AAa?$AAl?$AAi?$AAz?$AAe?$AA?5?$AAt@ 1001beb0 LIBCMT:crt0msg.obj - 0002:00000f78 ??_C@_1DO@BMFCDCD@?$AAR?$AA6?$AA0?$AA3?$AA0?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAC?$AAR?$AAT?$AA?5?$AAn?$AAo?$AAt?$AA?5?$AAi?$AAn?$AAi?$AAt?$AAi?$AAa?$AAl?$AAi?$AAz?$AAe?$AAd?$AA?$AN?$AA?6?$AA?$AA@ 1001bf78 LIBCMT:crt0msg.obj - 0002:00000fb8 ??_C@_1EK@HHFLMAOL@?$AAR?$AA6?$AA0?$AA2?$AA8?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAu?$AAn?$AAa?$AAb?$AAl?$AAe?$AA?5?$AAt?$AAo?$AA?5?$AAi?$AAn?$AAi?$AAt?$AAi?$AAa?$AAl?$AAi?$AAz?$AAe?$AA?5?$AAh?$AAe@ 1001bfb8 LIBCMT:crt0msg.obj - 0002:00001008 ??_C@_1GK@MFGOKLAG@?$AAR?$AA6?$AA0?$AA2?$AA7?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAn?$AAo?$AAt?$AA?5?$AAe?$AAn?$AAo?$AAu?$AAg?$AAh?$AA?5?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?5?$AAf?$AAo?$AAr?$AA?5?$AAl?$AAo@ 1001c008 LIBCMT:crt0msg.obj - 0002:00001078 ??_C@_1GK@MCAAGJMO@?$AAR?$AA6?$AA0?$AA2?$AA6?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAn?$AAo?$AAt?$AA?5?$AAe?$AAn?$AAo?$AAu?$AAg?$AAh?$AA?5?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?5?$AAf?$AAo?$AAr?$AA?5?$AAs?$AAt@ 1001c078 LIBCMT:crt0msg.obj - 0002:000010e8 ??_C@_1EM@MAADIHMB@?$AAR?$AA6?$AA0?$AA2?$AA5?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAp?$AAu?$AAr?$AAe?$AA?5?$AAv?$AAi?$AAr?$AAt?$AAu?$AAa?$AAl?$AA?5?$AAf?$AAu?$AAn?$AAc?$AAt?$AAi?$AAo?$AAn?$AA?5?$AAc@ 1001c0e8 LIBCMT:crt0msg.obj - 0002:00001138 ??_C@_1GK@FHCKBEFA@?$AAR?$AA6?$AA0?$AA2?$AA4?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAn?$AAo?$AAt?$AA?5?$AAe?$AAn?$AAo?$AAu?$AAg?$AAh?$AA?5?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?5?$AAf?$AAo?$AAr?$AA?5?$AA_?$AAo@ 1001c138 LIBCMT:crt0msg.obj - 0002:000011a8 ??_C@_1FC@ECHBIFBC@?$AAR?$AA6?$AA0?$AA1?$AA9?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAu?$AAn?$AAa?$AAb?$AAl?$AAe?$AA?5?$AAt?$AAo?$AA?5?$AAo?$AAp?$AAe?$AAn?$AA?5?$AAc?$AAo?$AAn?$AAs?$AAo?$AAl?$AAe?$AA?5@ 1001c1a8 LIBCMT:crt0msg.obj - 0002:00001200 ??_C@_1EC@JIBHAOPH@?$AAR?$AA6?$AA0?$AA1?$AA8?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAu?$AAn?$AAe?$AAx?$AAp?$AAe?$AAc?$AAt?$AAe?$AAd?$AA?5?$AAh?$AAe?$AAa?$AAp?$AA?5?$AAe?$AAr?$AAr?$AAo?$AAr?$AA?$AN?$AA?6@ 1001c200 LIBCMT:crt0msg.obj - 0002:00001248 ??_C@_1FK@BEOGODMC@?$AAR?$AA6?$AA0?$AA1?$AA7?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAu?$AAn?$AAe?$AAx?$AAp?$AAe?$AAc?$AAt?$AAe?$AAd?$AA?5?$AAm?$AAu?$AAl?$AAt?$AAi?$AAt?$AAh?$AAr?$AAe?$AAa?$AAd?$AA?5@ 1001c248 LIBCMT:crt0msg.obj - 0002:000012a8 ??_C@_1FI@LOGNIKDM@?$AAR?$AA6?$AA0?$AA1?$AA6?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAn?$AAo?$AAt?$AA?5?$AAe?$AAn?$AAo?$AAu?$AAg?$AAh?$AA?5?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?5?$AAf?$AAo?$AAr?$AA?5?$AAt?$AAh@ 1001c2a8 LIBCMT:crt0msg.obj - 0002:00001300 ??_C@_1EG@BEHAGFJD@?$AAR?$AA6?$AA0?$AA1?$AA0?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAa?$AAb?$AAo?$AAr?$AAt?$AA?$CI?$AA?$CJ?$AA?5?$AAh?$AAa?$AAs?$AA?5?$AAb?$AAe?$AAe?$AAn?$AA?5?$AAc?$AAa?$AAl?$AAl?$AAe?$AAd@ 1001c300 LIBCMT:crt0msg.obj - 0002:00001348 ??_C@_1FI@HONFMGBI@?$AAR?$AA6?$AA0?$AA0?$AA9?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAn?$AAo?$AAt?$AA?5?$AAe?$AAn?$AAo?$AAu?$AAg?$AAh?$AA?5?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?5?$AAf?$AAo?$AAr?$AA?5?$AAe?$AAn@ 1001c348 LIBCMT:crt0msg.obj - 0002:000013a0 ??_C@_1FE@LLNEDJMD@?$AAR?$AA6?$AA0?$AA0?$AA8?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAn?$AAo?$AAt?$AA?5?$AAe?$AAn?$AAo?$AAu?$AAg?$AAh?$AA?5?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?5?$AAf?$AAo?$AAr?$AA?5?$AAa?$AAr@ 1001c3a0 LIBCMT:crt0msg.obj - 0002:000013f8 ??_C@_1FK@PGACCAFB@?$AAR?$AA6?$AA0?$AA0?$AA2?$AA?$AN?$AA?6?$AA?9?$AA?5?$AAf?$AAl?$AAo?$AAa?$AAt?$AAi?$AAn?$AAg?$AA?5?$AAp?$AAo?$AAi?$AAn?$AAt?$AA?5?$AAs?$AAu?$AAp?$AAp?$AAo?$AAr?$AAt?$AA?5@ 1001c3f8 LIBCMT:crt0msg.obj - 0002:00001508 ??_C@_1EK@MBDPDCGA@?$AAM?$AAi?$AAc?$AAr?$AAo?$AAs?$AAo?$AAf?$AAt?$AA?5?$AAV?$AAi?$AAs?$AAu?$AAa?$AAl?$AA?5?$AAC?$AA?$CL?$AA?$CL?$AA?5?$AAR?$AAu?$AAn?$AAt?$AAi?$AAm?$AAe?$AA?5?$AAL?$AAi?$AAb@ 1001c508 LIBCMT:crt0msg.obj - 0002:00001554 ??_C@_15IABLJNFO@?$AA?6?$AA?6?$AA?$AA@ 1001c554 LIBCMT:crt0msg.obj - 0002:0000155c ??_C@_17LGKOMLJ@?$AA?4?$AA?4?$AA?4?$AA?$AA@ 1001c55c LIBCMT:crt0msg.obj - 0002:00001564 ??_C@_1CO@EAEJAADC@?$AA?$DM?$AAp?$AAr?$AAo?$AAg?$AAr?$AAa?$AAm?$AA?5?$AAn?$AAa?$AAm?$AAe?$AA?5?$AAu?$AAn?$AAk?$AAn?$AAo?$AAw?$AAn?$AA?$DO?$AA?$AA@ 1001c564 LIBCMT:crt0msg.obj - 0002:00001594 ??_C@_1DE@JNGNBFGO@?$AAR?$AAu?$AAn?$AAt?$AAi?$AAm?$AAe?$AA?5?$AAE?$AAr?$AAr?$AAo?$AAr?$AA?$CB?$AA?6?$AA?6?$AAP?$AAr?$AAo?$AAg?$AAr?$AAa?$AAm?$AA?3?$AA?5?$AA?$AA@ 1001c594 LIBCMT:crt0msg.obj - 0002:000015c8 __XcptActTab 1001c5c8 LIBCMT:winxfltr.obj - 0002:00001658 __First_FPE_Indx 1001c658 LIBCMT:winxfltr.obj - 0002:0000165c __Num_FPE 1001c65c LIBCMT:winxfltr.obj - 0002:00001660 __XcptActTabSize 1001c660 LIBCMT:winxfltr.obj - 0002:00001664 __XcptActTabCount 1001c664 LIBCMT:winxfltr.obj - 0002:00001668 ??_C@_1BC@GDGBMEMK@?$AAH?$AAH?$AA?3?$AAm?$AAm?$AA?3?$AAs?$AAs?$AA?$AA@ 1001c668 LIBCMT:nlsdata2.obj - 0002:0000167c ??_C@_1CI@KNAKOEBC@?$AAd?$AAd?$AAd?$AAd?$AA?0?$AA?5?$AAM?$AAM?$AAM?$AAM?$AA?5?$AAd?$AAd?$AA?0?$AA?5?$AAy?$AAy?$AAy?$AAy?$AA?$AA@ 1001c67c LIBCMT:nlsdata2.obj - 0002:000016a4 ??_C@_1BC@IEBCMHCM@?$AAM?$AAM?$AA?1?$AAd?$AAd?$AA?1?$AAy?$AAy?$AA?$AA@ 1001c6a4 LIBCMT:nlsdata2.obj - 0002:000016b8 ??_C@_15CLMNNGEL@?$AAP?$AAM?$AA?$AA@ 1001c6b8 LIBCMT:nlsdata2.obj - 0002:000016c0 ??_C@_15ODEHAHHF@?$AAA?$AAM?$AA?$AA@ 1001c6c0 LIBCMT:nlsdata2.obj - 0002:000016c8 ??_C@_1BC@FEMKIFH@?$AAD?$AAe?$AAc?$AAe?$AAm?$AAb?$AAe?$AAr?$AA?$AA@ 1001c6c8 LIBCMT:nlsdata2.obj - 0002:000016dc ??_C@_1BC@BGLIFPF@?$AAN?$AAo?$AAv?$AAe?$AAm?$AAb?$AAe?$AAr?$AA?$AA@ 1001c6dc LIBCMT:nlsdata2.obj - 0002:000016f0 ??_C@_1BA@EPANDLNG@?$AAO?$AAc?$AAt?$AAo?$AAb?$AAe?$AAr?$AA?$AA@ 1001c6f0 LIBCMT:nlsdata2.obj - 0002:00001700 ??_C@_1BE@DKAAMBJL@?$AAS?$AAe?$AAp?$AAt?$AAe?$AAm?$AAb?$AAe?$AAr?$AA?$AA@ 1001c700 LIBCMT:nlsdata2.obj - 0002:00001714 ??_C@_1O@PAHLKOAC@?$AAA?$AAu?$AAg?$AAu?$AAs?$AAt?$AA?$AA@ 1001c714 LIBCMT:nlsdata2.obj - 0002:00001724 ??_C@_19BIFMLPCD@?$AAJ?$AAu?$AAl?$AAy?$AA?$AA@ 1001c724 LIBCMT:nlsdata2.obj - 0002:00001730 ??_C@_19EPFLPGAP@?$AAJ?$AAu?$AAn?$AAe?$AA?$AA@ 1001c730 LIBCMT:nlsdata2.obj - 0002:0000173c ??_C@_1M@GJNLMHFD@?$AAA?$AAp?$AAr?$AAi?$AAl?$AA?$AA@ 1001c73c LIBCMT:nlsdata2.obj - 0002:00001748 ??_C@_1M@IKEENEDF@?$AAM?$AAa?$AAr?$AAc?$AAh?$AA?$AA@ 1001c748 LIBCMT:nlsdata2.obj - 0002:00001754 ??_C@_1BC@JGDDFFAM@?$AAF?$AAe?$AAb?$AAr?$AAu?$AAa?$AAr?$AAy?$AA?$AA@ 1001c754 LIBCMT:nlsdata2.obj - 0002:00001768 ??_C@_1BA@EFMEIEBA@?$AAJ?$AAa?$AAn?$AAu?$AAa?$AAr?$AAy?$AA?$AA@ 1001c768 LIBCMT:nlsdata2.obj - 0002:00001778 ??_C@_17EGKACKIF@?$AAD?$AAe?$AAc?$AA?$AA@ 1001c778 LIBCMT:nlsdata2.obj - 0002:00001780 ??_C@_17BBDMLCIG@?$AAN?$AAo?$AAv?$AA?$AA@ 1001c780 LIBCMT:nlsdata2.obj - 0002:00001788 ??_C@_17FNLKOI@?$AAO?$AAc?$AAt?$AA?$AA@ 1001c788 LIBCMT:nlsdata2.obj - 0002:00001790 ??_C@_17HCHCOKMG@?$AAS?$AAe?$AAp?$AA?$AA@ 1001c790 LIBCMT:nlsdata2.obj - 0002:00001798 ??_C@_17ICPELBCN@?$AAA?$AAu?$AAg?$AA?$AA@ 1001c798 LIBCMT:nlsdata2.obj - 0002:000017a0 ??_C@_17IJPCKHK@?$AAJ?$AAu?$AAl?$AA?$AA@ 1001c7a0 LIBCMT:nlsdata2.obj - 0002:000017a8 ??_C@_17KCJGOCPB@?$AAJ?$AAu?$AAn?$AA?$AA@ 1001c7a8 LIBCMT:nlsdata2.obj - 0002:000017b0 ??_C@_17PNNKMEED@?$AAM?$AAa?$AAy?$AA?$AA@ 1001c7b0 LIBCMT:nlsdata2.obj - 0002:000017b8 ??_C@_17LFPOIHDD@?$AAA?$AAp?$AAr?$AA?$AA@ 1001c7b8 LIBCMT:nlsdata2.obj - 0002:000017c0 ??_C@_17CKNLEDEC@?$AAM?$AAa?$AAr?$AA?$AA@ 1001c7c0 LIBCMT:nlsdata2.obj - 0002:000017c8 ??_C@_17LMDJEKJN@?$AAF?$AAe?$AAb?$AA?$AA@ 1001c7c8 LIBCMT:nlsdata2.obj - 0002:000017d0 ??_C@_17DKNBKCHM@?$AAJ?$AAa?$AAn?$AA?$AA@ 1001c7d0 LIBCMT:nlsdata2.obj - 0002:000017d8 ??_C@_1BC@ENMNNPAJ@?$AAS?$AAa?$AAt?$AAu?$AAr?$AAd?$AAa?$AAy?$AA?$AA@ 1001c7d8 LIBCMT:nlsdata2.obj - 0002:000017ec ??_C@_1O@PDICJHAG@?$AAF?$AAr?$AAi?$AAd?$AAa?$AAy?$AA?$AA@ 1001c7ec LIBCMT:nlsdata2.obj - 0002:000017fc ??_C@_1BC@HHMNLIHE@?$AAT?$AAh?$AAu?$AAr?$AAs?$AAd?$AAa?$AAy?$AA?$AA@ 1001c7fc LIBCMT:nlsdata2.obj - 0002:00001810 ??_C@_1BE@EBOGMDOH@?$AAW?$AAe?$AAd?$AAn?$AAe?$AAs?$AAd?$AAa?$AAy?$AA?$AA@ 1001c810 LIBCMT:nlsdata2.obj - 0002:00001824 ??_C@_1BA@ENFBFFEK@?$AAT?$AAu?$AAe?$AAs?$AAd?$AAa?$AAy?$AA?$AA@ 1001c824 LIBCMT:nlsdata2.obj - 0002:00001834 ??_C@_1O@MMNBFLIA@?$AAM?$AAo?$AAn?$AAd?$AAa?$AAy?$AA?$AA@ 1001c834 LIBCMT:nlsdata2.obj - 0002:00001844 ??_C@_1O@IHNHDHPB@?$AAS?$AAu?$AAn?$AAd?$AAa?$AAy?$AA?$AA@ 1001c844 LIBCMT:nlsdata2.obj - 0002:00001854 ??_C@_17GGIBDPIH@?$AAS?$AAa?$AAt?$AA?$AA@ 1001c854 LIBCMT:nlsdata2.obj - 0002:0000185c ??_C@_17HFOLPPLP@?$AAF?$AAr?$AAi?$AA?$AA@ 1001c85c LIBCMT:nlsdata2.obj - 0002:00001864 ??_C@_17PDPHAADD@?$AAT?$AAh?$AAu?$AA?$AA@ 1001c864 LIBCMT:nlsdata2.obj - 0002:0000186c ??_C@_17CJEDCEPE@?$AAW?$AAe?$AAd?$AA?$AA@ 1001c86c LIBCMT:nlsdata2.obj - 0002:00001874 ??_C@_17BMKGEGOJ@?$AAT?$AAu?$AAe?$AA?$AA@ 1001c874 LIBCMT:nlsdata2.obj - 0002:0000187c ??_C@_17KBOMKBF@?$AAM?$AAo?$AAn?$AA?$AA@ 1001c87c LIBCMT:nlsdata2.obj - 0002:00001884 ??_C@_17MBGCMIPB@?$AAS?$AAu?$AAn?$AA?$AA@ 1001c884 LIBCMT:nlsdata2.obj - 0002:0000188c ??_C@_08JCCMCCIL@HH?3mm?3ss?$AA@ 1001c88c LIBCMT:nlsdata2.obj - 0002:00001898 ??_C@_0BE@CKGJFCPC@dddd?0?5MMMM?5dd?0?5yyyy?$AA@ 1001c898 LIBCMT:nlsdata2.obj - 0002:000018ac ??_C@_08BPBNCDIB@MM?1dd?1yy?$AA@ 1001c8ac LIBCMT:nlsdata2.obj - 0002:000018b8 ??_C@_02CJNFDJBF@PM?$AA@ 1001c8b8 LIBCMT:nlsdata2.obj - 0002:000018bc ??_C@_02DEDBPAFC@AM?$AA@ 1001c8bc LIBCMT:nlsdata2.obj - 0002:000018c0 ??_C@_08EDHMEBNP@December?$AA@ 1001c8c0 LIBCMT:nlsdata2.obj - 0002:000018cc ??_C@_08HCHEGEOA@November?$AA@ 1001c8cc LIBCMT:nlsdata2.obj - 0002:000018d8 ??_C@_07JJNFCEND@October?$AA@ 1001c8d8 LIBCMT:nlsdata2.obj - 0002:000018e0 ??_C@_09BHHEALKD@September?$AA@ 1001c8e0 LIBCMT:nlsdata2.obj - 0002:000018ec ??_C@_06LBBHFDDG@August?$AA@ 1001c8ec LIBCMT:nlsdata2.obj - 0002:000018f4 ??_C@_04MIEPOIFP@July?$AA@ 1001c8f4 LIBCMT:nlsdata2.obj - 0002:000018fc ??_C@_04CNLMGBGM@June?$AA@ 1001c8fc LIBCMT:nlsdata2.obj - 0002:00001904 ??_C@_05DMJDNLEJ@April?$AA@ 1001c904 LIBCMT:nlsdata2.obj - 0002:0000190c ??_C@_05HPCKOFNC@March?$AA@ 1001c90c LIBCMT:nlsdata2.obj - 0002:00001914 ??_C@_08GNJGEPFN@February?$AA@ 1001c914 LIBCMT:nlsdata2.obj - 0002:00001920 ??_C@_07CGJPFGJA@January?$AA@ 1001c920 LIBCMT:nlsdata2.obj - 0002:00001928 ??_C@_03MKABNOCG@Dec?$AA@ 1001c928 LIBCMT:nlsdata2.obj - 0002:0000192c ??_C@_03JPJOFNIA@Nov?$AA@ 1001c92c LIBCMT:nlsdata2.obj - 0002:00001930 ??_C@_03BMAOKBAD@Oct?$AA@ 1001c930 LIBCMT:nlsdata2.obj - 0002:00001934 ??_C@_03GGCAPAJC@Sep?$AA@ 1001c934 LIBCMT:nlsdata2.obj - 0002:00001938 ??_C@_03IFJFEIGA@Aug?$AA@ 1001c938 LIBCMT:nlsdata2.obj - 0002:0000193c ??_C@_03LBGABGKK@Jul?$AA@ 1001c93c LIBCMT:nlsdata2.obj - 0002:00001940 ??_C@_03IDFGHECI@Jun?$AA@ 1001c940 LIBCMT:nlsdata2.obj - 0002:00001944 ??_C@_03CNMDKL@May?$AA@ 1001c944 LIBCMT:nlsdata2.obj - 0002:00001948 ??_C@_03LEOLGMJP@Apr?$AA@ 1001c948 LIBCMT:nlsdata2.obj - 0002:0000194c ??_C@_03ODNJBKGA@Mar?$AA@ 1001c94c LIBCMT:nlsdata2.obj - 0002:00001950 ??_C@_03HJBDCHOM@Feb?$AA@ 1001c950 LIBCMT:nlsdata2.obj - 0002:00001954 ??_C@_03JIHJHPIE@Jan?$AA@ 1001c954 LIBCMT:nlsdata2.obj - 0002:00001958 ??_C@_08INBOOONO@Saturday?$AA@ 1001c958 LIBCMT:nlsdata2.obj - 0002:00001964 ??_C@_06JECMNKMI@Friday?$AA@ 1001c964 LIBCMT:nlsdata2.obj - 0002:0000196c ??_C@_08HACCIKIA@Thursday?$AA@ 1001c96c LIBCMT:nlsdata2.obj - 0002:00001978 ??_C@_09DLIGFAKA@Wednesday?$AA@ 1001c978 LIBCMT:nlsdata2.obj - 0002:00001984 ??_C@_07BAAGCFCM@Tuesday?$AA@ 1001c984 LIBCMT:nlsdata2.obj - 0002:0000198c ??_C@_06JLEDEDGH@Monday?$AA@ 1001c98c LIBCMT:nlsdata2.obj - 0002:00001994 ??_C@_06OOPIFAJ@Sunday?$AA@ 1001c994 LIBCMT:nlsdata2.obj - 0002:0000199c ??_C@_03FEFJNEK@Sat?$AA@ 1001c99c LIBCMT:nlsdata2.obj - 0002:000019a0 ??_C@_03IDIOELNC@Fri?$AA@ 1001c9a0 LIBCMT:nlsdata2.obj - 0002:000019a4 ??_C@_03IOFIKPDN@Thu?$AA@ 1001c9a4 LIBCMT:nlsdata2.obj - 0002:000019a8 ??_C@_03MHOMLAJA@Wed?$AA@ 1001c9a8 LIBCMT:nlsdata2.obj - 0002:000019ac ??_C@_03NAGEINEP@Tue?$AA@ 1001c9ac LIBCMT:nlsdata2.obj - 0002:000019b0 ??_C@_03PDAGKDH@Mon?$AA@ 1001c9b0 LIBCMT:nlsdata2.obj - 0002:000019b4 ??_C@_03KOEHGMDN@Sun?$AA@ 1001c9b4 LIBCMT:nlsdata2.obj - 0002:000019b8 ___lookuptable_s 1001c9b8 LIBCMT:outputs.obj - 0002:00001a30 ??_C@_1CK@HHHCOJPD@?$AAE?$AAn?$AAv?$AAi?$AAr?$AAo?$AAn?$AAm?$AAe?$AAn?$AAt?$AAD?$AAi?$AAr?$AAe?$AAc?$AAt?$AAo?$AAr?$AAy?$AA?$AA@ 1001ca30 LIBCMT:_pdblkup_.obj - 0002:00001a60 ??_C@_1FM@DNCABAP@?$AAS?$AAO?$AAF?$AAT?$AAW?$AAA?$AAR?$AAE?$AA?2?$AAM?$AAi?$AAc?$AAr?$AAo?$AAs?$AAo?$AAf?$AAt?$AA?2?$AAV?$AAi?$AAs?$AAu?$AAa?$AAl?$AAS?$AAt?$AAu?$AAd?$AAi?$AAo?$AA?2@ 1001ca60 LIBCMT:_pdblkup_.obj - 0002:00001abc ??_C@_0M@HLOHPNFA@RegCloseKey?$AA@ 1001cabc LIBCMT:_pdblkup_.obj - 0002:00001ac8 ??_C@_0BB@GLNAEDBD@RegQueryValueExW?$AA@ 1001cac8 LIBCMT:_pdblkup_.obj - 0002:00001adc ??_C@_0O@COHOBMLB@RegOpenKeyExW?$AA@ 1001cadc LIBCMT:_pdblkup_.obj - 0002:00001aec ??_C@_01KDCPPGHE@r?$AA@ 1001caec LIBCMT:_pdblkup_.obj - 0002:00001af0 ??_C@_0BB@KCIACLNC@PDBOpenValidate5?$AA@ 1001caf0 LIBCMT:_pdblkup_.obj - 0002:00001b04 ??_C@_0BI@DFKBFLJE@GetProcessWindowStation?$AA@ 1001cb04 LIBCMT:crtmboxw.obj - 0002:00001b1c ??_C@_0BK@DEKFELLI@GetUserObjectInformationW?$AA@ 1001cb1c LIBCMT:crtmboxw.obj - 0002:00001b38 ??_C@_0BD@HHGDFDBJ@GetLastActivePopup?$AA@ 1001cb38 LIBCMT:crtmboxw.obj - 0002:00001b4c ??_C@_0BA@HNOPNCHB@GetActiveWindow?$AA@ 1001cb4c LIBCMT:crtmboxw.obj - 0002:00001b5c ??_C@_0M@DLDCCGNP@MessageBoxW?$AA@ 1001cb5c LIBCMT:crtmboxw.obj - 0002:00001b68 ??_C@_1BG@GOEBHBDC@?$AAU?$AAS?$AAE?$AAR?$AA3?$AA2?$AA?4?$AAD?$AAL?$AAL?$AA?$AA@ 1001cb68 LIBCMT:crtmboxw.obj - 0002:00001c00 ___newctype 1001cc00 LIBCMT:ctype.obj - 0002:00001f00 __wctype 1001cf00 LIBCMT:ctype.obj - 0002:00002108 ___newclmap 1001d108 LIBCMT:ctype.obj - 0002:00002288 ___newcumap 1001d288 LIBCMT:ctype.obj - 0002:00002408 ??_C@_1BA@BALFACEM@?$AAC?$AAO?$AAN?$AAO?$AAU?$AAT?$AA$?$AA?$AA@ 1001d408 LIBCMT:initcon.obj - 0002:00002418 ??_C@_06IMKFLFPG@1?$CDQNAN?$AA@ 1001d418 LIBCMT:_x10fout_.obj - 0002:00002420 ??_C@_05DNEBIAHO@1?$CDINF?$AA@ 1001d420 LIBCMT:_x10fout_.obj - 0002:00002428 ??_C@_05PHHOCPM@1?$CDIND?$AA@ 1001d428 LIBCMT:_x10fout_.obj - 0002:00002430 ??_C@_06PGGFOGJG@1?$CDSNAN?$AA@ 1001d430 LIBCMT:_x10fout_.obj - 0002:00002438 __load_config_used 1001d438 LIBCMT:loadcfg.obj - 0002:00002480 ___safe_se_handler_table 1001d480 - 0002:0000248c ___rtc_iaa 1001d48c LIBCMT:_initsect_.obj - 0002:00002490 ___rtc_izz 1001d490 LIBCMT:_initsect_.obj - 0002:00002494 ___rtc_taa 1001d494 LIBCMT:_initsect_.obj - 0002:00002498 ___rtc_tzz 1001d498 LIBCMT:_initsect_.obj - 0002:0000293c __IMPORT_DESCRIPTOR_ADVAPI32 1001d93c Advapi32:ADVAPI32.dll - 0002:00002950 __IMPORT_DESCRIPTOR_USER32 1001d950 User32:USER32.dll - 0002:00002964 __IMPORT_DESCRIPTOR_KERNEL32 1001d964 kernel32:KERNEL32.dll - 0002:00002978 __NULL_IMPORT_DESCRIPTOR 1001d978 Advapi32:ADVAPI32.dll - 0003:00000038 _SVN_REV 1001f038 api.obj - 0003:00003f20 ___security_cookie 10022f20 LIBCMT:gs_cookie.obj - 0003:00003f24 ___security_cookie_complement 10022f24 LIBCMT:gs_cookie.obj - 0003:000040a0 __fltused 100230a0 LIBCMT:_fpinit_.obj - 0003:000040a4 __ldused 100230a4 LIBCMT:_fpinit_.obj - 0003:000040a8 __iob 100230a8 LIBCMT:_file.obj - 0003:00004330 ___nullstring 10023330 LIBCMT:output.obj - 0003:00004334 ___wnullstring 10023334 LIBCMT:output.obj - 0003:00004338 ?_RTC_ErrorLevels@@3PAHA 10023338 LIBCMT:_error_.obj - 0003:00004350 __timezone 10023350 LIBCMT:timeset.obj - 0003:00004354 __daylight 10023354 LIBCMT:timeset.obj - 0003:00004358 __dstbias 10023358 LIBCMT:timeset.obj - 0003:000043e0 __tzname 100233e0 LIBCMT:timeset.obj - 0003:00004400 ___flsindex 10023400 LIBCMT:tidtable.obj - 0003:00004404 ___getvalueindex 10023404 LIBCMT:tidtable.obj - 0003:00004408 __lookuptrailbytes 10023408 LIBCMT:read.obj - 0003:00004508 ___badioinfo 10023508 LIBCMT:ioinit.obj - 0003:00004550 __cfltcvt_tab 10023550 LIBCMT:cmiscdat.obj - 0003:00004698 __sys_errlist 10023698 LIBCMT:syserr.obj - 0003:00004748 __sys_nerr 10023748 LIBCMT:syserr.obj - 0003:00004750 ___initialmbcinfo 10023750 LIBCMT:mbctype.obj - 0003:00004970 __mbctype 10023970 LIBCMT:mbctype.obj - 0003:00004a78 __mbcasemap 10023a78 LIBCMT:mbctype.obj - 0003:00004b78 ___ptmbcinfo 10023b78 LIBCMT:mbctype.obj - 0003:00004c70 ___globallocalestatus 10023c70 LIBCMT:glstatus.obj - 0003:00004c74 ___clocalestr 10023c74 LIBCMT:nlsdata2.obj - 0003:00004c78 ___lc_time_c 10023c78 LIBCMT:nlsdata2.obj - 0003:00004de0 ___initiallocinfo 10023de0 LIBCMT:nlsdata2.obj - 0003:00004eb8 ___ptlocinfo 10023eb8 LIBCMT:nlsdata2.obj - 0003:00004ebc ___initiallocalestructinfo 10023ebc LIBCMT:nlsdata2.obj - 0003:00004ed0 __lpdays 10023ed0 LIBCMT:days.obj - 0003:00004f04 __days 10023f04 LIBCMT:days.obj - 0003:00004f40 ___abort_behavior 10023f40 LIBCMT:abort.obj - 0003:00004f50 ___lconv_static_decimal 10023f50 LIBCMT:lconv.obj - 0003:00004f54 ___lconv_static_W_decimal 10023f54 LIBCMT:lconv.obj - 0003:00004f58 ___lconv_c 10023f58 LIBCMT:lconv.obj - 0003:00004fa8 ___lconv 10023fa8 LIBCMT:lconv.obj - 0003:00004fac __pctype 10023fac LIBCMT:ctype.obj - 0003:00004fb0 __pwctype 10023fb0 LIBCMT:ctype.obj - 0003:00004fb4 __confh 10023fb4 LIBCMT:initcon.obj - 0003:00004fc0 __NLG_Destination 10023fc0 LIBCMT:exsup.obj - 0003:00005000 ___mb_cur_max 10024000 LIBCMT:nlsdata1.obj - 0003:00005004 ___decimal_point 10024004 LIBCMT:nlsdata1.obj - 0003:00005008 ___decimal_point_length 10024008 LIBCMT:nlsdata1.obj - 0003:00005010 __pow10pos 10024010 LIBCMT:_constpow_.obj - 0003:00005170 __pow10neg 10024170 LIBCMT:_constpow_.obj - 0003:00005300 _svn_rev 10024300 api.obj - 0003:00005380 _default_xbee 10024380 api.obj - 0003:00005384 _glob_hModule 10024384 api.obj - 0003:00005388 _win32_hWnd 10024388 api.obj - 0003:0000538c _win32_MessageID 1002438c api.obj - 0003:00005398 ___fastflag 10024398 LIBCMT:_fpinit_.obj - 0003:0000539c __cflush 1002439c LIBCMT:_file.obj - 0003:000053a0 __umaskval 100243a0 LIBCMT:crt0dat.obj - 0003:000053a4 ___argc 100243a4 LIBCMT:crt0dat.obj - 0003:000053a8 ___argv 100243a8 LIBCMT:crt0dat.obj - 0003:000053ac ___wargv 100243ac LIBCMT:crt0dat.obj - 0003:000053b0 __environ 100243b0 LIBCMT:crt0dat.obj - 0003:000053b4 ___initenv 100243b4 LIBCMT:crt0dat.obj - 0003:000053b8 __wenviron 100243b8 LIBCMT:crt0dat.obj - 0003:000053bc ___winitenv 100243bc LIBCMT:crt0dat.obj - 0003:000053c0 __pgmptr 100243c0 LIBCMT:crt0dat.obj - 0003:000053c4 __wpgmptr 100243c4 LIBCMT:crt0dat.obj - 0003:000053c8 __exitflag 100243c8 LIBCMT:crt0dat.obj - 0003:000053cc __C_Termination_Done 100243cc LIBCMT:crt0dat.obj - 0003:000053d0 __C_Exit_Done 100243d0 LIBCMT:crt0dat.obj - 0003:000053d8 __aenvptr 100243d8 LIBCMT:dllcrt0.obj - 0003:000053dc __wenvptr 100243dc LIBCMT:dllcrt0.obj - 0003:000053e0 ___error_mode 100243e0 LIBCMT:dllcrt0.obj - 0003:000053e4 ___app_type 100243e4 LIBCMT:dllcrt0.obj - 0003:000053e8 ___pInvalidArgHandler 100243e8 LIBCMT:invarg.obj - 0003:00005714 ?wsprintffp@@3P6AHPADPBDZZA 10024714 LIBCMT:_error_.obj - 0003:00005720 __crtheap 10024720 LIBCMT:heapinit.obj - 0003:000057e0 _gpFlsAlloc 100247e0 LIBCMT:tidtable.obj - 0003:000057e4 _gpFlsGetValue 100247e4 LIBCMT:tidtable.obj - 0003:000057e8 _gpFlsSetValue 100247e8 LIBCMT:tidtable.obj - 0003:000057ec _gpFlsFree 100247ec LIBCMT:tidtable.obj - 0003:000057f0 __stdbuf 100247f0 LIBCMT:_sftbuf.obj - 0003:00005948 __maxwait 10024948 LIBCMT:crtheap.obj - 0003:0000594c ?__pInconsistency@@3P6AXXZA 1002494c LIBCMT:hooks.obj - 0003:00005968 ___pPurecall 10024968 LIBCMT:inithelp.obj - 0003:0000596c ?_pnhHeap@@3P6AHI@ZA 1002496c LIBCMT:handler.obj - 0003:00005f98 __newmode 10024f98 LIBCMT:_newmode.obj - 0003:000060ac ___mbulinfo 100250ac LIBCMT:mbctype.obj - 0003:000060b8 ___mbcodepage 100250b8 LIBCMT:mbctype.obj - 0003:000060bc ___ismbcodepage 100250bc LIBCMT:mbctype.obj - 0003:000060c0 ___mblcid 100250c0 LIBCMT:mbctype.obj - 0003:000060d0 __fmode 100250d0 LIBCMT:txtmode.obj - 0003:000060d4 __outputformat 100250d4 LIBCMT:outputformat.obj - 0003:000060ec ___locale_changed 100250ec LIBCMT:setlocal.obj - 0003:000060f0 ___lconv_static_null 100250f0 LIBCMT:lconv.obj - 0003:000060f4 ___lconv_static_W_null 100250f4 LIBCMT:lconv.obj - 0003:000060f8 __commode 100250f8 LIBCMT:ncommode.obj - 0003:000060fc _xbee_hnd_mutex 100250fc - 0003:00006100 __debugger_hook_dummy 10025100 - 0003:00006104 ___sse2_available 10025104 - 0003:00006108 __pDestructExceptionObject 10025108 - 0003:0000610c __nhandle 1002510c - 0003:00006120 ___pioinfo 10025120 - 0003:00006220 __acmdln 10025220 - 0003:00006224 ___env_initialized 10025224 - 0003:00006228 ___onexitend 10025228 - 0003:0000622c ___onexitbegin 1002522c - 0003:00006230 ___mbctype_initialized 10025230 - 0003:00006234 ___dyn_tls_init_callback 10025234 - 0003:00006238 ___piob 10025238 - 0003:00006240 __bufin 10025240 - 0003:00007240 __nstream 10026240 - - entry point at 0001:0000da7c - - Static symbols - - 0001:00001190 _xbee_logf 10002190 f api.obj - 0001:00001a00 _Xfree2@4 10002a00 f api.obj - 0001:00002af0 _init_serial@8 10003af0 f api.obj - 0001:00002db0 _Xmalloc2@8 10003db0 f api.obj - 0001:00002e50 _Xcalloc2@8 10003e50 f api.obj - 0001:00002ef0 _xbee_startAPI@4 10003ef0 f api.obj - 0001:00003110 _xbee_sendAT@16 10004110 f api.obj - 0001:00003140 _xbee_sendATdelay@20 10004140 f api.obj - 0001:00003630 _xbee_select@8 10004630 f api.obj - 0001:00005820 _xbee_matchpktcon@12 10006820 f api.obj - 0001:00005b20 _xbee_listen_wrapper@4 10006b20 f api.obj - 0001:00005c30 _xbee_listen@4 10006c30 f api.obj - 0001:00008d10 _Xrealloc2@12 10009d10 f api.obj - 0001:00008d70 _xbee_parse_io@24 10009d70 f api.obj - 0001:00009480 _xbee_callbackWrapper@4 1000a480 f api.obj - 0001:00009970 _xbee_thread_watch@4 1000a970 f api.obj - 0001:00009bb0 _xbee_getbyte@4 1000abb0 f api.obj - 0001:00009c00 _xbee_getrawbyte@4 1000ac00 f api.obj - 0001:00009dc0 __xbee_send_pkt@12 1000adc0 f api.obj - 0001:0000a2e0 _xbee_make_pkt@12 1000b2e0 f api.obj - 0001:0000a7d1 __tsopen_nolock 1000b7d1 f LIBCMT:open.obj - 0001:0000b225 _flsall 1000c225 f LIBCMT:fflush.obj - 0001:0000bae4 _doexit 1000cae4 f LIBCMT:crt0dat.obj - 0001:0000d986 ___DllMainCRTStartup 1000e986 f LIBCMT:dllcrt0.obj - 0001:0000dc8a _write_char 1000ec8a f LIBCMT:output.obj - 0001:0000dcbd _write_string 1000ecbd f LIBCMT:output.obj - 0001:0000eb56 ?DebuggerProbe@@YAHK@Z 1000fb56 f LIBCMT:_error_.obj - 0001:0000eba6 ?DebuggerRuntime@@YAHKHPAXPB_W@Z 1000fba6 f LIBCMT:_error_.obj - 0001:0000ec08 ?failwithmessage@@YAXPAXHHPBD@Z 1000fc08 f LIBCMT:_error_.obj - 0001:0000f019 __tzset_nolock 10010019 f LIBCMT:tzset.obj - 0001:0001167d __shift 1001267d f LIBCMT:cvt.obj - 0001:000116c2 __cftoe2_l 100126c2 f LIBCMT:cvt.obj - 0001:00011c80 __cftof2_l 10012c80 f LIBCMT:cvt.obj - 0001:000127f2 _siglookup 100137f2 f LIBCMT:winsig.obj - 0001:00012a2e __onexit_nolock 10013a2e f LIBCMT:onexit.obj - 0001:00012f9c ?strtoxl@@YAKPAUlocaleinfo_struct@@PBDPAPBDHH@Z 10013f9c f LIBCMT:strtol.obj - 0001:0001349b _parse_cmdline 1001449b f LIBCMT:stdargv.obj - 0001:00013a2b ?CPtoLCID@@YAHH@Z 10014a2b f LIBCMT:mbctype.obj - 0001:00013a5a ?setSBCS@@YAXPAUthreadmbcinfostruct@@@Z 10014a5a f LIBCMT:mbctype.obj - 0001:00013abe ?setSBUpLow@@YAXPAUthreadmbcinfostruct@@@Z 10014abe f LIBCMT:mbctype.obj - 0001:00013cf2 ?getSystemCP@@YAHH@Z 10014cf2 f LIBCMT:mbctype.obj - 0001:000146bd ?GetPdbDll@@YAPAUHINSTANCE__@@XZ 100156bd f LIBCMT:_pdblkup_.obj - 0001:00014e40 __unwind_handler4 10015e40 f LIBCMT:exsup4.obj - 0001:00015e34 ?x_ismbbtype_l@@YAHPAUlocaleinfo_struct@@IHH@Z 10016e34 f LIBCMT:ismbbyte.obj - 0001:00015e9f ?__crtLCMapStringA_stat@@YAHPAUlocaleinfo_struct@@KKPBDHPADHHH@Z 10016e9f f LIBCMT:a_map.obj - 0001:000160cc ?__crtGetStringTypeA_stat@@YAHPAUlocaleinfo_struct@@KPBDHPAGHHH@Z 100170cc f LIBCMT:a_str.obj - 0001:000168c0 __unwind_handler 100178c0 f LIBCMT:exsup.obj - 0001:0001844d __hw_cw 1001944d f LIBCMT:_ieee87_.obj - 0001:000184db ___hw_cw_sse2 100194db f LIBCMT:_ieee87_.obj - 0001:00018950 ?__crtCompareStringA_stat@@YAHPAUlocaleinfo_struct@@KKPBDH1HH@Z 10019950 f LIBCMT:a_cmp.obj - 0001:00018cea _findenv 10019cea f LIBCMT:setenv.obj - 0001:00018d3c _copy_environ 10019d3c f LIBCMT:setenv.obj - 0001:000196ea __dup_nolock 1001a6ea f LIBCMT:dup.obj diff --git a/libs/thirdParty/libxbee/main.c b/libs/thirdParty/libxbee/main.c deleted file mode 100644 index 7dcacafa7..000000000 --- a/libs/thirdParty/libxbee/main.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -#include -#include -#include - -#include "xbee.h" - -int main(int argc, char *argv[]) { - xbee_con *con, *con2; - xbee_pkt *pkt, *p; - - if (xbee_setuplog("/dev/ttyUSB0",57600,2) == -1) { - perror("xbee_setuplog()"); - exit(1); - } - if (argc >= 2 && !strcmp(argv[1],"sleep")) { - for (;;) { - sleep(86400); /* sleep for a day... forever :) */ - } - } - - /*if ((con = xbee_newcon(NULL,'X',xbee_localAT)) == (void *)-1) { - printf("error creating connection...\n"); - exit(1); - } - - while(1){sleep(10);} - - xbee_senddata(con,"CH%c",0x0C); - sleep(1); - xbee_senddata(con,"ID%c%c",0x33, 0x32); - sleep(1); - xbee_senddata(con,"DH%c%c%c%c",0x00,0x00,0x00,0x00); - sleep(1); - xbee_senddata(con,"DL%c%c%c%c",0x00,0x00,0x00,0x00); - sleep(1); - xbee_senddata(con,"MY%c%c",0x00,0x00); - sleep(1); - // SH - read only - // SL - read only - xbee_senddata(con,"RR%c",0x00); - sleep(1); - xbee_senddata(con,"RN%c",0x00); - sleep(1); - xbee_senddata(con,"MM%c",0x00); - sleep(1); - xbee_senddata(con,"NT%c",0x19); - sleep(1); - xbee_senddata(con,"NO%c",0x00); - sleep(1); - xbee_senddata(con,"CE%c",0x00); - sleep(1); - xbee_senddata(con,"SC%c%c",0x1F,0xFE); - sleep(1); - xbee_senddata(con,"SD%c",0x04); - sleep(1); - xbee_senddata(con,"A1%c",0x00); - sleep(1); - xbee_senddata(con,"A2%c",0x00); - sleep(1); - // AI - read only - xbee_senddata(con,"EE%c",0x00); - sleep(1); - //xbee_senddata(con,"KY%c",0x00); - //sleep(1); - xbee_senddata(con,"NI%s","TIGGER"); - sleep(1); - xbee_senddata(con,"PL%c",0x04); - sleep(1); - xbee_senddata(con,"CA%c",0x2C); - sleep(1); - xbee_senddata(con,"SM%c",0x00); - sleep(1); - xbee_senddata(con,"ST%c%c",0x13,0x88); - sleep(1); - xbee_senddata(con,"SP%c%c",0x00,0x00); - sleep(1); - xbee_senddata(con,"DP%c%c",0x03,0xE8); - sleep(1); - xbee_senddata(con,"SO%c",0x00); - sleep(1); - xbee_senddata(con,"BD%c",0x06); - sleep(1); - xbee_senddata(con,"RO%c",0x03); - sleep(1); - xbee_senddata(con,"AP%c",0x02); - sleep(1); - xbee_senddata(con,"PR%c",0xFF); - sleep(1); - xbee_senddata(con,"D8%c",0x00); - sleep(1); - xbee_senddata(con,"D7%c",0x01); - sleep(1); - xbee_senddata(con,"D6%c",0x00); - sleep(1); - xbee_senddata(con,"D5%c",0x01); - sleep(1); - xbee_senddata(con,"D4%c",0x00); - sleep(1); - xbee_senddata(con,"D3%c",0x00); - sleep(1); - xbee_senddata(con,"D2%c",0x00); - sleep(1); - xbee_senddata(con,"D1%c",0x00); - sleep(1); - xbee_senddata(con,"D0%c",0x00); - sleep(1); - xbee_senddata(con,"IU%c",0x00); - sleep(1); - xbee_senddata(con,"IT%c",0x01); - sleep(1); - xbee_senddata(con,"IC%c",0x00); - sleep(1); - xbee_senddata(con,"IR%c%c",0x00,0x00); - sleep(1); - xbee_senddata(con,"IA%c%c%c%c%c%c%c%c",0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); - sleep(1); - xbee_senddata(con,"T0%c",0xFF); - sleep(1); - xbee_senddata(con,"T1%c",0xFF); - sleep(1); - xbee_senddata(con,"T2%c",0xFF); - sleep(1); - xbee_senddata(con,"T3%c",0xFF); - sleep(1); - xbee_senddata(con,"T4%c",0xFF); - sleep(1); - xbee_senddata(con,"T5%c",0xFF); - sleep(1); - xbee_senddata(con,"T6%c",0xFF); - sleep(1); - xbee_senddata(con,"T7%c",0xFF); - sleep(1); - xbee_senddata(con,"P0%c",0x01); - sleep(1); - xbee_senddata(con,"P1%c",0x00); - sleep(1); - xbee_senddata(con,"PT%c",0xFF); - sleep(1); - xbee_senddata(con,"RP%c",0x28); - sleep(1); - // VR - read only - // HV - read only - // DB - read only - // EC - read only - // EA - read only - // DD - read only - xbee_senddata(con,"CT%c",0x64); - sleep(1); - xbee_senddata(con,"GT%c%c",0x03,0xE8); - sleep(1); - xbee_senddata(con,"CC%c",0x2B); - sleep(1); - - sleep(10); - */ - - /* test 64bit IO and Data */ - con = xbee_newcon('I',xbee_64bitIO, 0x0013A200, 0x403af247); - con2 = xbee_newcon('I',xbee_64bitData, 0x0013A200, 0x403af247); - - while (1) { - while ((pkt = xbee_getpacket(con)) != NULL) { - int i; - for (i = 0; i < pkt->samples; i++) { - int m; - for (m = 0; m <= 8; m++) { - if (xbee_hasdigital(pkt,i,m)) printf("D%d: %d ",m,xbee_getdigital(pkt,i,m)); - } -#define Vref 3.23 - for (m = 0; m <= 5; m++) { - if (xbee_hasanalog(pkt,i,m)) printf("A%d: %.2fv ",m,xbee_getanalog(pkt,i,m,Vref)); - } - printf("\n"); - } - if (xbee_senddata(con2, "the time is %d\r", time(NULL))) { - printf("Error: xbee_senddata\n"); - return 1; - } - free(pkt); - if (p) { - switch (p->status) { - case 0x01: printf("XBee: txStatus: No ACK\n"); break; - case 0x02: printf("XBee: txStatus: CCA Failure\n"); break; - case 0x03: printf("XBee: txStatus: Purged\n"); break; - } - free(p); - } - } - while ((pkt = xbee_getpacket(con2)) != NULL) { - printf("he said '%s'\n", pkt->data); - if (xbee_senddata(con2, "you said '%s'\r", pkt->data)) { - printf("Error: xbee_senddata\n"); - return 1; - } - free(pkt); - if (p) { - switch (p->status) { - case 0x01: printf("XBee: txStatus: No ACK\n"); break; - case 0x02: printf("XBee: txStatus: CCA Failure\n"); break; - case 0x03: printf("XBee: txStatus: Purged\n"); break; - } - free(p); - } - } - usleep(100); - } - - return 0; -} diff --git a/libs/thirdParty/libxbee/makefile b/libs/thirdParty/libxbee/makefile deleted file mode 100644 index 11b9d3fa6..000000000 --- a/libs/thirdParty/libxbee/makefile +++ /dev/null @@ -1,226 +0,0 @@ -#-- set this to the man directory you would like to use -MANPATH:=/usr/share/man - -#-- uncomment this to enable debugging -#DEBUG:=-g -DDEBUG - - -###### YOU SHOULD NOT CHANGE BELOW THIS LINE ###### - -VERSION:=1.4.1 -SHELL:=/bin/bash -SRCS:=api.c -MANS:=man3/libxbee.3 \ - man3/xbee_con.3 \ - man3/xbee_end.3 \ - man3/xbee_endcon.3 \ - man3/xbee_flushcon.3 \ - man3/xbee_purgecon.3 \ - man3/xbee_getanalog.3 \ - man3/xbee_getdigital.3 \ - man3/xbee_getpacket.3 \ - man3/xbee_hasanalog.3 \ - man3/xbee_hasdigital.3 \ - man3/xbee_logit.3 \ - man3/xbee_newcon.3 \ - man3/xbee_nsenddata.3 \ - man3/xbee_pkt.3 \ - man3/xbee_senddata.3 \ - man3/xbee_setup.3 \ - man3/xbee_setupAPI.3 \ - man3/xbee_setuplog.3 \ - man3/xbee_setuplogAPI.3 \ - man3/xbee_vsenddata.3 -MANPATHS:=$(foreach dir,$(shell ls man -ln | grep ^d | tr -s ' ' | cut -d ' ' -f 9),${MANPATH}/$(dir)) - -PDFS:=${SRCS} ${SRCS:.c=.h} makefile main.c xbee.h - -CC:=gcc -CFLAGS:=-Wall -Wstrict-prototypes -Wno-variadic-macros -pedantic -c -fPIC ${DEBUG} -CLINKS:=-lpthread -lrt ${DEBUG} -DEFINES:= - -ifeq ($(strip $(wildcard ${MANPATH}/man3/libxbee.3.bz2)),) -FIRSTTIME:=TRUE -else -FIRSTTIME:=FALSE -endif - -ENSCRIPT:=-MA4 --color -f Courier8 -C --margins=15:15:0:20 -ifneq ($(strip $(wildcard /usr/share/enscript/mine-web.hdr)),) - ENSCRIPT+= --fancy-header=mine-web -else - ENSCRIPT+= --fancy-header=a2ps -endif - -SRCS:=${sort ${SRCS}} -PDFS:=${sort ${PDFS}} - -.PHONY: FORCE -.PHONY: all run new clean cleanpdfs main pdfs html -.PHONY: install install_su install_man -.PHONY: uninstall uninstall_su uninstall_man/ - - -# all - do everything (default) # -all: ./lib/libxbee.so.$(VERSION) - @echo "*** Done! ***" - - -# run - remake main and then run # -run: all main - ./bin/main - - -# new - clean and do everything again # -new: clean all - - -# clean - remove any compiled files and PDFs # -clean: - rm -f ./*~ - rm -f ./sample/*~ - rm -f ./obj/*.o - rm -f ./lib/libxbee.so* - rm -f ./bin/main - -cleanpdfs: - rm -f ./pdf/*.pdf - - -# install - installs library # -install: ./lib/libxbee.so.$(VERSION) - @echo - @echo -ifneq ($(shell echo $$USER),root) - @echo "#######################################################################################" - @echo "### To Install this library I need the root password please!" - @echo "#######################################################################################" -endif - su -c "make install_su --no-print-directory" - @echo -ifeq (${FIRSTTIME},TRUE) - @echo "#######################################################################################" - @echo - @pr -h "" -o 3 -w 86 -tT ./README - @echo - @echo "#######################################################################################" -endif - -install_su: /usr/lib/libxbee.so.$(VERSION) /usr/include/xbee.h install_man - -/usr/lib/libxbee.so.$(VERSION): ./lib/libxbee.so.$(VERSION) - cp ./lib/libxbee.so.$(VERSION) /usr/lib/libxbee.so.$(VERSION) -f - @chmod 755 /usr/lib/libxbee.so.$(VERSION) - @chown root:root /usr/lib/libxbee.so.$(VERSION) - ln ./libxbee.so.$(VERSION) /usr/lib/libxbee.so.1 -sf - @chown root:root /usr/lib/libxbee.so.1 - ln ./libxbee.so.$(VERSION) /usr/lib/libxbee.so -sf - @chown root:root /usr/lib/libxbee.so - -/usr/include/xbee.h: ./xbee.h - cp ./xbee.h /usr/include/xbee.h -f - @chmod 644 /usr/include/xbee.h - @chown root:root /usr/include/xbee.h - -install_man: ${MANPATH} ${MANPATHS} ${addsuffix .bz2,${addprefix ${MANPATH}/,${MANS}}} - -${MANPATH} ${MANPATHS}: - @echo "#######################################################################################" - @echo "### $@ does not exist... cannot install man files here!" - @echo "### Please check the directory and the MANPATH variable in the makefile" - @echo "#######################################################################################" - @false - -${MANPATH}/%.bz2: ./man/% - @echo "cat $< | bzip2 -z > $@" - @cat $< | bzip2 -z > $@ || ( \ - echo "#######################################################################################"; \ - echo "### Installing man page '$*' to '$@' failed..."; \ - echo "#######################################################################################"; ) - @chmod 644 $@ - @chown root:root $@ - -./doc/: - mkdir ./doc/ - -html: ./doc/ ./man/ - cd ./doc/; mkdir -p `find ../man/ -type d -not -path *.svn* | cut -b 2-`; - find ./man/ -type f -not -path *.svn* | cut -d / -f 3- | sort > .html_todo - for item in `cat .html_todo`; do \ - man2html -r ./man/$$item | tail -n +3 > ./doc/man/$$item.html; \ - done 2> /dev/null - rm .html_todo - -uninstall: - @echo - @echo -ifneq ($(shell echo $$USER),root) - @echo "#######################################################################################" - @echo "### To Uninstall this library I need the root password please!" - @echo "#######################################################################################" -endif - su -c "make uninstall_su --no-print-directory" - @echo - @echo - -uninstall_su: ${addprefix uninstall_man/,${MANS}} - rm /usr/lib/libxbee.so.$(VERSION) -f - rm /usr/lib/libxbee.so.1 -f - rm /usr/lib/libxbee.so -f - rm /usr/include/xbee.h -f - -uninstall_man/%: - rm ${MANPATH}/$*.bz2 -f - -# main - compile & link objects # -main: ./bin/main - -./bin/main: ./obj/api.o ./bin/ ./main.c - ${CC} ${CLINKS} ./main.c ./obj/api.o -o ./bin/main ${DEBUG} - -./bin/: - mkdir ./bin/ - -./lib/libxbee.so.$(VERSION): ./lib/ ${addprefix ./obj/,${SRCS:.c=.o}} ./xbee.h - gcc -shared -Wl,-soname,libxbee.so.1 $(CLINKS) -o ./lib/libxbee.so.$(VERSION) ./obj/*.o - ln ./libxbee.so.$(VERSION) ./lib/libxbee.so.1 -sf - ln ./libxbee.so.$(VERSION) ./lib/libxbee.so -sf - -./lib/: - mkdir ./lib/ - -./obj/: - mkdir ./obj/ - -./obj/%.o: ./obj/ %.c %.h xbee.h - ${CC} ${CFLAGS} ${DEFINES} ${DEBUG} $*.c -o $@ - -./obj/%.o: ./obj/ %.c xbee.h - ${CC} ${CFLAGS} ${DEFINES} ${DEBUG} $*.c -o $@ - - -# pdfs - generate PDFs for each source file # -ifneq ($(strip $(wildcard /usr/bin/ps2pdf)),) -ifneq ($(strip $(wildcard /usr/bin/enscript)),) -pdfs: ./pdf/ ${addprefix ./pdf/,${addsuffix .pdf,${PDFS}}} - -./pdf/: - mkdir ./pdf/ - -./pdf/makefile.pdf: ./makefile - enscript ${ENSCRIPT} -Emakefile $< -p - | ps2pdf - $@ - -./pdf/%.pdf: % - enscript ${ENSCRIPT} -Ec $< -p - | ps2pdf - $@ - -./pdf/%.pdf: - @echo "*** Cannot make $@ - '$*' does not exist ***" -else -pdfs: - @echo "WARNING: enscript is not installed - cannot generate PDF files" -endif -else -pdfs: - @echo "WARNING: ps2pdf is not installed - cannot generate PDF files" -endif diff --git a/libs/thirdParty/libxbee/man/man3/libxbee.3 b/libs/thirdParty/libxbee/man/man3/libxbee.3 deleted file mode 100644 index 6bcb978f6..000000000 --- a/libs/thirdParty/libxbee/man/man3/libxbee.3 +++ /dev/null @@ -1,91 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH LIBXBEE 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -libxbee -.SH DESCRIPTION -libxbee is a C library to aid the use of Series 1 Digi XBee radios running in API mode (AP=2). -.sp -I have tried to keep flexibility to a maximum. -By allowing connections to individual nodes to be created - you don't have to address each packet, -or filter through incomming packets to get at the one you are after. This is all taken care of -for you by -.BR libxbee -! -.sp -libxbee is still in development, so if you find any bugs or have any enhancement requests, please -feel free to submit an issue on the project page: -.in +4n -.nf -http://code.google.com/p/libxbee/ -.fi -.in -or contact me (Attie) directly: -.in +4n -.nf -attie@attie.co.uk -.fi -.in -.SH "MAN PAGES" -Documentation is avaliable via the following man pages, or by example in the 'sample' folder in the SVN repository -.in +4n -.sp -.BR xbee_pkt "(3) - libxbee's packet structure" -.sp 0 -.BR xbee_con "(3) - libxbee's connection structure" -.sp -.BR xbee_setup "(3) - function to setup libxbee (and its variants)" -.sp 0 -.BR xbee_end "(3) - function to end the libxbee session and close any open handles" -.sp -.BR xbee_logit "(3) - function that allows the user to add to the xbee log output" -.sp -.BR xbee_newcon "(3) - function to create a new connection" -.sp 0 -.BR xbee_purgecon "(3) - function to purge packets from a connection" -.sp 0 -.BR xbee_endcon "(3) - function to end a connection" -.sp -.BR xbee_senddata "(3) - function to send data to a remote XBee (and its variants)" -.sp 0 -.BR xbee_getpacket "(3) - function to get a packet from a connection (and its variants)" -.sp -.BR xbee_hasdigital "(3) - function to check if digital sample is in the packet" -.sp 0 -.BR xbee_getdigital "(3) - function to get digital sample from the packet" -.sp -.BR xbee_hasanalog "(3) - function to check if analog sample is in the packet" -.sp 0 -.BR xbee_getanalog "(3) - function to get the analog sample from the packet" -.fi -.in -.SH "SEE ALSO" -.BR xbee_pkt (3), -.BR xbee_con (3), -.BR xbee_setup (3), -.BR xbee_end (3), -.BR xbee_logit (3), -.BR xbee_newcon (3), -.BR xbee_flushcon (3), -.BR xbee_endcon (3), -.BR xbee_senddata (3), -.BR xbee_getpacket (3), -.BR xbee_hasdigital (3), -.BR xbee_getdigital (3), -.BR xbee_hasanalog (3), -.BR xbee_getanalog (3) diff --git a/libs/thirdParty/libxbee/man/man3/xbee_con.3 b/libs/thirdParty/libxbee/man/man3/xbee_con.3 deleted file mode 100644 index 37e770504..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_con.3 +++ /dev/null @@ -1,22 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH LIBXBEE 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -libxbee -.sp -This page has not been written yet... diff --git a/libs/thirdParty/libxbee/man/man3/xbee_end.3 b/libs/thirdParty/libxbee/man/man3/xbee_end.3 deleted file mode 100644 index 5fd1de512..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_end.3 +++ /dev/null @@ -1,23 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH LIBXBEE 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -libxbee -.sp -This page has not been written yet... - diff --git a/libs/thirdParty/libxbee/man/man3/xbee_endcon.3 b/libs/thirdParty/libxbee/man/man3/xbee_endcon.3 deleted file mode 100644 index e64ccedb2..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_endcon.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_newcon.3 diff --git a/libs/thirdParty/libxbee/man/man3/xbee_flushcon.3 b/libs/thirdParty/libxbee/man/man3/xbee_flushcon.3 deleted file mode 100644 index e64ccedb2..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_flushcon.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_newcon.3 diff --git a/libs/thirdParty/libxbee/man/man3/xbee_getanalog.3 b/libs/thirdParty/libxbee/man/man3/xbee_getanalog.3 deleted file mode 100644 index f7bc1d0c7..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_getanalog.3 +++ /dev/null @@ -1,96 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH XBEE_GETPACKET 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -xbee_hasanalog, xbee_getanalog -.SH SYNOPSIS -.B #include -.sp -.BI "int xbee_hasanalog(xbee_pkt *" pkt ", int " sample ", int " input ");" -.sp -.BI "double xbee_getanalog(xbee_pkt *" pkt ", int " sample ", int " input ", double " Vref ");" -.ad b -.SH DESCRIPTION -The -.BR xbee_hasanalog () -function will check the packet for the presence of an analog sample on the specified input. -.sp -The -.BR xbee_getanalog () -function will read the packet and return the sample value for the specified analog input. -.sp -They both take 3 arguments, with the same purposes. -.sp -The argument -.I pkt -points to a packet that was previously retrieved with -.BR xbee_getpacket () -.sp -The argument -.I sample -selects the sample within the packet to use. -.sp -The argument -.I input -specifies which input you are interested in testing. -.sp -.BR xbee_getanalog () -also takes a fourth argument that allows you to provide a -.I Vref -value. This allows the function to convert the raw ADC value into a voltage for you. -.SH "RETURN VALUE" -The -.BR xbee_hasanalog () -function will return -.B 1 -if the provided packet has sample data for the specified input, otherwise -.BR 0 . -.sp -The -.BR xbee_getanalog () -function will return the raw ADC value (0 - 1023) if the provided packet has sample data for the specified input and Vref was given as zero. -If Vref was non-zero, then the return value will be the voltage read. -A -.B -1 -will be returned if the packet does not contain sample data. -.sp -.SH EXAMPLE -To read sample data from previously made connection: -.in +4n -.nf -#include -xbee_pkt *pkt; -double Vref = 3.3; -if ((pkt = xbee_getpacket(con)) != NULL) { - if (xbee_hasanalog(pkt,0,0)) { - printf("A0 read %fv\\n",xbee_getanalog(pkt,0,0,Vref)); - } else { - printf("No A0 data\\n"); - } - free(pkt); -} -.fi -.in -.SH AUTHOR -Attie Grande -.SH "SEE ALSO" -.BR libxbee (3), -.BR xbee_pkt (3), -.BR xbee_getpacket (3), -.BR xbee_hasdigital (3), -.BR xbee_getdigital (3) diff --git a/libs/thirdParty/libxbee/man/man3/xbee_getdigital.3 b/libs/thirdParty/libxbee/man/man3/xbee_getdigital.3 deleted file mode 100644 index 4a0af65b5..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_getdigital.3 +++ /dev/null @@ -1,91 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH XBEE_GETPACKET 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -xbee_hasdigital, xbee_getdigital -.SH SYNOPSIS -.B #include -.sp -.BI "int xbee_hasdigital(xbee_pkt *" pkt ", int " sample ", int " input ");" -.sp -.BI "int xbee_getdigital(xbee_pkt *" pkt ", int " sample ", int " input ");" -.ad b -.SH DESCRIPTION -The -.BR xbee_hasdigital () -function will check the packet for the presence of a given sample on the specified input. -.sp -The -.BR xbee_getdigital () -function will read the packet and return the sample value for the specified input. -.sp -They both take 3 arguments, with the same purposes. -.sp -The argument -.I pkt -points to a packet that was previously retrieved with -.BR xbee_getpacket () -.sp -The argument -.I sample -selects the sample within the packet to use. -.sp -The argument -.I input -specifies which input you are interested in testing. -.SH "RETURN VALUE" -The -.BR xbee_hasdigital () -function will return -.B 1 -if the provided packet has sample data for the specified input, otherwise -.BR 0 . -.sp -The -.BR xbee_getdigital () -function will return -.B 1 -if the provided packet has sample data for the specified input and the sample was HIGH. -A -.B 0 -will be returned if the sample was LOW, or the packet does not contain sample data. -.sp -.SH EXAMPLE -To read sample data from previously made connection: -.in +4n -.nf -#include -xbee_pkt *pkt; -if ((pkt = xbee_getpacket(con)) != NULL) { - if (xbee_hasdigital(pkt,0,0)) { - printf("D0 read %d\n",xbee_getdigital(pkt,0)); - } else { - printf("No D0 data\n"); - } - free(pkt); -} -.fi -.in -.SH AUTHOR -Attie Grande -.SH "SEE ALSO" -.BR libxbee (3), -.BR xbee_pkt (3), -.BR xbee_getpacket (3), -.BR xbee_hasanalog (3), -.BR xbee_getanalog (3) diff --git a/libs/thirdParty/libxbee/man/man3/xbee_getpacket.3 b/libs/thirdParty/libxbee/man/man3/xbee_getpacket.3 deleted file mode 100644 index a458e4960..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_getpacket.3 +++ /dev/null @@ -1,88 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH XBEE_GETPACKET 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -xbee_getpacket, xbee_getpacketwait -.SH SYNOPSIS -.B #include -.sp -.BI "xbee_pkt *xbee_getpacket(xbee_con *" con ");" -.sp -.BI "xbee_pkt *xbee_getpacketwait(xbee_con *" con ");" -.ad b -.SH DESCRIPTION -The -.BR xbee_getpacket () -function will return the next avaliable packet for the provided connection. -It takes 1 argument. -.sp -The argument -.I con -points to a connection made previously with -.BR xbee_newcon (). -.sp -The -.BR xbee_getpacketwait () -function behaves the same, but will wait for an internally specified time for a packet to arrive (currently around 1 second). -.SH "RETURN VALUE" -Upon successful return, this function returns the packet, having unlinked it from the internal list. -You must keep hold of the packet until you are finished with it, and then you must -.BR free () -it to prevent memory leaks. -.sp -If a packet was not avaliable for the provided connection, a -.B NULL -is returned. -.sp -If an error occured a -.B NULL -is also returned (though unlikely). -.sp -For more information on the structure of the packet, please see -.BR xbee_pkt (3) -.sp -For information on using callback functions with connections instead, please see -.BR xbee_con (3) -or -.B callback.c -in the SVN sample directory. -.SH EXAMPLE -To recieve a packet from a previously made connection: -.in +4n -.nf -#include -xbee_pkt *pkt; -if ((pkt = xbee_getpacket(con)) != NULL) { - /* process packet... */ - free(pkt); -} -.fi -.in -.SH AUTHOR -Attie Grande -.SH "SEE ALSO" -.BR libxbee (3), -.BR xbee_setup (3), -.BR xbee_newcon (3), -.BR xbee_senddata (3), -.BR xbee_pkt (3), -.BR xbee_con (3), -.BR xbee_hasDigital (3), -.BR xbee_getDigital (3), -.BR xbee_hasAnalog (3), -.BR xbee_getAnalog (3) diff --git a/libs/thirdParty/libxbee/man/man3/xbee_hasanalog.3 b/libs/thirdParty/libxbee/man/man3/xbee_hasanalog.3 deleted file mode 100644 index 402a3f266..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_hasanalog.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_getanalog.3 diff --git a/libs/thirdParty/libxbee/man/man3/xbee_hasdigital.3 b/libs/thirdParty/libxbee/man/man3/xbee_hasdigital.3 deleted file mode 100644 index 555711112..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_hasdigital.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_getdigital.3 diff --git a/libs/thirdParty/libxbee/man/man3/xbee_logit.3 b/libs/thirdParty/libxbee/man/man3/xbee_logit.3 deleted file mode 100644 index 5fd1de512..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_logit.3 +++ /dev/null @@ -1,23 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH LIBXBEE 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -libxbee -.sp -This page has not been written yet... - diff --git a/libs/thirdParty/libxbee/man/man3/xbee_newcon.3 b/libs/thirdParty/libxbee/man/man3/xbee_newcon.3 deleted file mode 100644 index 2ec511278..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_newcon.3 +++ /dev/null @@ -1,152 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH XBEE_NEWCON 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -xbee_newcon, xbee_purgecon, xbee_endcon -.SH SYNOPSIS -.B #include -.sp -.BI "xbee_con *xbee_newcon(unsigned char " frameID ", xbee_types " type ", ...);" -.sp -.BI "void xbee_purgecon(xbee_con *" con ");" -.sp -.BI "void xbee_endcon(xbee_con *" con ");" -.ad b -.SH DESCRIPTION -The -.BR xbee_newcon () -function will setup a new connection with the specified settings. -It takes at least 2 arguments, and potentially up to 4 depending on the -.I type. -.sp -.B NOTE: -Packets will only be collected when they match an active connection. -You must setup a connection in order to recieve packets. -.sp -The argument -.I frameID -allows similar functionality to that of TCP/IP port numbers. This is 1 -.I unsigned char -(or 8-bit integer) that identifies where the data is coming from or going to. -.s -The -.I type -specifies the type of connection you would like. The following types are avaliable: -.TP -.B xbee_localAT -communicates AT commands with the local XBee -.TP -.B xbee_txStatus -recieves transmit status information from the local XBee -.TP -.B xbee_modemStatus -recieves modem status information from the local XBee -.TP -.B xbee_16bitRemoteAT -communicates AT commands with a remote node (using 16-bit addressing) -.TP -.B xbee_64bitRemoteAT -communicates AT commands with a remote node (using 64-bit addressing) -.TP -.B xbee_16bitData -sends/recieves data through a remote node (using 16-bit addressing) -.TP -.B xbee_64bitData -sends/recieves data through a remote node (using 64-bit addressing) -.TP -.B xbee_16bitIO -sends/recieves I/O data through a remote node (using 16-bit addressing) -.TP -.B xbee_64bitIO -sends/recieves I/O data through a remote node (using 64-bit addressing) -.TP -.B xbee2_data -sends/recieves data using a Series 2 XBee (uses 64-bit addressing) -.TP -.B xbee2_txStatus -recieves transmit status information from the local Series 2 XBee -.PP -If you are using -.BR xbee_localAT ", " xbee_txStatus ", " xbee2_txStatus " or " xbee_modemStatus -then only the -.I frameID -and -.I type -arguments are required. -.sp -If you are using any 16-bit connection, you must also specify 1 right aligned integer, -containing the 16-bit address (e.g. 0x1234). -.sp -If you are using any 64-bit connection, you must also specify 2 integers containing the -64-bit address, first the high 32-bits, then the low 32-bits. -.sp -The -.BR xbee_purgecon () -function is very basic. It removes any packets that have been collected in the buffer for the specified connection. -.sp -The -.BR xbee_endcon () -function is used to end a connection. This will stop collecting packets for the given connection, and remove any packets from the buffer. -.SH "RETURN VALUE" -A pointer to the connection is returned. A connection can only be made once, using the same -.I type -, -.I frameID -and address (if needed). The second call using the same parameters will return the same -connection. -.sp -For information on using callback functions for packet handling please see -.BR xbee_con (3) -or -.B callback.c -in the SVN sample directory. -.SH EXAMPLE -To create a local AT connection: -.in +4n -.nf -#include -xbee_con *con; -con = xbee_newcon('A', xbee_localAT); -.fi -.in -.sp -To create a 16-bit Data connection: -.in +4n -.nf -#include -xbee_con *con; -con = xbee_newcon('A', xbee_16bitData, 0x1234); -.fi -.in -.sp -To create a 64-bit Data connection: -.in +4n -.nf -#include -xbee_con *con; -con = xbee_newcon('A', xbee_64bitData, 0x0013A200, 0x40081826); -.fi -.in -.SH AUTHOR -Attie Grande -.SH "SEE ALSO" -.BR libxbee (3), -.BR xbee_setup (3), -.BR xbee_getpacket (3), -.BR xbee_con (3), -.BR xbee_senddata (3) diff --git a/libs/thirdParty/libxbee/man/man3/xbee_nsenddata.3 b/libs/thirdParty/libxbee/man/man3/xbee_nsenddata.3 deleted file mode 100644 index b36885d85..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_nsenddata.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_senddata.3 diff --git a/libs/thirdParty/libxbee/man/man3/xbee_pkt.3 b/libs/thirdParty/libxbee/man/man3/xbee_pkt.3 deleted file mode 100644 index d5e269c13..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_pkt.3 +++ /dev/null @@ -1,79 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH XBEE_PKT 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -xbee_pkt -.SH SYNOPSIS -.B #include -.ad b -.SH DESCRIPTION -This is the packet structure. If you want to get more advanced information from connections (such as RSSI) then this is where it lives. -.sp -.in +4n -.nf -struct xbee_pkt { - unsigned char frameID; /* AT Status */ - unsigned char atCmd[2]; /* AT */ - unsigned char status; /* AT Data Status */ /* status / options */ - unsigned char Addr64[8]; /* AT Data */ - unsigned char Addr16[2]; /* AT Data */ - unsigned char data[128]; /* AT Data */ - unsigned char RSSI; /* Data */ - unsigned int datalen; - - /* X A5 A4 A3 A2 A1 A0 D8 D7 D6 D5 D4 D3 D2 D1 D0 */ - unsigned short IOmask; /* IO */ - - /* X X X X X X X D8 D7 D6 D5 D4 D3 D2 D1 D0 */ - unsigned short IOdata; /* IO */ - - /* X X X X X D D D D D D D D D D D */ - unsigned short IOanalog[6]; /* IO */ -}; -typedef struct xbee_pkt xbee_pkt; -.fi -.in -.sp -Most of these fields are fairly self explanatory, however some need attention brought to them -and others need explaining. I will touch on the most important here: -.TP -.B atCmd -This is the 2 character identifier for the AT command response you just recieved. -Of course if you didnt setup an AT connection, you should never see, or try to see data here. -.TP -.BR Addr64 " and " Addr16 -These contain the address of the XBee that you recieved the packet from. You should really know this -because you setup the connection. However remote AT packets will contain both 16 and 64 bit -addresses. -.TP -.B data -This is the data you just recieved. Either the AT reponse, or the data from the remote XBee node. -.TP -.B datalen -Would you be suprised if I told you this is how much data there is?... Dont try and -.BR printf () -the -.B data -as it isn't null terminated. Use this for processing instead. -.fi -.in -.SH AUTHOR -Attie Grande -.SH "SEE ALSO" -.BR libxbee (3), -.BR xbee_getpacket (3) diff --git a/libs/thirdParty/libxbee/man/man3/xbee_purgecon.3 b/libs/thirdParty/libxbee/man/man3/xbee_purgecon.3 deleted file mode 100644 index e64ccedb2..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_purgecon.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_newcon.3 diff --git a/libs/thirdParty/libxbee/man/man3/xbee_senddata.3 b/libs/thirdParty/libxbee/man/man3/xbee_senddata.3 deleted file mode 100644 index 10296bb8c..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_senddata.3 +++ /dev/null @@ -1,86 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH XBEE_SENDDATA 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -xbee_senddata, xbee_nsenddata, xbee_vsenddata -.SH SYNOPSIS -.B #include -.sp -.BI "int xbee_senddata(xbee_con *" con ", char *" format ", ...);" -.sp -.BI "int xbee_nsenddata(xbee_con *" con ", char *" data ", int " length ");" -.sp -.B #include -.sp -.BI "int xbee_vsenddata(xbee_con *" con ", char *" format ", va_list " ap "); -.ad b -.SH DESCRIPTION -The -.BR xbee_senddata () -function will send data via a provided connection. -It takes at least 2 arguments, and possibly more depending on the format string. -.sp -The argument -.I con -points to a connection made previously with -.BR xbee_newcon (). -.sp -The -.I format -string and any following parameters are passed to -.BR snprintf () -within these functions. -Please see the -.BR printf (3) -man page for more information. -.sp -If you are using -.BR xbee_nsenddata () -you must provide a character array of the data, and the data's length. -.sp -If you are using -.BR xbee_vsenddata () -you must provide a va_list. See -.BR stdarg (3). -.SH "RETURN VALUE" -Upon successful completion, these functions return 0. -.sp -If an invalid packet or connection was provided, -1 is returned. -.sp -If an unknown error occured, -2 is returned. -.sp -If -.I con -has -.I waitforACK -enabled, then these functions return 1 when an ACK was not recieved within 1 second. -.SH EXAMPLE -To send the string "Hello World!" through a previously made connection: -.in +4n -.nf -#include -xbee_senddata(con,"Hello World!"); -.fi -.in -.SH AUTHOR -Attie Grande -.SH "SEE ALSO" -.BR libxbee (3), -.BR xbee_setup (3), -.BR xbee_newcon (3), -.BR xbee_getpacket (3) diff --git a/libs/thirdParty/libxbee/man/man3/xbee_setup.3 b/libs/thirdParty/libxbee/man/man3/xbee_setup.3 deleted file mode 100644 index 2628c46f7..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_setup.3 +++ /dev/null @@ -1,108 +0,0 @@ -.\" libxbee - a C library to aid the use of Digi's Series 1 XBee modules -.\" running in API mode (AP=2). -.\" -.\" Copyright (C) 2009 Attie Grande (attie@attie.co.uk) -.\" -.\" This program 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. -.\" -.\" This program 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 this program. If not, see . -.TH XBEE_SETUP 3 2009-11-01 "GNU" "Linux Programmer's Manual" -.SH NAME -xbee_setup, xbee_setuplog, xbee_setupAPI, xbee_setuplogAPI -.SH SYNOPSIS -.B #include -.sp -.BI "int xbee_setup(char *" path ", int " baudrate ");" -.sp -.BI "int xbee_setuplog(char *" path ", int " baudrate ", int " logfd ");" -.sp -.BI "int xbee_setupAPI(char *" path ", int " baudrate ", char " cmdSeq ", int " cmdTime ");" -.sp -.BI "int xbee_setuplogAPI(char *" path ", int " baudrate ", int " logfd ", char " cmdSeq ", int " cmdTime ");" -.ad b -.SH DESCRIPTION -.sp -.B A VERSION OF THIS FUNCTION MUST BE CALLED BEFORE ANY OTHER libxbee FUNCTION! -The -.BR xbee_setup () -function will setup libxbee so that it can handle an XBee. -It takes 2 arguments. -.sp -The argument -.I path -is the path to the serial port that the XBee is connected to (e.g. /dev/ttyUSB0). -.sp -The -.I baudrate -is the baud rate that the local XBee is configured to run at. The following are avaliable: -.in +2n -.nf -.B 1200 -.B 2400 -.B 4800 -.B 9600 -.B 19200 -.B 38400 -.B 57600 -.BR 115200 " - this is potentially unstable (read the XBee manual to find out why...)" -.fi -.in -.sp -Using -.BR xbee_setuplog () -is exactly the same, but instead you give an open file descriptor. All log messages will be written to this file (you can use stderr or stdout if you want!). NOTE: The file descriptor is -.BR dup ()'ed -before use, so you may close it immediately. Providing a value of -.B 0 -will disable the log output. -.sp -Using -.BR xbee_setupAPI () -is exactly the same, but instead you provide the 'Command Sequence' character and the 'Guard Time' that your local XBee has been configured with. -libxbee will then place your XBee in API mode 2, and when you call -.BR xbee_end () -it will return your XBee to its previous API mode. -.sp -Using -.BR xbee_setuplogAPI () -is simply a combination of -.BR xbee_setuplog () -and -.BR xbee_setupAPI () -.SH "RETURN VALUE" -If any error occures, -.B -1 -is returned. Otherwise -.B 0 -is returned. -.SH EXAMPLE -To setup libxbee to use /dev/ttyUSB0 at 57600 baud: -.in +4n -.nf -#include -if (xbee_setup("/dev/ttyUSB0",57600) == -1) { - printf("Oh no...\n"); - exit(1); -} -.fi -.in -.SH NOTE -If libxbee is compiled with -.B DEBUG -defined, then the log output will ALWAYS be enabled. If no file descriptor is provided, then stderr will be used. -.SH AUTHOR -Attie Grande -.SH "SEE ALSO" -.BR libxbee (3), -.BR xbee_newcon (3), -.BR xbee_getpacket (3), -.BR xbee_senddata (3) diff --git a/libs/thirdParty/libxbee/man/man3/xbee_setupAPI.3 b/libs/thirdParty/libxbee/man/man3/xbee_setupAPI.3 deleted file mode 100644 index 56a5fcac5..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_setupAPI.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_setup.3 diff --git a/libs/thirdParty/libxbee/man/man3/xbee_setuplog.3 b/libs/thirdParty/libxbee/man/man3/xbee_setuplog.3 deleted file mode 100644 index 56a5fcac5..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_setuplog.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_setup.3 diff --git a/libs/thirdParty/libxbee/man/man3/xbee_setuplogAPI.3 b/libs/thirdParty/libxbee/man/man3/xbee_setuplogAPI.3 deleted file mode 100644 index 56a5fcac5..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_setuplogAPI.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_setup.3 diff --git a/libs/thirdParty/libxbee/man/man3/xbee_vsenddata.3 b/libs/thirdParty/libxbee/man/man3/xbee_vsenddata.3 deleted file mode 100644 index b36885d85..000000000 --- a/libs/thirdParty/libxbee/man/man3/xbee_vsenddata.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/xbee_senddata.3 diff --git a/libs/thirdParty/libxbee/notes/Notepad++ Style.xml b/libs/thirdParty/libxbee/notes/Notepad++ Style.xml deleted file mode 100644 index 5e56ab9ce..000000000 --- a/libs/thirdParty/libxbee/notes/Notepad++ Style.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - 000000 - - - - - _xbee_nsenddata(): xbee_send_pkt(): - xbee_listen(): - _xbee_logit(): - _xbee_getpacket(): - - - - - - - - - - - - - - - - - - - diff --git a/libs/thirdParty/libxbee/notes/v1-v2.txt b/libs/thirdParty/libxbee/notes/v1-v2.txt deleted file mode 100644 index cb2e1c923..000000000 --- a/libs/thirdParty/libxbee/notes/v1-v2.txt +++ /dev/null @@ -1,29 +0,0 @@ -XBee -0x8A* Modem Status -0x08* AT Command -0x09* AT Command (Queue) -0x88* AT Command Response -0x17* Remote AT Command Request -0x97* Remote AT Command Response -0x00* Tx Request (64-bit) -0x01* Tx Request (16-bit) -0x89* Tx Status -0x80* Rx Data (64-bit) -0x81* Rx Data (16-bit) - -XBee 2.5 -0x8A* Modem Status -0x08* AT Command -0x09* AT Command (Queue) -0x88* AT Command Response -0x17* Remote AT Command Request -0x97* Remote AT Command Response -0x10* ZigBee Transmit Request -0x11 Explicit Addressing ZigBee Command Frame -0x8B* ZigBee Transmit Status -0x90* ZigBee Recieve Packet -0x91 ZigBee Explicit Rx -0x92 ZigBee IO Data Sample Rx -0x94 Xbee Sensor Read -0x95 Node Identification - diff --git a/libs/thirdParty/libxbee/pdf/api.c.pdf b/libs/thirdParty/libxbee/pdf/api.c.pdf deleted file mode 100644 index dc8c75af3cb7130fa8716de8a733fd3a3fe13ba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75665 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�s>|Zu(JPU5 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 JRkTr{{{nlBI;Q{t diff --git a/libs/thirdParty/libxbee/pdf/main.c.pdf b/libs/thirdParty/libxbee/pdf/main.c.pdf deleted file mode 100644 index 4410e6b8e4d9f3a95779694316ce6943da6202e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8923 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.c ../obj/api.o -o -lpthread -lrt diff --git a/libs/thirdParty/libxbee/sample/analog.c b/libs/thirdParty/libxbee/sample/analog.c deleted file mode 100644 index 84069e39a..000000000 --- a/libs/thirdParty/libxbee/sample/analog.c +++ /dev/null @@ -1,71 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will output the voltage read from analog 0 */ - -#include -#include -#include - -/* set this to the voltage measured between GND and Vref - 3.3 is a good place to start */ -#define Vref 3.3 - -int main(int argc, char *argv[]) { - xbee_con *con; - xbee_pkt *pkt; - int i; - - /* setup libxbee */ - if (xbee_setup("/dev/ttyUSB0",57600) == -1) { - return 1; - } - - /* get a connection to the remote XBee */ - con = xbee_newcon('I',xbee_64bitIO, 0x13A200, 0x403CB26A); - /* do this forever! */ - while (1) { - /* get as many packets as we can */ - while ((pkt = xbee_getpacket(con)) != NULL) { - for (i = 0; i < pkt->samples; i++) { - /* did we get a value for A0? */ - if (!xbee_hasanalog(pkt,i,0)) { - /* there was no data for A0 in the packet */ - printf("A0: -- No Data --\n"); - continue; - } - /* print out the reading in raw, and adjusted */ - printf("A0: %.0f (~%.2fv)\n", - xbee_getanalog(pkt,i,0,0), - xbee_getanalog(pkt,i,0,Vref)); - fflush(stdout); - } - /* release the packet */ - free(pkt); - } - usleep(100); - } - - return 0; -} diff --git a/libs/thirdParty/libxbee/sample/api.c b/libs/thirdParty/libxbee/sample/api.c deleted file mode 100644 index cff70bf1a..000000000 --- a/libs/thirdParty/libxbee/sample/api.c +++ /dev/null @@ -1,42 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -g -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will show you how to seup the xbee and ensure that it is in API mode */ - -#include -#include -#include - -int main(int argc, char *argv[]) { - /* the extra arguments are the CC ('+' by default) and GT (1000) by default AT values */ - xbee_setuplogAPI("/dev/ttyUSB0",57600,2,'+',1000); - - /* now we can do our stuff! */ - sleep(10); - - /* calling xbee_end() will return the xbee to its previous API mode */ - xbee_end(); - return 0; -} diff --git a/libs/thirdParty/libxbee/sample/atis.c b/libs/thirdParty/libxbee/sample/atis.c deleted file mode 100644 index 66946f184..000000000 --- a/libs/thirdParty/libxbee/sample/atis.c +++ /dev/null @@ -1,81 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will output the voltage read from analog 0 */ - -#include -#include -#include - -/* set this to the voltage measured between GND and Vref - 3.3 is a good place to start */ -#define Vref 3.3 - -int main(int argc, char *argv[]) { - xbee_con *con; - xbee_pkt *pkt; - - /* setup libxbee */ - if (xbee_setup("/dev/ttyUSB0",57600) == -1) { - printf("xbee_setup failed...\n"); - return 1; - } - - /* create an AT connection */ - con = xbee_newcon('I',xbee_64bitRemoteAT,0x13A200,0x403CB26A); - - /* do this forever! */ - for (;;) { - /* request samples now! */ - xbee_senddata(con,"IS"); - /* get as many packets as we can */ - while ((pkt = xbee_getpacketwait(con)) != NULL) { - if (pkt) { - if (pkt->status != 0x00) { - /* if the return status was not 0x00 (OK) then the request failed... */ - printf("Sample A0: -- Request Failed --\n"); - } else { - if (!xbee_hasanalog(pkt,0,0)) { - /* there was no data for A0 in the packet */ - printf("Sample A0: -- No Data --\n"); - } else { - /* it appears that there is sample data for A0! */ - printf("Sample A0: %.0f (~%.2fv)\n", - xbee_getanalog(pkt,0,0,0), - xbee_getanalog(pkt,0,0,Vref)); - } - } - /* dont forget to free the packet! */ - free(pkt); - } else { - /* couldnt get a packet */ - printf("Sample A0: -- No Packet Returned --\n"); - } - } - /* wait a second for the next sample */ - sleep(1); - } - - return 0; -} diff --git a/libs/thirdParty/libxbee/sample/atsetup.c b/libs/thirdParty/libxbee/sample/atsetup.c deleted file mode 100644 index 13afbe416..000000000 --- a/libs/thirdParty/libxbee/sample/atsetup.c +++ /dev/null @@ -1,157 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will setup certain AT parameters of the local XBee unit */ - -#include -#include -#include -#include - -/* con = connection to use - cmd = 2 character command string, eg NI - parameter = NULL - no parameter - !NULL - command parameter, either NULL terminated string, or block of memory - length = 0 - use parameter as NULL terminated string - !0 - use 'length' bytes from parameter - ret = NULL - don't return anything - !NULL - pointer to pointer. doAT will allocate memory, you must free it! - str = return data pointer - - returns the length of the data in ret, or -ve for error */ -int doAT(xbee_con *con, char *cmd, char *parameter, int length, unsigned char **ret) { - xbee_pkt *pkt; - if (con->type != xbee_localAT && con->type != xbee_16bitRemoteAT && con->type != xbee_64bitRemoteAT) { - printf("Thats not an AT connection!...\n"); - return -1; - } - if (strlen(cmd) != 2) { - printf("Invalid command: \"%s\"\n",cmd); - return -2; - } - if (parameter == NULL) { - xbee_senddata(con,"%s",cmd); - } else if (length != 0) { - char *tmp; - if ((tmp = malloc(1024)) == NULL) { - printf("Failed to get memory!\n"); - return -3; - } - snprintf(tmp,1024,"%s",cmd); - memcpy(&(tmp[2]),parameter,(length>1022)?1022:length); - xbee_nsenddata(con,tmp,length+2); - free(tmp); - } else { - xbee_senddata(con,"%s%s",cmd,parameter); - } - pkt = xbee_getpacketwait(con); - if (pkt == NULL) { - printf("Failed to set %s!\n",cmd); - return -4; - } - if (pkt->status != 0) { - printf("An error occured while setting %s!\n",cmd); - return -5; - } - if (ret && pkt->datalen > 0) { - *ret = realloc(*ret,sizeof(char) * (pkt->datalen + 1)); - memcpy(*ret,pkt->data,pkt->datalen); - (*ret)[pkt->datalen] = '\0'; - free(pkt); - return pkt->datalen; - } - free(pkt); - return 0; -} - -int main(int argc, char *argv[]) { - xbee_con *con; - int ret,i; - unsigned char *str = NULL; - - if (argc != 2) { - printf("Usage: %s \n",argv[0]); - return 1; - } - - /* setup libxbee */ - if (xbee_setup("/dev/ttyUSB0",57600) == -1) { - printf("xbee_setup failed...\n"); - return 1; - } - - /* create an AT connection */ - con = xbee_newcon('I',xbee_localAT); - /*con = xbee_newcon('I',xbee_64bitRemoteAT,0x13A200,0x403CB26A);*/ - - - /* get the node's address! */ - if ((ret = doAT(con,"SH",NULL,0,&str)) < 0) return 1; - if (ret == 4) { - printf("SH: 0x%02X%02X%02X%02X\n", str[0], str[1], str[2], str[3]); - } - if ((ret = doAT(con,"SL",NULL,0,&str)) < 0) return 1; - if (ret == 4) { - printf("SL: 0x%02X%02X%02X%02X\n", str[0], str[1], str[2], str[3]); - } - - /* set the power level - 2 methods, i prefer the first but it generates compile warnings :( */ - /*if ((ret = doAT(con,"PL",&((unsigned char[]){4}),1,&str)) < 0) return 1;*/ - /*{ - char t[] = {0}; - if ((ret = doAT(con,"PL",t,1,&str)) < 0) return 1; - }*/ - - /* get the power level */ - if ((ret = doAT(con,"PL",NULL,0,&str)) < 0) return 1; - if (ret == 1) { - printf("PL: 0x%02X\n", str[0]); - } - - /* get NI */ - if ((ret = doAT(con,"NI",NULL,0,&str)) < 0) return 1; - if (ret > 0) { - printf("NI: "); - for (i = 0; i < ret; i++) { - printf("%c",(str[i]>=32 && str[i]<=126)?str[i]:'.'); - } - printf("\n"); - } - - printf("Setting NI to '%s': ",(argc!=2)?"MyNode":argv[1]); - if ((ret = doAT(con,"NI",(argc!=2)?"MyNode":argv[1],0,NULL)) < 0) return 1; - printf("OK\n"); - - if ((ret = doAT(con,"NI",NULL,0,&str)) < 0) return 1; - if (ret > 0) { - printf("NI: "); - for (i = 0; i < ret; i++) { - printf("%c",(str[i]>=32 && str[i]<=126)?str[i]:'.'); - } - printf("\n"); - } - - return 0; -} diff --git a/libs/thirdParty/libxbee/sample/callback.c b/libs/thirdParty/libxbee/sample/callback.c deleted file mode 100644 index 9e48276b0..000000000 --- a/libs/thirdParty/libxbee/sample/callback.c +++ /dev/null @@ -1,88 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will return any recieved data, using a callback function */ - -#include -#include -#include -#include - -void sighandler(int sig) { - xbee_pkt *pkt; - if (sig == SIGINT) { - xbee_end(); - exit(0); - } -} - -void callback(xbee_con *con, xbee_pkt *pkt) { - int ret; - /* print the recieved data */ - printf("Rx: %s\n",pkt->data); - /* say thank you */ - if ((ret = xbee_senddata(con,"%s",pkt->data)) != 0) { - printf("xbee_senddata: Error %d... Retrying!\n",ret); - if ((ret = xbee_senddata(con,"%s",pkt->data)) != 0) { - printf("xbee_senddata: Error %d... Data lost!\n",ret); - } else { - printf("xbee_senddata: Success after retry!\n",ret); - } - } -free(pkt); -} - -int main(int argc, char *argv[]) { - xbee_con *con; - xbee_pkt *pkt, *rpkt; - - /* setup the xbee */ - //if (xbee_setupAPI("/dev/ttyUSB0",57600,'+',250) == -1) { - //if (xbee_setuplogAPI("/dev/ttyUSB0",57600,2,'+',250) == -1) { - if (xbee_setuplog("/dev/ttyUSB0",57600,2) == -1) { - /* oh no... it failed */ - printf("xbee_setup() failed...\n"); - exit(1); - } - - /* handle ^C */ - signal(SIGINT, sighandler); - - /* setup a connection */ - con = xbee_newcon('I',xbee_64bitData, 0x0013A200, 0x40081826); - con->waitforACK = 1; - con->callback = callback; - - printf("Waiting...\n"); - - /* do nothing forever! */ - for (;;) { - sleep(86400); /* 24hrs */ - } - - /* shouldn't ever get here but... */ - return 0; -} - diff --git a/libs/thirdParty/libxbee/sample/digital.c b/libs/thirdParty/libxbee/sample/digital.c deleted file mode 100644 index 4b0c9f633..000000000 --- a/libs/thirdParty/libxbee/sample/digital.c +++ /dev/null @@ -1,146 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -g -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will control digital output pins of a chosen node */ - -#include -#include -#include -#include - -int mode; -char bitmask; -char outputs; - -void sighandler(int sig) { - if (sig == SIGINT) { - xbee_end(); - exit(0); - } -} - -void doneCB(xbee_con *con, xbee_pkt *pkt) { - /* this packet should be confirmation... */ - xbee_end(); - exit(0); -} -void doCB(xbee_con *con, xbee_pkt *pkt) { - int i,m; - outputs = pkt->IOdata[0].IOdigital; - printf("\n 7 6 5 4 3 2 1 0\n"); - printf("Current output state: "); - for (i = 0; i < 8; i++) { - if (xbee_hasdigital(pkt,0,7-i)) { - if (xbee_getdigital(pkt,0,7-i)) { - printf(" 1"); - } else { - printf(" 0"); - } - } else { - printf(" x"); - } - } - printf("\n"); - switch (mode) { - case 0: outputs |= bitmask; break; - case 1: outputs &= ~bitmask; break; - case 2: default: - xbee_end(); - exit(0); - } - m = outputs; - printf("New output state: "); - for (i = 0; i < 8; i++) { - if (xbee_hasdigital(pkt,0,7-i)) { - if (m & 0x80) { - printf(" 1"); - } else { - printf(" 0"); - } - } else { - printf(" x"); - } - m <<= 1; - } - printf("\n\n"); - con->callback = doneCB; - xbee_senddata(con,"IO%c",outputs); -} - -void usage(char *argv0) { - printf("Usage: %s \n",argv0); - printf("Usage: %s [port[0-7]]...\n",argv0); - exit(1); -} -int main(int argc, char *argv[]) { - xbee_con *con; - - if (argc < 2) usage(argv[0]); - - if (!strcasecmp(argv[1],"on")) { - mode = 0; - } else if (!strcasecmp(argv[1],"off")) { - mode = 1; - } else if (!strcasecmp(argv[1],"query")) { - mode = 2; - } else usage(argv[0]); - - if (mode != 2) { - int i; - char *c; - bitmask = 0; - c = argv[2]; - while (*c != '\0') { - *c -= '0'; - if ((*c >= 0) && (*c <= 7)) { - bitmask |= 0x01 << *c; - } else { - usage(argv[0]); - } - c++; - } - } - - /* setup libxbee */ - if (xbee_setupAPI("/dev/ttyUSB0",57600,'+',250) == -1) { - return 1; - } - - /* handle ^C */ - signal(SIGINT, sighandler); - - /* get a connection to the remote XBee */ - con = xbee_newcon('I',xbee_64bitRemoteAT, 0x0013A200, 0x403CB26B); - con->waitforACK = 1; - con->callback = doCB; - - xbee_senddata(con,"IS"); - - /* timeout after 1 second... */ - sleep(1); - - xbee_end(); - return 0; -} diff --git a/libs/thirdParty/libxbee/sample/digitalout.c b/libs/thirdParty/libxbee/sample/digitalout.c deleted file mode 100644 index 46db084f1..000000000 --- a/libs/thirdParty/libxbee/sample/digitalout.c +++ /dev/null @@ -1,128 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will control the digital 0 output from the keyboard. Type: - 0, - off - 1, - on - q, - quit */ - -#include -#include -#include - -#include - -int main(int argc,char *argv[]) { - xbee_con *con; - xbee_pkt *pkt; - - printf("Hello\n"); - - if (xbee_setup("/dev/ttyUSB0",57600) == -1) { - printf("failed to setup xbee\n"); - return 1; - } - - con = xbee_newcon('R',xbee_64bitRemoteAT,0x0013a200,0x403af247); - if (!con) { - printf("no connection returned\n"); - return 1; - } - - for (;;) { - - xbee_senddata(con,"D0"); - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("no packet returned from state probe\n"); - return 1; - } - - if (pkt->status != 0) { - printf("state probe failed (ret=0x%02X - ",pkt->status); - switch (pkt->status) { - case 0x1: printf("Error"); break; - case 0x2: printf("Invalid Command"); break; - case 0x3: printf("Invalid Parameter"); break; - case 0x4: printf("No Response"); break; - default: printf("Unknown"); break; - } - printf(")\n"); - return 1; - } - - if (pkt->datalen != 1) { - printf("unexpected datalen from state probe\n"); - return 1; - } - - if (pkt->data[0] == 0x05) { - printf("this port is currently ON\n"); - } else if (pkt->data[0] == 0x04) { - printf("this port is currently OFF\n"); - } else { - printf("this port is currently in an unknown state\n"); - return 1; - } - free(pkt); - pkt = NULL; - - recharprompt: - printf("--> "); - rechar: - switch(getchar()) { - case 'q': case 'Q': - printf("byebye\n"); - return 0; - case '0': - printf("turning off...\n"); - xbee_senddata(con,"D0%c",0x04); - break; - case '1': - printf("turning on...\n"); - xbee_senddata(con,"D0%c",0x05); - break; - case '\n': goto rechar; - default: goto recharprompt; - } - - if ((pkt = xbee_getpacketwait(con)) != NULL) { - if (pkt->status != 0) { - printf("state set failed (ret=0x%02X - ",pkt->status); - switch (pkt->status) { - case 0x1: printf("Error"); break; - case 0x2: printf("Invalid Command"); break; - case 0x3: printf("Invalid Parameter"); break; - case 0x4: printf("No Response"); break; - default: printf("Unknown"); break; - } - printf(")\n"); - return 1; - } - } - - } - - return 0; -} diff --git a/libs/thirdParty/libxbee/sample/multi.c b/libs/thirdParty/libxbee/sample/multi.c deleted file mode 100644 index 107f88f6e..000000000 --- a/libs/thirdParty/libxbee/sample/multi.c +++ /dev/null @@ -1,100 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -g -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will make use of multiple instances of libxbee and send messages between the attached XBees */ - -#include -#include -#include -#include - -int mode; -char bitmask; -char outputs; - -xbee_hnd xbee1; -xbee_hnd xbee2; - -void sighandler(int sig) { - if (sig == SIGINT) { - _xbee_end(xbee1); - _xbee_end(xbee2); - exit(0); - } -} - -void xbee1CB(xbee_con *con, xbee_pkt *pkt) { - char data[128]; - snprintf(data,pkt->datalen+1,"%s",pkt->data); - printf("XBee1: Rx[%3d]: %s\n",pkt->datalen,data); -} - -void xbee2CB(xbee_con *con, xbee_pkt *pkt) { - char data[128]; - snprintf(data,pkt->datalen+1,"%s",pkt->data); - printf("XBee2: Rx[%3d]: %s\n",pkt->datalen,data); -} - -int main(int argc, char *argv[]) { - xbee_con *con1; - xbee_con *con2; - - if (!(xbee1 = _xbee_setuplogAPI("/dev/ttyUSB0",57600,3,'+',250))) { - //if (!(xbee1 = _xbee_setupAPI("/dev/ttyUSB0",57600,'+',250))) { - printf("xbee1: setup error...\n"); - return 1; - } - if (!(xbee2 = _xbee_setuplogAPI("/dev/ttyUSB1",57600,4,'+',250))) { - //if (!(xbee2 = _xbee_setupAPI("/dev/ttyUSB1",57600,'+',250))) { - printf("xbee2: setup error...\n"); - return 1; - } - - /* handle ^C */ - signal(SIGINT, sighandler); - - con1 = _xbee_newcon(xbee1,'1',xbee_64bitData, 0x0013A200, 0x40081826); - con1->waitforACK = 1; - con1->callback = xbee1CB; - - con2 = _xbee_newcon(xbee2,'2',xbee_64bitData, 0x0013A200, 0x404B75DE); - con2->waitforACK = 1; - con2->callback = xbee2CB; - - while (1) { - printf("xbee1: Tx\n"); - _xbee_logit(xbee1,"xbee1: Tx"); - _xbee_logit(xbee2,"xbee1: Tx"); - _xbee_senddata(xbee1,con1,"Hello"); - usleep(1000000); - printf("xbee2: Tx\n"); - _xbee_logit(xbee1,"xbee2: Tx"); - _xbee_logit(xbee2,"xbee2: Tx"); - _xbee_senddata(xbee2,con2,"Hi There!"); - usleep(1000000); - } - - return 0; -} diff --git a/libs/thirdParty/libxbee/sample/scan.c b/libs/thirdParty/libxbee/sample/scan.c deleted file mode 100644 index 4546887f9..000000000 --- a/libs/thirdParty/libxbee/sample/scan.c +++ /dev/null @@ -1,144 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will scan the currently configured channel for all nodes, - returning the values of a few useful settings */ - -#include -#include -#include -#include -#include -#include - -#define MAXNODES 100 - -int main(int argc, char *argv[]) { - int i; - int saidfull = 0; - int ATNT = 0x19; /* node discover timeout */ - int ATNTc; /* counter */ - - int nodes = 0; - char addrs[MAXNODES][8]; - - xbee_con *con; - xbee_pkt *pkt, *rpkt; - - time_t ttime; - char stime[32]; - - /* setup libxbee */ - if (xbee_setup("/dev/ttyUSB0",57600) == -1) { - return 1; - } - - /* grab a local AT connection */ - con = xbee_newcon('I',xbee_localAT); - - /* get the ND timeout */ - xbee_senddata(con,"NT"); - if ((rpkt = xbee_getpacketwait(con)) == NULL) { - printf("XBee didnt return a result for NT\n"); - return 1; - } - ATNT = rpkt->data[0]; - free(rpkt); - - while (1) { - /* send a ND - Node Discover request */ - xbee_senddata(con,"ND"); - /* only wait for a bit longer than the ND timeout */ - ATNTc = ATNT + 10; - /* loop until the end packet has been received or timeout reached */ - while (ATNTc--) { - /* get a packet */ - pkt = xbee_getpacketwait(con); - /* check a packet was returned, and that its one we are after... */ - if (pkt && !memcmp(pkt->atCmd,"ND",2)) { - /* is this the end packet? you can tell from the 0 datalen */ - if (pkt->datalen == 0) { - /* free the packet */ - free(pkt); - break; - } else { - /* check if we know this node already */ - for (i = 0; i < nodes; i++) { - /* the 64bit address will match one in the list */ - if (!memcmp(&(pkt->data[2]),&(addrs[i]),8)) break; - } - ttime = time(NULL); - strftime(stime,32,"%I:%M:%S %p",gmtime(&ttime)); - /* is there space for another? */ - if ((i == nodes) && - (nodes == MAXNODES) && - (!saidfull)) { - printf("MAXNODES reached... Can't add more...\r"); - /* flush so the change is seen! */ - fflush(stdout); - saidfull = 1; - } else { - /* is this a rewrite? */ - if (i != nodes) { - /* find the line to edit */ - printf("%c[%dA",27,nodes-i); - /* clear the line */ - printf("%c[2K",27); - } - /* write out the info */ - memcpy(&(addrs[nodes]),&(pkt->data[2]),8); - printf("MY: 0x%02X%02X ",pkt->data[0],pkt->data[1]); - printf("SH: 0x%02X%02X%02X%02X ",pkt->data[2],pkt->data[3],pkt->data[4],pkt->data[5]); - printf("SL: 0x%02X%02X%02X%02X ",pkt->data[6],pkt->data[7],pkt->data[8],pkt->data[9]); - printf("dB: -%2d ",pkt->data[10]); - printf("NI: %-20s ",&(pkt->data[11])); - printf("@: %s",stime); - /* is this a rewrite? */ - if (i != nodes) { - /* go back the the bottom */ - printf("%c[%dB\r",27,nodes-i); - } else { - /* new line is only wanted for new nodes */ - printf("\n"); - /* if not, then add 1 to the number of nodes! */ - nodes++; - } - } - /* flush so the change is seen! */ - fflush(stdout); - } - /* free the packet */ - free(pkt); - } - /* sleep for 100ms (same as NT steps) */ - usleep(100000); - } - /* try again! */ - usleep(100000); - } - - return 0; -} - diff --git a/libs/thirdParty/libxbee/sample/scan_adv.c b/libs/thirdParty/libxbee/sample/scan_adv.c deleted file mode 100644 index d3360222c..000000000 --- a/libs/thirdParty/libxbee/sample/scan_adv.c +++ /dev/null @@ -1,589 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will scan all possible channels for remote nodes and return - the value of a few useful settings */ - -#include -#include -#include -#include -#include -#include -#include - -#define MAXNODES 100 - -int ATCH = 0x0C; /* origional channel number */ -int ATNT = 0x19; /* node discover timeout */ -int ATNTc; /* node discover timeout counter */ -int BREAK = 0; -xbee_con *con; - -void sighandler(int sig) { - xbee_pkt *pkt; - if (sig == SIGINT) { - BREAK = 1; - /* wait for the rest of the timeout... */ - printf("\r%c[2KWaiting for node discover command to timeout...",27); - fflush(stdout); - for (; ATNTc; ATNTc--) { - usleep(100000); - } - /* Restore the XBee's channel setting */ - printf("\r%c[2KRestoring channel to 0x%02X...",27,ATCH); - fflush(stdout); - if (xbee_senddata(con,"CH%c",ATCH)) { - printf("xbee_senddata: Error\n"); - exit(1); - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\r%c[2K*** XBee didnt return a result for CH... ***\nPlease manually reset your channel to 0x%02X\n",27,ATCH); - } - if (pkt->status) { - printf("\r%c[2K*** An error occured while restoring the channel setting... ***\nPlease manually reset your channel to 0x%02X\n",27,ATCH); - } else { - printf("\nDone!\n"); - } - free(pkt); - /* Restore the terminal */ - printf("%c[?25h%c[0m",27,27); - fflush(stdout); - exit(0); - } -} - -int main(int argc, char *argv[]) { - int i; - int saidfull = 0; - int ATCHc; /* current channel number */ - int XBeePro = 0; /* XBee pro? */ - - int nodes = 0; - unsigned char addrs[MAXNODES][19]; /* 0-7 : 64 bit address - 8 : channel - 9-10 : id - 11 : baud - 12 : API - 13-14: HV - 15-16: VR - 17 : CC - 18 : mask - not address */ - - xbee_pkt *pkt, *rpkt; - - time_t ttime; - char stime[32]; - - /* handle ^C */ - signal(SIGINT, sighandler); - - /* setup libxbee */ - if (xbee_setupAPI("/dev/ttyUSB0",57600,'+',250) == -1) { - return 1; - } - - /* grab a local AT connection */ - con = xbee_newcon('I',xbee_localAT); - - /* get the current channel */ - if (xbee_senddata(con,"CH")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("XBee didnt return a result for CH\n"); - return 1; - } - ATCH = pkt->data[0]; - free(pkt); - - /* XBee - 0x0B - 0x1A - XBee Pro - 0x0C - 0x17 */ - if (xbee_senddata(con,"CH%c",0x0B)) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("XBee didnt return a result for CH\n"); - return 1; - } - /* did that fail? */ - if (pkt->status == 0) { - /* nope.. its not a pro */ - printf("Using XBee (not Pro) channels (0x0B - 0x1A)...\n"); - XBeePro = 0; - ATCHc = 0x0B; - } else { - /* yup... its a pro */ - printf("Using XBee Pro channels (0x0C - 0x17)...\n"); - XBeePro = 1; - ATCHc = 0x0C; - } - free(pkt); - - /* find and print data for the local node */ - printf("\n%c[31mCH:%c[32m 0x%02X ",27,27,ATCH); - if (xbee_senddata(con,"ID")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for ID\n"); - return 1; - } - printf("%c[31mID:%c[32m 0x%02X%02X ",27,27,pkt->data[0],pkt->data[1]); - free(pkt); - /* ### */ - if (xbee_senddata(con,"MY")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for MY\n"); - return 1; - } - printf("%c[31mMY:%c[32m 0x%02X%02X ",27,27,pkt->data[0],pkt->data[1]); - free(pkt); - /* ### */ - if (xbee_senddata(con,"SH")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for SH\n"); - return 1; - } - printf("%c[31mSH:%c[32m 0x%02X%02X%02X%02X ",27,27,pkt->data[0],pkt->data[1],pkt->data[2],pkt->data[3]); - free(pkt); - /* ### */ - if (xbee_senddata(con,"SL")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for SL\n"); - return 1; - } - printf("%c[31mSL:%c[32m 0x%02X%02X%02X%02X ",27,27,pkt->data[0],pkt->data[1],pkt->data[2],pkt->data[3]); - free(pkt); - /* ### */ - if (xbee_senddata(con,"BD")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for BD\n"); - return 1; - } - printf("%c[31mBD:%c[32m ",27,27); - /* print the baud rate */ - switch (pkt->data[3]) { - case 0: printf(" 1200"); break; - case 1: printf(" 2400"); break; - case 2: printf(" 4800"); break; - case 3: printf(" 9600"); break; - case 4: printf(" 19200"); break; - case 5: printf(" 38400"); break; - case 6: printf(" 57600"); break; - case 7: printf("115200"); break; - default: printf(" other"); break; - } - printf(" "); - free(pkt); - /* ### */ - if (xbee_senddata(con,"AP")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for AP\n"); - return 1; - } - printf("%c[31mAP:%c[32m 0x%02X ",27,27,pkt->data[0]); - free(pkt); - /* ### */ - if (xbee_senddata(con,"HV")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for HV\n"); - return 1; - } - printf("%c[31mHV:%c[32m 0x%02X%02X ",27,27,pkt->data[0],pkt->data[1]); - free(pkt); - /* ### */ - if (xbee_senddata(con,"VR")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for VR\n"); - return 1; - } - printf("%c[31mVR:%c[32m 0x%02X%02X ",27,27,pkt->data[0],pkt->data[1]); - free(pkt); - /* ### */ - if (xbee_senddata(con,"CC")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for CC\n"); - return 1; - } - printf("%c[31mCC:%c[32m '%c' (0x%02X) ",27,27,pkt->data[0],pkt->data[0]); - free(pkt); - /* ### */ - if (xbee_senddata(con,"NI")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("\nXBee didnt return a result for NI\n"); - return 1; - } - printf("%c[31mNI:%c[32m %-20s ",27,27,pkt->data); - free(pkt); - /* ### */ - printf("%c[95m* This is the lobal XBee *",27); - - printf("%c[34m\n---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------%c[0m\n\n",27,27); - - /* get the ND timeout */ - if (xbee_senddata(con,"NT")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if ((pkt = xbee_getpacketwait(con)) == NULL) { - printf("XBee didnt return a result for NT\n"); - return 1; - } - ATNT = pkt->data[0]; - free(pkt); - - printf("%c[?25l",27); - fflush(stdout); - - usleep(100000); - - while (!BREAK) { - /* set the channel to scan */ - if (xbee_senddata(con,"CH%c",ATCHc)) { - printf("xbee_senddata: Error\n"); - return 1; - } - pkt = xbee_getpacketwait(con); - if (!pkt || pkt->status) { - printf("\nXBee didnt return a result for CH\n"); - return 1; - } - free(pkt); - printf("%c[2KScanning channel 0x%02X...\r",27,ATCHc); - fflush(stdout); - /* send a ND - Node Discover request */ - if (!xbee_senddata(con,"ND")) { - /* only wait for a bit longer than the ND timeout */ - ATNTc = ATNT + 10; - /* loop until the end packet has been received or timeout reached */ - while (!BREAK && ATNTc--) { - /* get a packet */ - pkt = xbee_getpacket(con); - /* check a packet was returned, and that its one we are after... */ - if (pkt && !memcmp(pkt->atCmd,"ND",2)) { - /* is this the end packet? you can tell from the 0 datalen */ - if (pkt->datalen == 0) { - /* free the packet */ - free(pkt); - break; - } else { - /* check if we know this node already */ - for (i = 0; i < nodes; i++) { - /* the 64bit address will match one in the list */ - if (!memcmp(&(pkt->data[2]),&(addrs[i][0]),8)) break; - } - ttime = time(NULL); - strftime(stime,32,"%I:%M:%S %p",gmtime(&ttime)); - /* is there space for another? */ - if ((i == nodes) && - (nodes == MAXNODES) && - (!saidfull)) { - printf("%c[2KMAXNODES reached... Can't add more...\r",27); - /* flush so the change is seen! */ - fflush(stdout); - saidfull = 1; - } else { - /* is this a rewrite? */ - if (i != nodes) { - /* find the line to edit */ - printf("%c[%dA",27,nodes-i+1); - /* clear the line */ - printf("%c[2K",27); - } else { - /* fill the blank line */ - printf("%c[%dA",27,1); - } - /* save the channel */ - addrs[i][8] = ATCHc; - /* write out the info */ - printf("%c[31mCH:%c[32m 0x%02X ",27,27,ATCHc); - printf("%c[31mID:%c[32m 0x",27,27); - if (i == nodes || !(addrs[i][18] & 0x80)) { - printf("...."); - } else { - printf("%02X%02X",addrs[i][9],addrs[i][10]); - } - printf(" "); - printf("%c[31mMY:%c[32m 0x%02X%02X ",27,27,pkt->data[0],pkt->data[1]); - printf("%c[31mSH:%c[32m 0x%02X%02X%02X%02X ",27,27,pkt->data[2],pkt->data[3],pkt->data[4],pkt->data[5]); - printf("%c[31mSL:%c[32m 0x%02X%02X%02X%02X ",27,27,pkt->data[6],pkt->data[7],pkt->data[8],pkt->data[9]); - printf("%c[31mBD:%c[32m ",27,27); - if (i == nodes || !(addrs[i][18] & 0x40)) { - printf("......"); - } else { - switch (addrs[i][11]) { - case 0: printf(" 1200"); break; - case 1: printf(" 2400"); break; - case 2: printf(" 4800"); break; - case 3: printf(" 9600"); break; - case 4: printf(" 19200"); break; - case 5: printf(" 38400"); break; - case 6: printf(" 57600"); break; - case 7: printf("115200"); break; - default: printf(" other"); break; - } - } - printf(" "); - printf("%c[31mAP:%c[32m 0x",27,27); - if (i == nodes || !(addrs[i][18] & 0x20)) { - printf(".."); - } else { - printf("%02X",addrs[i][12]); - } - printf(" "); - printf("%c[31mHV:%c[32m 0x",27,27); - if (i == nodes || !(addrs[i][18] & 0x10)) { - printf("...."); - } else { - printf("%02X%02X",addrs[i][13],addrs[i][14]); - } - printf(" "); - printf("%c[31mVR:%c[32m 0x",27,27); - if (i == nodes || !(addrs[i][18] & 0x08)) { - printf("...."); - } else { - printf("%02X%02X",addrs[i][15],addrs[i][16]); - } - printf(" "); - printf("%c[31mCC:%c[32m ",27,27); - if (i == nodes || !(addrs[i][18] & 0x04)) { - printf(" . (0x..)"); - } else { - printf("'%c' (0x%02X)",addrs[i][17],addrs[i][17]); - } - printf(" "); - printf("%c[31mNI:%c[32m %-20s ",27,27,&(pkt->data[11])); - printf("%c[31mdB:%c[32m -%2d ",27,27,pkt->data[10]); - printf("%c[31m@:%c[32m %s",27,27,stime); - /* is this a rewrite? */ - if (i != nodes) { - /* go back the the bottom */ - printf("%c[%dB\r",27,nodes-i+1); - } else { - /* if its new... save the address */ - memcpy(&(addrs[nodes][0]),&(pkt->data[2]),8); - /* turn off all the flags */ - addrs[nodes][18] = 0; - /* new line is only wanted for new nodes */ - printf("\n%c[2K\n%c[0m",27,27); - /* if not, then add 1 to the number of nodes! */ - nodes++; - } - printf("%c[0m%c[2KScanning channel 0x%02X...\r",27,27,ATCHc); - fflush(stdout); - } - /* flush so the change is seen! */ - fflush(stdout); - } - /* free the packet */ - free(pkt); - } - /* sleep for 100ms (same as NT steps */ - usleep(100000); - } - } - fflush(stdout); - /* check for all nodes on this channel, and get thier pan id */ - for (i = 0; i < nodes; i++) { - int first = 1; - if (addrs[i][8] == ATCHc) { - xbee_con *tcon; - unsigned int dh,dl; - if (first) { - printf("%c[2KGathering settings for nodes on channel 0x%02X...\r",27,ATCHc); - first = 0; - } - /* get the address, and turn it the right way up! */ - memcpy(&dh,&(addrs[i][0]),4); - dh = ((dh & 0xFF) << 24) | ((dh & 0xFF00) << 8) | ((dh & 0xFF0000) >> 8) | ((dh & 0xFF000000) >> 24); - memcpy(&dl,&(addrs[i][4]),4); - dl = ((dl & 0xFF) << 24) | ((dl & 0xFF00) << 8) | ((dl & 0xFF0000) >> 8) | ((dl & 0xFF000000) >> 24); - /* setup a connection the the remote node */ - if ((tcon = xbee_newcon('I',xbee_64bitRemoteAT,dh,dl)) != NULL) { - /* find the line to edit */ - printf("\r%c[%dA",27,nodes-i+1); - - /* in this case we dont care if we dont get a response packet... */ - if (xbee_senddata(tcon,"ID")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if (((rpkt = xbee_getpacketwait(tcon)) != NULL) && (rpkt->status == 0)) { - /* move over the ID column */ - printf("\r%c[18C",27); - /* print the ID */ - printf("%c[32m%02X%02X%c[0m",27,rpkt->data[0],rpkt->data[1],27); - addrs[i][9] = rpkt->data[0]; - addrs[i][10] = rpkt->data[1]; - /* turn on the flag */ - addrs[i][18] |= 0x80; - free(rpkt); - } - - /* in this case we dont care if we dont get a response packet... */ - if (xbee_senddata(tcon,"BD")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if (((rpkt = xbee_getpacketwait(tcon)) != NULL) && (rpkt->status == 0)) { - /* move over the BD column */ - printf("\r%c[80C",27); - if ((rpkt->data[0] != 0x00) || (rpkt->data[1] != 0x00) || (rpkt->data[2] != 0x00) || ((rpkt->data[3] & 0xF8) != 0x00)) { - addrs[i][11] = 8; - } else { - addrs[i][11] = rpkt->data[3]; - } - /* turn on the flag */ - addrs[i][18] |= 0x40; - /* print the baud rate */ - printf("%c[32m",27); - switch (addrs[i][11]) { - case 0: printf(" 1200"); break; - case 1: printf(" 2400"); break; - case 2: printf(" 4800"); break; - case 3: printf(" 9600"); break; - case 4: printf(" 19200"); break; - case 5: printf(" 38400"); break; - case 6: printf(" 57600"); break; - case 7: printf("115200"); break; - default: printf(" other"); break; - } - printf("%c[0m",27); - free(rpkt); - } - /* in this case we dont care if we dont get a response packet... */ - if (xbee_senddata(tcon,"AP")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if (((rpkt = xbee_getpacketwait(tcon)) != NULL) && (rpkt->status == 0)) { - /* move over the AP column */ - printf("\r%c[96C",27); - /* print the ID */ - printf("%c[32m%02X%c[0m",27,rpkt->data[0],27); - addrs[i][12] = rpkt->data[0]; - /* turn on the flag */ - addrs[i][18] |= 0x20; - free(rpkt); - } - /* in this case we dont care if we dont get a response packet... */ - if (xbee_senddata(tcon,"HV")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if (((rpkt = xbee_getpacketwait(tcon)) != NULL) && (rpkt->status == 0)) { - /* move over the HV column */ - printf("\r%c[108C",27); - /* print the ID */ - printf("%c[32m%02X%02X%c[0m",27,rpkt->data[0],rpkt->data[1],27); - addrs[i][13] = rpkt->data[0]; - addrs[i][14] = rpkt->data[1]; - /* turn on the flag */ - addrs[i][18] |= 0x10; - free(rpkt); - } - /* in this case we dont care if we dont get a response packet... */ - if (xbee_senddata(tcon,"VR")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if (((rpkt = xbee_getpacketwait(tcon)) != NULL) && (rpkt->status == 0)) { - /* move over the VR column */ - printf("\r%c[122C",27); - /* print the ID */ - printf("%c[32m%02X%02X%c[0m",27,rpkt->data[0],rpkt->data[1],27); - addrs[i][15] = rpkt->data[0]; - addrs[i][16] = rpkt->data[1]; - /* turn on the flag */ - addrs[i][18] |= 0x08; - free(rpkt); - } - /* in this case we dont care if we dont get a response packet... */ - if (xbee_senddata(tcon,"CC")) { - printf("xbee_senddata: Error\n"); - return 1; - } - if (((rpkt = xbee_getpacketwait(tcon)) != NULL) && (rpkt->status == 0)) { - /* move over the CC column */ - printf("\r%c[134C",27); - /* print the ID */ - printf("%c[32m'%c' (0x%02X)%c[0m",27,rpkt->data[0],rpkt->data[0],27); - addrs[i][17] = rpkt->data[0]; - /* turn on the flag */ - addrs[i][18] |= 0x04; - free(rpkt); - } - /* go back the the bottom */ - printf("%c[%dB\r",27,nodes-i+1); - fflush(stdout); - } - } - } - /* fall back to the first channel if that was the last */ - if (XBeePro && ATCHc == 0x17) { - ATCHc = 0x0C; - } else if (!XBeePro && ATCHc == 0x1A) { - ATCHc = 0x0B; - } else { - /* else move onto next channel */ - ATCHc++; - } - usleep(100000); - } - - return 0; -} - diff --git a/libs/thirdParty/libxbee/sample/simple.c b/libs/thirdParty/libxbee/sample/simple.c deleted file mode 100644 index 8ab776f12..000000000 --- a/libs/thirdParty/libxbee/sample/simple.c +++ /dev/null @@ -1,68 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will politely return any recieved data */ - -#include -#include -#include - -int main(int argc, char *argv[]) { - xbee_con *con; - xbee_pkt *pkt, *rpkt; - - /* setup the xbee */ - if (xbee_setup("/dev/ttyUSB0",57600) == -1) { - /* oh no... it failed */ - printf("xbee_setup() failed...\n"); - exit(1); - } - - /* setup a connection */ - con = xbee_newcon('I',xbee_64bitData, 0x0013A200, 0x40081826); - - printf("Waiting...\n"); - - /* just wait for data, and echo it back! */ - while (1) { - /* while there are packets avaliable... */ - while ((pkt = xbee_getpacket(con)) != NULL) { - /* print the recieved data */ - printf("Rx: %s\n",pkt->data); - /* say thank you */ - if (xbee_senddata(con,"thank you for saying '%s'\r\n",pkt->data)) { - printf("xbee_senddata: Error\n"); - return 1; - } - /* free the packet */ - free(pkt); - } - usleep(100000); - } - - /* shouldn't ever get here but... */ - return 0; -} - diff --git a/libs/thirdParty/libxbee/sample/talk_to_me.c b/libs/thirdParty/libxbee/sample/talk_to_me.c deleted file mode 100644 index 26750988a..000000000 --- a/libs/thirdParty/libxbee/sample/talk_to_me.c +++ /dev/null @@ -1,82 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -g -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample will make the remote XBee talk to us! */ - -#include -#include -#include -#include - -int main(int argc, char *argv[]) { - union { - unsigned char as8[8]; - unsigned int as32[2]; - } addr; - xbee_con *atCon, *rCon; - xbee_pkt *pkt; - - /* the extra arguments are the CC ('+' by default) and GT (1000) by default AT values */ - xbee_setuplogAPI("/dev/ttyUSB0",57600,2,'+',1000); - - atCon = xbee_newcon('@', xbee_localAT); - - xbee_senddata(atCon, "SH"); - pkt = xbee_getpacketwait(atCon); - if (!pkt || pkt->status || pkt->atCmd[0] != 'S' || pkt->atCmd[1] != 'H') { - printf("Missing SH Packet!\n"); - return 1; - } - addr.as8[3] = pkt->data[0]; - addr.as8[2] = pkt->data[1]; - addr.as8[1] = pkt->data[2]; - addr.as8[0] = pkt->data[3]; - free(pkt); - - xbee_senddata(atCon, "SL"); - pkt = xbee_getpacketwait(atCon); - if (!pkt || pkt->status || pkt->atCmd[0] != 'S' || pkt->atCmd[1] != 'L') { - printf("Missing SL Packet!\n"); - return 1; - } - addr.as8[7] = pkt->data[0]; - addr.as8[6] = pkt->data[1]; - addr.as8[5] = pkt->data[2]; - addr.as8[4] = pkt->data[3]; - free(pkt); - - printf("Local XBee address is: 0x%08X %08X\n", addr.as32[0], addr.as32[1]); - - rCon = xbee_newcon('#', xbee_64bitRemoteAT, 0x13A200, 0x403CB26A); - - xbee_senddata(rCon, "DH%c%c%c%c", addr.as8[3], addr.as8[2], addr.as8[1], addr.as8[0]); - usleep(250000); - xbee_senddata(rCon, "DL%c%c%c%c", addr.as8[7], addr.as8[6], addr.as8[5], addr.as8[4]); - usleep(250000); - - /* calling xbee_end() will return the xbee to its previous API mode */ - xbee_end(); - return 0; -} diff --git a/libs/thirdParty/libxbee/sample/vb6/README.txt b/libs/thirdParty/libxbee/sample/vb6/README.txt deleted file mode 100644 index fe13a7dfc..000000000 --- a/libs/thirdParty/libxbee/sample/vb6/README.txt +++ /dev/null @@ -1,8 +0,0 @@ -These sample projects provide a quick demo of how to use various functions - -Running these assume that you have first compiled libxbee.dll successfully -You will also need to either copy libxbee.dll into this folder or into a - directory in your PATH - -If you want to use libxbee in your own projects, you must include libxbee.bas - which will provide you with access to the functions and type declarations diff --git a/libs/thirdParty/libxbee/sample/vb6/demo/Form1.frm b/libs/thirdParty/libxbee/sample/vb6/demo/Form1.frm deleted file mode 100644 index 4c7c6655b..000000000 --- a/libs/thirdParty/libxbee/sample/vb6/demo/Form1.frm +++ /dev/null @@ -1,64 +0,0 @@ -VERSION 5.00 -Begin VB.Form Form1 - Caption = "Form1" - ClientHeight = 2250 - ClientLeft = 120 - ClientTop = 450 - ClientWidth = 3855 - LinkTopic = "Form1" - ScaleHeight = 2250 - ScaleWidth = 3855 - StartUpPosition = 3 'Windows Default - Begin VB.TextBox tb - Height = 1995 - Left = 120 - MultiLine = -1 'True - TabIndex = 0 - Top = 120 - Width = 3615 - End -End -Attribute VB_Name = "Form1" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Option Explicit - -Dim myCon As Long -Dim myDataCon As Long - -Private Sub Form_Load() - Dim i As Long - Dim x As Byte - Dim ctype, addrH, addrL As Long - Me.Show - DoEvents - - ' Connect to the XBee on COM1 with a baud rate of 57600 - ' The XBee should be in API mode 2 (ATAP2) - If xbee_setupDebug("COM8", 57600, "xbee.log") <> 0 Then - MsgBox "Error while setting up the local XBee module", vbCritical, "xbee_setup()" - End - End If - xbee_logit "Hello!" - - ' Enable callbacks, this only needs to be done ONCE - ' The window handle provided must remain in memory (dont unload the form - callbacks will automatically be disabled) - xbee_enableCallbacks Me.hWnd - - ' Create a Remote AT connection to a node using 64-bit addressing - myCon = xbee_newcon_64bit(&H30, xbee_64bitRemoteAT, &H13A200, &H404B75DE) - xbee_enableACKwait myCon - - myDataCon = xbee_newcon_64bit(&H31, xbee_64bitData, &H13A200, &H404B75DE) - - ' Setup callbacks - xbee_attachCallback myCon, AddressOf Module1.callback1 - xbee_attachCallback myDataCon, AddressOf Module1.callback2 - - ' Send the AT command NI (Node Identifier) - tb.text = "Sending 'ATNI'..." - xbee_sendstring myCon, "NI" -End Sub - diff --git a/libs/thirdParty/libxbee/sample/vb6/demo/demo.bas b/libs/thirdParty/libxbee/sample/vb6/demo/demo.bas deleted file mode 100644 index b1e51fd90..000000000 --- a/libs/thirdParty/libxbee/sample/vb6/demo/demo.bas +++ /dev/null @@ -1,19 +0,0 @@ -Attribute VB_Name = "Module1" -Public Function callback1(ByVal con As Long, ByRef pkt As xbee_pkt) As Long - ' Check the returned status, if it isnt 0 then an error occured - If pkt.status <> 0 Then - Form1.tb.Text = Form1.tb.Text & vbNewLine & "An error occured (" & pkt.status & ")" - Exit Function - End If - - ' Display the Node Identifier - Form1.tb.Text = Form1.tb.Text & vbNewLine & "Node Identifier:" & StrConv(pkt.data, vbUnicode) - Form1.tb.SelStart = Len(Form1.tb.Text) -End Function - -Public Function callback2(ByVal con As Long, ByRef pkt As xbee_pkt) As Long - ' Display the data - Form1.tb.Text = Form1.tb.Text & vbNewLine & "Rx:" & StrConv(pkt.data, vbUnicode) - Form1.tb.SelStart = Len(Form1.tb.Text) -End Function - diff --git a/libs/thirdParty/libxbee/sample/vb6/demo/demo.vbp b/libs/thirdParty/libxbee/sample/vb6/demo/demo.vbp deleted file mode 100644 index 815e949e7..000000000 --- a/libs/thirdParty/libxbee/sample/vb6/demo/demo.vbp +++ /dev/null @@ -1,33 +0,0 @@ -Type=Exe -Form=Form1.frm -Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation -Module=Module1; demo.bas -Module=libxbee; ..\libxbee.bas -IconForm="Form1" -Startup="Form1" -ExeName32="demo.exe" -Command32="" -Name="Project1" -HelpContextID="0" -CompatibleMode="0" -MajorVer=1 -MinorVer=0 -RevisionVer=0 -AutoIncrementVer=0 -ServerSupportFiles=0 -VersionCompanyName="Microsoft" -CompilationType=0 -OptimizationType=0 -FavorPentiumPro(tm)=0 -CodeViewDebugInfo=0 -NoAliasing=0 -BoundsCheck=0 -OverflowCheck=0 -FlPointCheck=0 -FDIVCheck=0 -UnroundedFP=0 -StartMode=0 -Unattended=0 -Retained=0 -ThreadPerObject=0 -MaxNumberOfThreads=1 diff --git a/libs/thirdParty/libxbee/sample/vb6/libxbee.bas b/libs/thirdParty/libxbee/sample/vb6/libxbee.bas deleted file mode 100644 index 0875907f9..000000000 --- a/libs/thirdParty/libxbee/sample/vb6/libxbee.bas +++ /dev/null @@ -1,285 +0,0 @@ -Attribute VB_Name = "libxbee" -Option Explicit - -Enum xbee_types - xbee_unknown - - xbee_localAT - xbee_remoteAT - xbee_modemStatus - xbee_txStatus - - ' XBee Series 1 stuff - xbee_16bitRemoteAT - xbee_64bitRemoteAT - - xbee_16bitData - xbee_64bitData - - xbee_16bitIO - xbee_64bitIO - - ' XBee Series 2 stuff - xbee2_data - xbee2_txStatus -End Enum - -Type xbee_sample - '# X A5 A4 A3 A2 A1 A0 D8 D7 D6 D5 D4 D3 D2 D1 D0 - IOmask As Integer - '# X X X X X X X D8 D7 D6 D5 D4 D3 D2 D1 D0 - IOdigital As Integer - '# X X X X X D D D D D D D D D D D - IOanalog(0 To 5) As Integer -End Type - -Type xbee_pkt - flags As Long '# bit 0 - is64 - '# bit 1 - dataPkt - '# bit 2 - txStatusPkt - '# bit 3 - modemStatusPkt - '# bit 4 - remoteATPkt - '# bit 5 - IOPkt - frameID As Byte - atCmd(0 To 1) As Byte - - status As Byte - samples As Byte - RSSI As Byte - - Addr16(0 To 1) As Byte - - Addr64(0 To 7) As Byte - - data(0 To 127) As Byte - - datalen As Long - - type As Long ' enum xbee_types - - SPARE As Long ' IGNORE THIS (is the pointer to the next packet in C... this will ALWAYS be 0 in VB) - - IOdata As xbee_sample -End Type - -Private OldhWndHandler As Long -Private ActivehWnd As Long -Private callbackMessageID As Long -Private Callbacks As New Collection - -Public Declare Sub xbee_free Lib "libxbee.dll" (ByVal ptr As Long) - -Public Declare Function xbee_setup Lib "libxbee.dll" (ByVal port As String, ByVal baudRate As Long) As Long -Public Declare Function xbee_setupDebug Lib "libxbee.dll" (ByVal port As String, ByVal baudRate As Long, ByVal logfile As String) As Long -Private Declare Function xbee_setupDebugAPIRaw Lib "libxbee.dll" Alias "xbee_setupDebugAPI" (ByVal port As String, ByVal baudRate As Long, ByVal logfile As String, ByVal cmdSeq As Byte, ByVal cmdTime As Long) As Long -Private Declare Function xbee_setupAPIRaw Lib "libxbee.dll" Alias "xbee_setupAPI" (ByVal port As String, ByVal baudRate As Long, ByVal cmdSeq As Byte, ByVal cmdTime As Long) As Long - -Public Declare Function xbee_end Lib "libxbee.dll" () As Long - -Public Declare Function xbee_newcon_simple Lib "libxbee.dll" (ByVal frameID As Byte, ByVal conType As Long) As Long 'xbee_con * -Public Declare Function xbee_newcon_16bit Lib "libxbee.dll" (ByVal frameID As Byte, ByVal conType As Long, ByVal addr16bit As Long) As Long 'xbee_con * -Public Declare Function xbee_newcon_64bit Lib "libxbee.dll" (ByVal frameID As Byte, ByVal conType As Long, ByVal addr64bitLow As Long, ByVal addr64bitHigh As Long) As Long 'xbee_con * -Public Declare Sub xbee_enableACKwait Lib "libxbee.dll" (ByVal con As Long) -Public Declare Sub xbee_disableACKwait Lib "libxbee.dll" (ByVal con As Long) -Public Declare Sub xbee_enableDestroySelf Lib "libxbee.dll" (ByVal con As Long) - -Private Declare Sub xbee_enableCallbacksRaw Lib "libxbee.dll" Alias "xbee_enableCallbacks" (ByVal hWnd As Long, ByVal uMsg As Long) -Private Declare Sub xbee_attachCallbackRaw Lib "libxbee.dll" Alias "xbee_attachCallback" (ByVal con As Long) -Private Declare Sub xbee_detachCallbackRaw Lib "libxbee.dll" Alias "xbee_detachCallback" (ByVal con As Long) -Private Declare Function xbee_runCallback Lib "libxbee.dll" (ByVal func As Long, ByVal con As Long, ByVal pkt As Long) As Long - -Public Declare Sub xbee_endcon2 Lib "libxbee.dll" (ByVal con As Long) -Public Declare Sub xbee_flushcon Lib "libxbee.dll" (ByVal con As Long) - -Public Declare Function xbee_senddata Lib "libxbee.dll" Alias "xbee_nsenddata" (ByVal con As Long, ByRef data As Byte, ByVal Length As Long) As Long -Private Declare Function xbee_senddata_str Lib "libxbee.dll" Alias "xbee_nsenddata" (ByVal con As Long, ByVal data As String, ByVal Length As Long) As Long - -Public Declare Function xbee_getpacketRaw Lib "libxbee.dll" Alias "xbee_getpacket" (ByVal con As Long) As Long 'xbee_pkt * - -Public Declare Function xbee_hasanalog Lib "libxbee.dll" (ByRef pkt As xbee_pkt, ByVal sample As Long, ByVal inputPin As Long) As Long -Public Declare Function xbee_getanalog Lib "libxbee.dll" (ByRef pkt As xbee_pkt, ByVal sample As Long, ByVal inputPin As Long, ByVal Vref As Double) As Double - -Public Declare Function xbee_hasdigital Lib "libxbee.dll" (ByRef pkt As xbee_pkt, ByVal sample As Long, ByVal inputPin As Long) As Long -Public Declare Function xbee_getdigital Lib "libxbee.dll" (ByRef pkt As xbee_pkt, ByVal sample As Long, ByVal inputPin As Long) As Long - -Private Declare Function xbee_svn_versionRaw Lib "libxbee.dll" Alias "xbee_svn_version" () As Long -Public Declare Sub xbee_logit Lib "libxbee.dll" (ByVal text As String) - -'########################################################################################################################################################################### - -Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) -Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long -Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long -Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long -Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long -Private Const WM_DESTROY = &H2 -Private Const GWL_WNDPROC = -4 - -Public Function PointerToString(lngPtr As Long) As String - Dim strTemp As String - Dim lngLen As Long - If lngPtr Then - lngLen = lstrlenW(lngPtr) * 2 - If lngLen Then - strTemp = Space(lngLen) - CopyMemory ByVal strTemp, ByVal lngPtr, lngLen - PointerToString = Replace(strTemp, Chr(0), "") - End If - End If -End Function - -Public Function ArrayToString(data() As Byte, Optional lb As Integer = -1, Optional ub As Integer = -1) As String - Dim tmp As String - Dim i - If lb = -1 Then lb = LBound(data) - If ub = -1 Then ub = UBound(data) - tmp = "" - For i = lb To ub - If (data(i) = 0) Then Exit For - tmp = tmp & Chr(data(i)) - Next - ArrayToString = tmp -End Function - -Public Function xbee_pointerToPacket(lngPtr As Long) As xbee_pkt - Dim p As xbee_pkt - CopyMemory p, ByVal lngPtr, Len(p) - xbee_pointerToPacket = p -End Function - -Public Sub libxbee_load() - ' this function is simply to get VB6 to call a libxbee function - ' if you are using any C DLLs that make use of libxbee, then you should call this function first so that VB6 will load libxbee - xbee_svn_versionRaw -End Sub - -Public Function xbee_svn_version() As String - xbee_svn_version = PointerToString(xbee_svn_versionRaw()) -End Function - -Public Function xbee_setupAPI(ByVal port As String, ByVal baudRate As Long, ByVal cmdSeq As String, ByVal cmdTime As Long) - xbee_setupAPI = xbee_setupAPIRaw(port, baudRate, Asc(cmdSeq), cmdTime) -End Function - -Public Function xbee_setupDebugAPI(ByVal port As String, ByVal baudRate As Long, ByVal logfile As String, ByVal cmdSeq As String, ByVal cmdTime As Long) - xbee_setupDebugAPI = xbee_setupDebugAPIRaw(port, baudRate, logfile, Asc(cmdSeq), cmdTime) -End Function - -Private Sub xbee_ensureMessageID() - If callbackMessageID = 0 Then - callbackMessageID = RegisterWindowMessage("libxbee") - End If - xbee_enableCallbacksRaw ActivehWnd, callbackMessageID -End Sub - -Public Sub xbee_attachCallback(ByVal con As Long, ByVal func As Long) - Dim t(0 To 1) As Long - Dim c As String - If ActivehWnd = 0 Then - Debug.Print "Callbacks not enabled!" - Exit Sub - End If - xbee_ensureMessageID - c = CStr(con) - t(0) = con - t(1) = func - On Error Resume Next - Callbacks.Remove c - Callbacks.Add t, c - On Error GoTo 0 - xbee_attachCallbackRaw con -End Sub - -Public Sub xbee_detachCallback(ByVal con As Long) - If ActivehWnd = 0 Then - Debug.Print "Callbacks not enabled!" - Exit Sub - End If - On Error Resume Next - xbee_detachCallbackRaw con - Callbacks.Remove CStr(con) -End Sub - -Public Sub xbee_enableCallbacks(ByVal hWnd As Long) - If ActivehWnd <> 0 Then - Debug.Print "Callbacks already enabled!" - Exit Sub - End If - ActivehWnd = hWnd - OldhWndHandler = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf libxbee.xbee_messageHandler) - xbee_ensureMessageID -End Sub - -Public Sub xbee_disableCallbacks() - Dim id As Variant - If ActivehWnd = 0 Then - Debug.Print "Callbacks not enabled!" - Exit Sub - End If - For Each id In Callbacks - xbee_detachCallback id(0) - Next - SetWindowLong ActivehWnd, GWL_WNDPROC, OldhWndHandler - ActivehWnd = 0 - OldhWndHandler = 0 -End Sub - -Private Function xbee_messageHandler(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long - If uMsg = callbackMessageID Then - Dim t As Long - On Error Resume Next - Err.Clear - t = Callbacks.Item(CStr(wParam))(1) - If Err.Number = 0 Then - On Error GoTo 0 - xbee_messageHandler = xbee_runCallback(t, wParam, lParam) - Exit Function - End If - On Error GoTo 0 - xbee_logit "Unable to match Connection with active callback!" - End If - xbee_messageHandler = CallWindowProc(OldhWndHandler, hWnd, uMsg, wParam, lParam) - If uMsg = WM_DESTROY And ActivehWnd <> 0 Then - ' Disable the MessageHandler if the form "unload" event is detected - xbee_disableCallbacks - End If -End Function - -Public Sub xbee_endcon(ByRef con As Long) - xbee_endcon2 con - con = 0 -End Sub - -Public Function xbee_sendstring(ByVal con As Long, ByVal str As String) - xbee_sendstring = xbee_senddata_str(con, str, Len(str)) -End Function - -Public Function xbee_getpacketPtr(ByVal con As Long, ByRef pkt As Long) As Integer - Dim ptr As Long - - ptr = xbee_getpacketRaw(con) - If ptr = 0 Then - pkt = 0 - xbee_getpacketPtr = 0 - Exit Function - End If - - pkt = ptr - xbee_getpacketPtr = 1 -End Function - -Public Function xbee_getpacket(ByVal con As Long, ByRef pkt As xbee_pkt) As Integer - Dim ptr As Long - - ptr = xbee_getpacketRaw(con) - If ptr = 0 Then - xbee_getpacket = 0 - Exit Function - End If - - pkt = xbee_pointerToPacket(ptr) - xbee_free ptr - - xbee_getpacket = 1 -End Function - diff --git a/libs/thirdParty/libxbee/sample/vb6/talk_to_me/Form1.frm b/libs/thirdParty/libxbee/sample/vb6/talk_to_me/Form1.frm deleted file mode 100644 index 426a9df93..000000000 --- a/libs/thirdParty/libxbee/sample/vb6/talk_to_me/Form1.frm +++ /dev/null @@ -1,1197 +0,0 @@ -VERSION 5.00 -Begin VB.Form Form1 - BorderStyle = 1 'Fixed Single - Caption = "Talk to Me" - ClientHeight = 7875 - ClientLeft = 45 - ClientTop = 375 - ClientWidth = 7515 - LinkTopic = "Form1" - MaxButton = 0 'False - ScaleHeight = 7875 - ScaleWidth = 7515 - StartUpPosition = 1 'CenterOwner - Begin VB.Timer tmr_timeout - Enabled = 0 'False - Interval = 5000 - Left = 3720 - Top = 1380 - End - Begin VB.Frame Frame2 - Caption = " Actions " - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 1335 - Left = 180 - TabIndex = 1 - Top = 6420 - Width = 7215 - Begin VB.CommandButton write_settings - Caption = "Write Settings" - Enabled = 0 'False - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 375 - Left = 1920 - TabIndex = 50 - Top = 780 - Width = 1935 - End - Begin VB.CommandButton set_default - Caption = "Set Default" - Enabled = 0 'False - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 375 - Left = 180 - TabIndex = 49 - Top = 780 - Width = 1575 - End - Begin VB.CommandButton reset_node - Caption = "Reset Node" - Enabled = 0 'False - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 375 - Left = 4020 - TabIndex = 47 - Top = 780 - Width = 1575 - End - Begin VB.CommandButton set_dest - Caption = "Set destination" - Enabled = 0 'False - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 375 - Left = 1920 - TabIndex = 46 - Top = 300 - Width = 1935 - End - Begin VB.CommandButton talk_to_me - Caption = "Talk to Me" - Enabled = 0 'False - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 375 - Left = 180 - TabIndex = 45 - Top = 300 - Width = 1575 - End - Begin VB.CommandButton set_ni - Caption = "Set Node Identifier" - Enabled = 0 'False - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 375 - Left = 4020 - TabIndex = 51 - Top = 300 - Width = 2355 - End - End - Begin VB.Frame Frame1 - Caption = " Settings " - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 3315 - Left = 180 - TabIndex = 0 - Top = 3000 - Width = 7215 - Begin VB.Label ni - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 24 - Top = 300 - Width = 3915 - End - Begin VB.Label sl - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 22 - Top = 1020 - Width = 3915 - End - Begin VB.Label sh - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 20 - Top = 780 - Width = 3915 - End - Begin VB.Label my - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 18 - Top = 540 - Width = 3915 - End - Begin VB.Label ap - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 17 - Top = 1260 - Width = 3915 - End - Begin VB.Label bd - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 16 - Top = 1500 - Width = 3915 - End - Begin VB.Label ch - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 15 - Top = 1740 - Width = 3915 - End - Begin VB.Label dh - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 14 - Top = 1980 - Width = 3915 - End - Begin VB.Label dl - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 13 - Top = 2220 - Width = 3915 - End - Begin VB.Label ia - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 11 - Top = 2460 - Width = 3915 - End - Begin VB.Label vr - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 10 - Top = 2940 - Width = 3915 - End - Begin VB.Label hv - BackStyle = 0 'Transparent - Caption = "-" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Left = 3180 - TabIndex = 12 - Top = 2700 - Width = 3915 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "NI - Node Identifier" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 17 - Left = 180 - TabIndex = 25 - Top = 300 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "MY - 16-bit Address" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 13 - Left = 180 - TabIndex = 19 - Top = 540 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "VR - Firmware Version" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 14 - Left = 180 - TabIndex = 9 - Top = 2940 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "IA - I/O Address" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 12 - Left = 180 - TabIndex = 8 - Top = 2460 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "DL - Destination Low" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 10 - Left = 180 - TabIndex = 6 - Top = 2220 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "DH - Destination High" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 9 - Left = 180 - TabIndex = 5 - Top = 1980 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "CH - Channel" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 8 - Left = 180 - TabIndex = 4 - Top = 1740 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "BD - Interface Rate" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 7 - Left = 180 - TabIndex = 3 - Top = 1500 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "AP - API Enable" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 6 - Left = 180 - TabIndex = 2 - Top = 1260 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "HV - Hardware Version" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 11 - Left = 180 - TabIndex = 7 - Top = 2700 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " .....:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 29 - Left = 180 - TabIndex = 44 - Top = 2700 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " ...........:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 28 - Left = 180 - TabIndex = 43 - Top = 1260 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " .......:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 27 - Left = 180 - TabIndex = 42 - Top = 1500 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " ..............:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 26 - Left = 180 - TabIndex = 41 - Top = 1740 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " .....:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 25 - Left = 180 - TabIndex = 40 - Top = 1980 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " ......:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 24 - Left = 180 - TabIndex = 39 - Top = 2220 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " ..........:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 23 - Left = 180 - TabIndex = 38 - Top = 2460 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " .....:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 22 - Left = 180 - TabIndex = 37 - Top = 2940 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " .......:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 21 - Left = 180 - TabIndex = 36 - Top = 540 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " ......:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 18 - Left = 180 - TabIndex = 33 - Top = 300 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "SL - 64-bit Address (Lo)" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 16 - Left = 180 - TabIndex = 23 - Top = 1020 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "SH - 64-bit Address (Hi)" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 255 - Index = 15 - Left = 180 - TabIndex = 21 - Top = 780 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " ..:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 20 - Left = 180 - TabIndex = 35 - Top = 780 - Width = 2955 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = " ..:" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 255 - Index = 19 - Left = 180 - TabIndex = 34 - Top = 1020 - Width = 2955 - End - End - Begin VB.Timer tmr_refresh - Enabled = 0 'False - Interval = 500 - Left = 3240 - Top = 1380 - End - Begin VB.Frame Frame3 - Caption = " Node List " - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 2775 - Left = 180 - TabIndex = 26 - Top = 120 - Width = 7215 - Begin VB.ListBox nodelist - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 2085 - Left = 180 - TabIndex = 27 - Top = 540 - Width = 6855 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "16-bit" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 195 - Index = 0 - Left = 240 - TabIndex = 32 - Top = 300 - Width = 675 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "RSSI" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 195 - Index = 3 - Left = 3660 - TabIndex = 30 - Top = 300 - Width = 435 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "@" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 195 - Index = 4 - Left = 4440 - TabIndex = 29 - Top = 300 - Width = 135 - End - Begin VB.Label Label - BackStyle = 0 'Transparent - Caption = "Node Name" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 195 - Index = 5 - Left = 4740 - TabIndex = 28 - Top = 300 - Width = 915 - End - Begin VB.Label Label - Alignment = 2 'Center - BackStyle = 0 'Transparent - Caption = "- -" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - ForeColor = &H00C0C0C0& - Height = 195 - Index = 2 - Left = 1020 - TabIndex = 48 - Top = 300 - Width = 2355 - End - Begin VB.Label Label - Alignment = 2 'Center - BackStyle = 0 'Transparent - Caption = "(Hi) 64-bit (Lo)" - BeginProperty Font - Name = "Courier New" - Size = 9 - Charset = 0 - Weight = 400 - Underline = 0 'False - Italic = 0 'False - Strikethrough = 0 'False - EndProperty - Height = 195 - Index = 1 - Left = 1020 - TabIndex = 31 - Top = 300 - Width = 2355 - End - End -End -Attribute VB_Name = "Form1" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Dim dieNow As Boolean - -Private Sub Form_Load() - Me.Show - DoEvents - dieNow = False - - ' setup libxbee - If (xbee_setupDebugAPI("COM8", 57600, "xbee.log", "+", 250) = -1) Then - MsgBox "libxbee setup failed...", vbCritical - Unload Me - End - End If - - ' enable callback functions - xbee_enableCallbacks Me.hWnd - - ' setup a local at connection - atcon = xbee_newcon_simple(Asc("A"), xbee_localAT) - xbee_enableACKwait atcon - xbee_attachCallback atcon, AddressOf localCB - - ' set off the chain reaction! - xbeesend atcon, "MY" -End Sub - -Private Sub Form_Unload(Cancel As Integer) - Static c As Integer - dieNow = 1 - Cancel = 1 - Me.Caption = "Waiting for command to complete..." - c = c + 1 - If (c >= 2) Then - Cancel = 0 - End If -End Sub - -Private Sub nodelist_Click() - Dim tmp() As String - If nodelist.ListCount = 0 Or nodelist.ListIndex = -1 Then Exit Sub - If set_dest.Tag = "yes" Then - nodelist.Enabled = False - Else - If nodelist.ListIndex = 0 Then - remoteCon = atcon - Else - str2 = Split(nodelist.text, " ") - remoteCon = xbee_newcon_64bit(Asc("2"), xbee_64bitRemoteAT, CLng("&H" & Right(str2(1), 8)), CLng("&H" & Right(str2(2), 8))) - End If - setButtons False - nodelist.Enabled = False - tmp = Split(nodelist.List(nodelist.ListIndex), " ") - ni = tmp(5) - my = tmp(0) - sh = tmp(1) - sl = tmp(2) - ap = "-" - bd = "-" - ch = "-" - dh = "-" - dl = "-" - ia = "-" - hv = "-" - vr = "-" - End If -End Sub - -Private Sub reset_node_Click() - If nodelist.ListCount = 0 Or nodelist.ListIndex = -1 Then Exit Sub - nodelist.Enabled = False - setButtons False - reset_node.Tag = "yes" -End Sub - -Private Sub set_default_Click() - If nodelist.ListCount = 0 Or nodelist.ListIndex = -1 Then Exit Sub - nodelist.Enabled = False - setButtons False - set_default.Tag = "yes" -End Sub - -Private Sub set_dest_Click() - If nodelist.ListCount = 0 Or nodelist.ListIndex = -1 Then Exit Sub - nodelist.Tag = nodelist.ListIndex - setButtons False - set_dest.Tag = "yes" -End Sub - -Private Sub set_ni_Click() - Dim newni As String - Dim oldni As String - oldni = Split(nodelist.text, " ")(5) - newni = InputBox("New node identifier:", "Set Node Identifier", oldni) - If newni = oldni Then Exit Sub - nodelist.Enabled = False - setButtons False - set_ni.Tag = newni -End Sub - -Private Sub talk_to_me_Click() - If nodelist.ListCount = 0 Or nodelist.ListIndex = -1 Then Exit Sub - nodelist.Enabled = False - setButtons False - talk_to_me.Tag = "yes" -End Sub - -Private Sub tmr_refresh_Timer() - Dim str As String - Dim str2() As String - tmr_refresh.Enabled = False - If atcon = 0 Then Exit Sub - - If (dieNow) Then - xbee_end - DoEvents - xbee_disableCallbacks - Unload Me - End - End If - - If nodelist.Enabled = False Then - xbee_attachCallback remoteCon, AddressOf remoteCB - If talk_to_me.Tag = "yes" Then - str2 = Split(Form1.nodelist.text, " ") - xbee_attachCallback remoteCon, AddressOf setupCB_TTM - str2 = Split(nodelist.List(0), " ") - str = Chr(CInt("&H" & Mid(str2(1), 9, 2))) - str = Chr(CInt("&H" & Mid(str2(1), 7, 2))) & str - str = Chr(CInt("&H" & Mid(str2(1), 5, 2))) & str - str = Chr(CInt("&H" & Mid(str2(1), 3, 2))) & str - str = "DH" & str - xbeesend remoteCon, str - ElseIf set_dest.Tag = "yes" Then - str2 = Split(Form1.nodelist.text, " ") - xbee_attachCallback remoteCon, AddressOf setupCB_SDEST - str2 = Split(nodelist.text, " ") - str = Chr(CInt("&H" & Mid(str2(1), 9, 2))) - str = Chr(CInt("&H" & Mid(str2(1), 7, 2))) & str - str = Chr(CInt("&H" & Mid(str2(1), 5, 2))) & str - str = Chr(CInt("&H" & Mid(str2(1), 3, 2))) & str - str = "DH" & str - xbeesend remoteCon, str - ElseIf reset_node.Tag = "yes" Then - xbee_sendstring remoteCon, "FR" - setButtons True - reset_node.Tag = "" - tmr_refresh.Enabled = True - ElseIf write_settings.Tag = "yes" Then - xbee_sendstring remoteCon, "WR" - setButtons True - write_settings.Tag = "" - tmr_refresh.Enabled = True - ElseIf set_default.Tag = "yes" Then - setupCB_Default_Start - ElseIf set_ni.Tag <> "" Then - xbeesend remoteCon, "NI" & set_ni.Tag - set_ni.Tag = "" - Else - xbeesend remoteCon, "AP" - End If - Exit Sub - End If - ' initiate network scan - xbee_attachCallback atcon, AddressOf localCB - xbeesend atcon, "MY" -End Sub - -Private Sub tmr_timeout_Timer() - Dim con As Long - Dim str As String - Dim str2() As String - tmr_timeout.Enabled = False - str2 = Split(tmr_timeout.Tag, Chr(1), 2) - con = CStr(str2(0)) - str = str2(1) - If MsgBox("Request timed out... Retry?", vbYesNo + vbQuestion, "Retry?") = vbNo Then - setButtons True - nodelist.Enabled = True - tmr_refresh.Enabled = True - Exit Sub - End If - xbeesend con, str -End Sub - -Private Sub write_settings_Click() - If nodelist.ListCount = 0 Or nodelist.ListIndex = -1 Then Exit Sub - nodelist.Enabled = False - setButtons False - write_settings.Tag = "yes" -End Sub diff --git a/libs/thirdParty/libxbee/sample/vb6/talk_to_me/talk_to_me.bas b/libs/thirdParty/libxbee/sample/vb6/talk_to_me/talk_to_me.bas deleted file mode 100644 index dc9f5f76d..000000000 --- a/libs/thirdParty/libxbee/sample/vb6/talk_to_me/talk_to_me.bas +++ /dev/null @@ -1,431 +0,0 @@ -Attribute VB_Name = "Module1" -Public atcon As Long -Public remoteCon As Long - -Public Sub setButtons(ByVal state As Boolean) - Form1.talk_to_me.Tag = "" - Form1.talk_to_me.Enabled = state - Form1.set_dest.Tag = "" - Form1.set_dest.Enabled = state - Form1.reset_node.Tag = "" - Form1.reset_node.Enabled = state - Form1.set_default.Tag = "" - Form1.set_default.Enabled = state - Form1.write_settings.Tag = "" - Form1.write_settings.Enabled = state - Form1.set_ni.Tag = "" - Form1.set_ni.Enabled = state -End Sub - -Public Function xbeesend(ByVal con As Long, ByVal str As String) As Long - Form1.tmr_timeout.Enabled = False - Form1.tmr_timeout.Tag = CStr(con) & Chr(1) & str - Form1.tmr_timeout.Enabled = True - xbee_sendstring con, str -End Function - -Public Sub setupCB_Default_Start() - xbee_attachCallback remoteCon, AddressOf setupCB_Default - xbee_attachCallback atcon, AddressOf setupCB_Default - xbeesend remoteCon, "CH" & Chr(16) -End Sub -Public Function setupCB_Default(ByVal con As Long, ByRef pkt As xbee_pkt) As Long - Dim str As String - Dim str2() As String - ' default values (in order of setting): - ' CH = 10 - ' local CH = 10 - ' MY = FF - ' T3 = 1 - ' BD = 6 - ' AP = 0 - ' RO = 1 - ' D0 = 5 (turn on rest of system) - ' D1 = 2 (battery reading) - ' D2 = 0 - ' D3 = 5 (reset) - ' D4 = 4 (battery reading power) - ' D5 = 0 - ' D6 = 0 - ' D7 = 0 - ' D8 = 0 - ' IA = 0xFFFF (accept inputs from anyone) - ' IU = 0 - Debug.Print ArrayToString(pkt.atCmd) - If con = atcon Then - xbee_attachCallback con, AddressOf localCB - xbeesend remoteCon, "MY" & Chr(255) & Chr(255) - Exit Function - End If - Select Case ArrayToString(pkt.atCmd) - Case "CH" - xbeesend atcon, "CH" & Chr(16) - Case "MY" - xbeesend con, "T3" & Chr(1) - Case "T3" - xbeesend con, "BD" & Chr(0) & Chr(0) & Chr(0) & Chr(6) - Case "BD" - xbeesend con, "AP" & Chr(0) - Case "AP" - xbeesend con, "RO" & Chr(1) - Case "RO" - xbeesend con, "D0" & Chr(5) - Case "D0" - xbeesend con, "D1" & Chr(2) - Case "D1" - xbeesend con, "D2" & Chr(0) - Case "D2" - xbeesend con, "D3" & Chr(4) - Case "D3" - xbeesend con, "D4" & Chr(4) - Case "D4" - xbeesend con, "D5" & Chr(0) - Case "D5" - xbeesend con, "D6" & Chr(0) - Case "D6" - xbeesend con, "D7" & Chr(0) - Case "D7" - xbeesend con, "D8" & Chr(0) - Case "D8" - xbeesend con, "IA" & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(255) & Chr(255) - Case "IA" - xbeesend con, "IU" & Chr(0) - Case "IU" - Form1.set_default.Tag = "" - Form1.tmr_refresh.Enabled = True - Form1.tmr_timeout.Enabled = False - End Select -End Function - -Public Function setupCB_TTM(ByVal con As Long, ByRef pkt As xbee_pkt) As Long - Dim str As String - Dim str2() As String - Select Case ArrayToString(pkt.atCmd) - Case "DH" - str2 = Split(Form1.nodelist.List(0), " ") - str = Chr(CInt("&H" & Mid(str2(2), 9, 2))) - str = Chr(CInt("&H" & Mid(str2(2), 7, 2))) & str - str = Chr(CInt("&H" & Mid(str2(2), 5, 2))) & str - str = Chr(CInt("&H" & Mid(str2(2), 3, 2))) & str - str = "DL" & str - xbeesend con, str - Case "DL" - Form1.talk_to_me.Tag = "" - Form1.tmr_refresh.Enabled = True - End Select -End Function - -Public Function setupCB_SDEST(ByVal con As Long, ByRef pkt As xbee_pkt) As Long - Dim str As String - Dim str2() As String - Select Case ArrayToString(pkt.atCmd) - Case "DH" - str2 = Split(Form1.nodelist.text, " ") - str = Chr(CInt("&H" & Mid(str2(2), 9, 2))) - str = Chr(CInt("&H" & Mid(str2(2), 7, 2))) & str - str = Chr(CInt("&H" & Mid(str2(2), 5, 2))) & str - str = Chr(CInt("&H" & Mid(str2(2), 3, 2))) & str - str = "DL" & str - xbeesend con, str - Case "DL" - Form1.set_dest.Tag = "" - Form1.nodelist.ListIndex = Form1.nodelist.Tag - Form1.tmr_refresh.Enabled = True - End Select -End Function - -Public Function remoteCB(ByVal con As Long, ByRef pkt As xbee_pkt) As Long - Dim t As String - Dim i As Long - Debug.Print "<+>", ArrayToString(pkt.atCmd) - Form1.tmr_timeout.Enabled = False - Select Case ArrayToString(pkt.atCmd) - Case "AP" - Select Case pkt.data(0) - Case 0 - Form1.ap.Caption = "0 - API Disabled" - Case 1 - Form1.ap.Caption = "1 - API Enabled (no escapes)" - Case 2 - Form1.ap.Caption = "2 - API Enabled (with escapes)" - Case Default - Form1.ap.Caption = "0x" & Hex(pkt.data(0)) & " - Unknown..." - End Select - xbeesend con, "BD" - Case "BD" - t = Hex(pkt.data(3)) - If (Len(t) < 2) Then t = "0" & t - t = Hex(pkt.data(2)) & t - If (Len(t) < 4) Then t = "0" & t - t = Hex(pkt.data(1)) & t - If (Len(t) < 6) Then t = "0" & t - t = Hex(pkt.data(0)) & t - If (Len(t) < 8) Then t = "0" & t - i = CStr("&H" & t) - Select Case i - Case 0 - Form1.bd.Caption = "0 - 1200 bps" - Case 1 - Form1.bd.Caption = "1 - 2400 bps" - Case 2 - Form1.bd.Caption = "2 - 4800 bps" - Case 3 - Form1.bd.Caption = "3 - 9600 bps" - Case 4 - Form1.bd.Caption = "4 - 19200 bps" - Case 5 - Form1.bd.Caption = "5 - 38400 bps" - Case 6 - Form1.bd.Caption = "6 - 57600 bps" - Case 7 - Form1.bd.Caption = "7 - 115200 bps" - Case Default - Form1.bd.Caption = "0x" & Hex(i) & " - Unknwon..." - End Select - xbeesend con, "CH" - Case "CH" - t = Hex(pkt.data(0)) - If (Len(t) < 2) Then t = "0" & t - Form1.ch.Caption = "0x" & t - xbeesend con, "DH" - Case "DH" - t = Hex(pkt.data(3)) - If (Len(t) < 2) Then t = "0" & t - t = Hex(pkt.data(2)) & t - If (Len(t) < 4) Then t = "0" & t - t = Hex(pkt.data(1)) & t - If (Len(t) < 6) Then t = "0" & t - t = Hex(pkt.data(0)) & t - If (Len(t) < 8) Then t = "0" & t - Form1.dh.Caption = "0x" & t - xbeesend con, "DL" - Case "DL" - t = Hex(pkt.data(3)) - If (Len(t) < 2) Then t = "0" & t - t = Hex(pkt.data(2)) & t - If (Len(t) < 4) Then t = "0" & t - t = Hex(pkt.data(1)) & t - If (Len(t) < 6) Then t = "0" & t - t = Hex(pkt.data(0)) & t - If (Len(t) < 8) Then t = "0" & t - Form1.dl.Caption = "0x" & t - xbeesend con, "IA" - Case "IA" - t = Hex(pkt.data(7)) & t - If (Len(t) < 2) Then t = "0" & t - t = Hex(pkt.data(6)) & t - If (Len(t) < 4) Then t = "0" & t - t = Hex(pkt.data(5)) & t - If (Len(t) < 6) Then t = "0" & t - t = Hex(pkt.data(4)) & t - If (Len(t) < 8) Then t = "0" & t - t = Hex(pkt.data(3)) & t - If (Len(t) < 10) Then t = "0" & t - t = Hex(pkt.data(2)) & t - If (Len(t) < 12) Then t = "0" & t - t = Hex(pkt.data(1)) & t - If (Len(t) < 14) Then t = "0" & t - t = Hex(pkt.data(0)) & t - If (Len(t) < 16) Then t = "0" & t - Form1.ia.Caption = "0x" & t - xbeesend con, "HV" - Case "HV" - t = Hex(pkt.data(1)) - If (Len(t) < 2) Then t = "0" & t - t = Hex(pkt.data(0)) & t - If (Len(t) < 4) Then t = "0" & t - Form1.hv.Caption = "0x" & t - xbeesend con, "VR" - Case "VR" - t = Hex(pkt.data(1)) - If (Len(t) < 2) Then t = "0" & t - t = Hex(pkt.data(0)) & t - If (Len(t) < 4) Then t = "0" & t - Form1.vr.Caption = "0x" & t - If con = atcon Then - xbee_attachCallback con, AddressOf localCB - End If - setButtons True - Form1.nodelist.Enabled = True - Form1.tmr_refresh.Enabled = True - Form1.tmr_timeout.Enabled = False - Case Else - If con = atcon Then - xbee_attachCallback con, AddressOf localCB - End If - setButtons True - Form1.nodelist.Enabled = True - Form1.tmr_refresh.Enabled = True - Form1.tmr_timeout.Enabled = False - End Select -End Function - -Public Function localCB(ByVal con As Long, ByRef pkt As xbee_pkt) As Long - Dim nodeinfo As String - Dim nodename As String - Dim tmp As String - Dim tmp2() As String - Dim sh, sl As String - Dim i, m As Integer - Dim AT As String - Form1.tmr_timeout.Enabled = False - AT = ArrayToString(pkt.atCmd) - ' handle initial stuff - Select Case AT - Case "MY" - nodeinfo = "0x" - tmp = Hex(pkt.data(0)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - tmp = Hex(pkt.data(1)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - If Form1.nodelist.ListCount > 0 Then - Form1.nodelist.List(0) = nodeinfo - Else - Form1.nodelist.AddItem nodeinfo - End If - ' issue next command - xbeesend con, "SH" - Case "SH" - nodeinfo = Form1.nodelist.List(0) & " 0x" - tmp = Hex(pkt.data(0)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - tmp = Hex(pkt.data(1)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - tmp = Hex(pkt.data(2)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - tmp = Hex(pkt.data(3)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - Form1.nodelist.List(0) = nodeinfo - ' issue next command - xbeesend con, "SL" - Case "SL" - nodeinfo = Form1.nodelist.List(0) & " 0x" - tmp = Hex(pkt.data(0)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - tmp = Hex(pkt.data(1)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - tmp = Hex(pkt.data(2)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - tmp = Hex(pkt.data(3)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - nodeinfo = nodeinfo & tmp - Form1.nodelist.List(0) = nodeinfo - ' issue next command - xbeesend con, "NI" - Case "NI" - nodeinfo = Form1.nodelist.List(0) & " -***dB * " - tmp = ArrayToString(pkt.data) - nodeinfo = nodeinfo & tmp - Form1.nodelist.List(0) = nodeinfo - ' issue next command - xbeesend con, "ND" - End Select - - If (AT <> "ND") Then Exit Function - If (pkt.status <> 0) Then - MsgBox "An error occured when attempting to scan!", vbCritical - Exit Function - End If - - If (pkt.datalen = 0) Then - ' increment the counter for each node - For i = 0 To Form1.nodelist.ListCount - 1 - tmp2 = Split(Form1.nodelist.List(i), " ") - If tmp2(4) <> "+" And tmp2(4) <> "*" Then - tmp2(4) = CInt(tmp2(4)) + 1 - If (CInt(tmp2(4)) > 9) Then tmp2(4) = "+" - End If - tmp = "" - For m = LBound(tmp2) To UBound(tmp2) - If m > 0 Then tmp = tmp & " " - tmp = tmp & tmp2(m) - Next - Form1.nodelist.List(i) = tmp - Next - - ' restart the refresh timer - Form1.tmr_refresh.Enabled = True - Exit Function - End If - - ' extract the 16-bit address - nodeinfo = "" - tmp = Hex(pkt.data(1)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - tmp = Hex(pkt.data(0)) & tmp - If (Len(tmp) < 4) Then tmp = "0" & tmp - tmp = "0x" & tmp - nodeinfo = nodeinfo & tmp - - nodeinfo = nodeinfo & " " - - ' extract the high portion of the 64-bit address - nodeinfo = nodeinfo - tmp = Hex(pkt.data(5)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - tmp = Hex(pkt.data(4)) & tmp - If (Len(tmp) < 4) Then tmp = "0" & tmp - tmp = Hex(pkt.data(3)) & tmp - If (Len(tmp) < 6) Then tmp = "0" & tmp - tmp = Hex(pkt.data(2)) & tmp - If (Len(tmp) < 8) Then tmp = "0" & tmp - tmp = "0x" & tmp - nodeinfo = nodeinfo & tmp - sh = tmp - - nodeinfo = nodeinfo & " " - - ' extract the low portion of the 64-bit address - nodeinfo = nodeinfo - tmp = Hex(pkt.data(9)) - If (Len(tmp) < 2) Then tmp = "0" & tmp - tmp = Hex(pkt.data(8)) & tmp - If (Len(tmp) < 4) Then tmp = "0" & tmp - tmp = Hex(pkt.data(7)) & tmp - If (Len(tmp) < 6) Then tmp = "0" & tmp - tmp = Hex(pkt.data(6)) & tmp - If (Len(tmp) < 8) Then tmp = "0" & tmp - tmp = "0x" & tmp - nodeinfo = nodeinfo & tmp - sl = tmp - - nodeinfo = nodeinfo & " " - - ' extract the rssi (signal strength) - tmp = "-" & CStr(pkt.data(10)) - If Len(tmp) < 3 Then tmp = " " & tmp - If Len(tmp) < 4 Then tmp = " " & tmp - tmp = tmp & "dB" - nodeinfo = nodeinfo & tmp - - nodeinfo = nodeinfo & " " - ' add a number of scans - nodeinfo = nodeinfo & 0 - - nodeinfo = nodeinfo & " " - - ' extract the node name - nodename = ArrayToString(pkt.data, 11) - nodeinfo = nodeinfo & nodename - - ' see if we have already got this node - For i = 0 To Form1.nodelist.ListCount - 1 - tmp2 = Split(Form1.nodelist.List(i), " ") - If tmp2(1) = sh And tmp2(2) = sl Then - Form1.nodelist.List(i) = nodeinfo - Exit Function - End If - Next - - ' otherwise add the info to the list - Form1.nodelist.AddItem nodeinfo -End Function diff --git a/libs/thirdParty/libxbee/sample/vb6/talk_to_me/talk_to_me.vbp b/libs/thirdParty/libxbee/sample/vb6/talk_to_me/talk_to_me.vbp deleted file mode 100644 index a80cc9bf2..000000000 --- a/libs/thirdParty/libxbee/sample/vb6/talk_to_me/talk_to_me.vbp +++ /dev/null @@ -1,33 +0,0 @@ -Type=Exe -Form=Form1.frm -Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation -Module=libxbee; ..\libxbee.bas -Module=Module1; talk_to_me.bas -IconForm="Form1" -Startup="Form1" -ExeName32="talk_to_me.exe" -Command32="" -Name="Project1" -HelpContextID="0" -CompatibleMode="0" -MajorVer=1 -MinorVer=0 -RevisionVer=0 -AutoIncrementVer=0 -ServerSupportFiles=0 -VersionCompanyName="Microsoft" -CompilationType=0 -OptimizationType=0 -FavorPentiumPro(tm)=0 -CodeViewDebugInfo=0 -NoAliasing=0 -BoundsCheck=0 -OverflowCheck=0 -FlPointCheck=0 -FDIVCheck=0 -UnroundedFP=0 -StartMode=0 -Unattended=0 -Retained=0 -ThreadPerObject=0 -MaxNumberOfThreads=1 diff --git a/libs/thirdParty/libxbee/sample/xbee2_rx.c b/libs/thirdParty/libxbee/sample/xbee2_rx.c deleted file mode 100644 index 223ddcf63..000000000 --- a/libs/thirdParty/libxbee/sample/xbee2_rx.c +++ /dev/null @@ -1,60 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -g -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample demonstrates how to communicate using series 2 radios */ - -#include -#include -#include -#include - -void callback(xbee_con *con, xbee_pkt *pkt) { - int ret; - /* print the recieved data */ - printf("Rx: %s\n",pkt->data); -} - -int main(int argc, char *argv[]) { - union { - unsigned char as8[8]; - unsigned int as32[2]; - } addr; - xbee_con *rCon; - xbee_pkt *pkt; - - xbee_setuplog("/dev/ttyUSB1",57600, 2); - - rCon = xbee_newcon('#', xbee2_data, 0x13A200, 0x403302B1); - rCon->waitforACK = 1; - rCon->callback = callback; - - for (;;) { - sleep(60); - } - - /* calling xbee_end() will return the xbee to its previous API mode */ - xbee_end(); - return 0; -} diff --git a/libs/thirdParty/libxbee/sample/xbee2_tx.c b/libs/thirdParty/libxbee/sample/xbee2_tx.c deleted file mode 100644 index db49fe6fa..000000000 --- a/libs/thirdParty/libxbee/sample/xbee2_tx.c +++ /dev/null @@ -1,54 +0,0 @@ -#ifdef shell -gcc -o ${0//.c/} $0 -lxbee -g -exit -} -#endif -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this sample demonstrates how to communicate using series 2 radios */ - -#include -#include -#include -#include - -int main(int argc, char *argv[]) { - union { - unsigned char as8[8]; - unsigned int as32[2]; - } addr; - xbee_con *rCon; - xbee_pkt *pkt; - - xbee_setuplog("/dev/ttyUSB0",57600, 2); - - rCon = xbee_newcon('#', xbee2_data, 0x13A200, 0x403302BF); - - for (;;) { - xbee_senddata(rCon, "Hello!"); - printf("Sent!\n"); - sleep(1); - } - - /* calling xbee_end() will return the xbee to its previous API mode */ - xbee_end(); - return 0; -} diff --git a/libs/thirdParty/libxbee/umakefile b/libs/thirdParty/libxbee/umakefile deleted file mode 100644 index 597a32377..000000000 --- a/libs/thirdParty/libxbee/umakefile +++ /dev/null @@ -1,91 +0,0 @@ -#-- uncomment this to enable debugging -#DEBUG:=-g -DDEBUG - -#-- what compiler are you using? -CC:=gcc - - -###### YOU SHOULD NOT CHANGE BELOW THIS LINE ###### - -VERSION:=1.4.0 -SRCS:=api.c - -CFLAGS:=-Wall -Wstrict-prototypes -Wno-variadic-macros -pedantic -c -fPIC ${DEBUG} -CLINKS:=-lpthread -lrt ${DEBUG} -DEFINES:=-D__UMAKEFILE - -SRCS:=${sort ${SRCS}} - -.PHONY: all run new clean main - - -# all - do everything (default) # -all: ./lib/libxbee.so.$(VERSION) main - @echo "*** Done! ***" - - -# run - remake main and then run # -run: main - ./bin/main - - -# new - clean and do everything again # -new: clean all - - -# clean - remove any compiled files and PDFs # -clean: - rm -f ./*~ - rm -f ./sample/*~ - rm -f ./obj/*.o - rm -f ./lib/libxbee.so* - rm -f ./bin/main - -# install - installs library # -install: /usr/lib/libxbee.so.$(VERSION) /usr/include/xbee.h - -/usr/lib/libxbee.so.$(VERSION): ./lib/libxbee.so.$(VERSION) - cp ./lib/libxbee.so.$(VERSION) /usr/lib/libxbee.so.$(VERSION) -f - @chmod 755 /usr/lib/libxbee.so.$(VERSION) - @chown root:root /usr/lib/libxbee.so.$(VERSION) - ln ./libxbee.so.$(VERSION) /usr/lib/libxbee.so.1 -sf - @chown root:root /usr/lib/libxbee.so.1 - ln ./libxbee.so.$(VERSION) /usr/lib/libxbee.so -sf - @chown root:root /usr/lib/libxbee.so - -/usr/include/xbee.h: ./xbee.h - cp ./xbee.h /usr/include/xbee.h -f - @chmod 644 /usr/include/xbee.h - @chown root:root /usr/include/xbee.h - -uninstall: - rm /usr/lib/libxbee.so.$(VERSION) -f - rm /usr/lib/libxbee.so.1 -f - rm /usr/lib/libxbee.so -f - rm /usr/include/xbee.h -f - -# main - compile & link objects # -main: ./bin/main - -./bin/main: ./obj/api.o ./bin/ ./main.c - ${CC} ${CLINKS} ./main.c ./obj/api.o -o ./bin/main ${DEBUG} - -./bin/: - mkdir ./bin/ - -./lib/libxbee.so.$(VERSION): ./lib/ ${addprefix ./obj/,${SRCS:.c=.o}} ./xbee.h - gcc -shared -Wl,-soname,libxbee.so.1 -o ./lib/libxbee.so.$(VERSION) ./obj/*.o -lrt - ln ./libxbee.so.$(VERSION) ./lib/libxbee.so.1 -sf - ln ./libxbee.so.$(VERSION) ./lib/libxbee.so -sf - -./lib/: - mkdir ./lib/ - -./obj/: - mkdir ./obj/ - -./obj/%.o: ./obj/ %.c %.h xbee.h - ${CC} ${CFLAGS} ${DEFINES} ${DEBUG} $*.c -o $@ - -./obj/%.o: ./obj/ %.c xbee.h - ${CC} ${CFLAGS} ${DEFINES} ${DEBUG} $*.c -o $@ diff --git a/libs/thirdParty/libxbee/win32.README.txt b/libs/thirdParty/libxbee/win32.README.txt deleted file mode 100644 index f16dc0d94..000000000 --- a/libs/thirdParty/libxbee/win32.README.txt +++ /dev/null @@ -1,31 +0,0 @@ -Welcome to libxbee! - -I have proveded sample code in the ./sample directory. Hopefully this will help -get you up and running with libxbee. If you would like samples showing a different -aspect of libxbee, then please do not hesitate to file an 'issue' on the project -site, and I will get to it ASAP: - http://code.google.com/p/libxbee/issues/list - - -Documentation is avaliable as HTML in the 'doc' folder. - - -Please note that this project is still in development, so should not be used for -any purpose other than learning/playing/testing etc... Basically don't use it to -make money, and then hold me responsible if it breaks! - -Feel free to contact me directly with any queries: - attie@attie.co.uk - - -=== Compiling & Using === - -To compile you must: - 1) Have Visual C++ 2008 (v9.0) installed (Express or otherwise) - 2) Have make installed - see GnuWin - 3) Modify win32.makefile so that the paths at the top are correct - -Compile using `make -f win32.makefile` from the command prompt - -For C/C++ (and probrably others) just include xbee.h and link with libxbee.dll -For VB6 see ./sample/vb6/ for more info & examples diff --git a/libs/thirdParty/libxbee/win32.makefile b/libs/thirdParty/libxbee/win32.makefile deleted file mode 100644 index d90965681..000000000 --- a/libs/thirdParty/libxbee/win32.makefile +++ /dev/null @@ -1,48 +0,0 @@ -#-- uncomment this to enable debugging -#DEBUG:=/Zi /DDEBUG /MTd -#LDBUG:=/DEBUG - -#-- you may need to edit these lines if your installation is different -VCPath:=C:\Program Files\Microsoft Visual Studio 10.0\VC -SDKPath:=C:\Program Files\Microsoft SDKs\Windows\v7.1 - -#!! if using visual studio 2010, you may need to run the following in a shell, -# and then within the same shell run `make -f win32.makefile` -# C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat - -###### YOU SHOULD NOT CHANGE BELOW THIS LINE ###### -SHELL:=cmd -DEBUG?=/MT - -SRCS:=api.c - -CC:="${VCPath}\bin\cl.exe" -LINK:="${VCPath}\bin\link.exe" -RC:="${SDKPath}\bin\rc.exe" - -.PHONY: all new clean - -all: .\lib\libxbee.dll - -new: clean all - -clean: - -rmdir /Q /S lib - -rmdir /Q /S obj - -.\obj: - mkdir obj - -.\lib: - mkdir lib - -.\lib\libxbee.dll: .\lib .\obj\api.obj .\obj\win32.res - ${LINK} ${LDBUG} /nologo /DLL /MAP:lib\libxbee.map /DEF:xsys\win32.def \ - "/LIBPATH:${SDKPath}\Lib" "/LIBPATH:${VCPath}\lib" \ - /OUT:.\lib\libxbee.dll .\obj\api.obj .\obj\win32.res - -.\obj\api.obj: .\obj api.c api.h xbee.h - ${CC} ${DEBUG} /nologo "/I${SDKPath}\Include" "/I${VCPath}\include" /RTCs /Gz /c /Fd.\lib\libxbee.pdb /Fo.\obj\api.obj ${SRCS} - -.\obj\win32.res: .\xsys\win32.rc - ${RC} "/I${SDKPath}\Include" "/I${VCPath}\include" /n /fo.\obj\win32.res .\xsys\win32.rc diff --git a/libs/thirdParty/libxbee/xbee.h b/libs/thirdParty/libxbee/xbee.h deleted file mode 100644 index 61331d844..000000000 --- a/libs/thirdParty/libxbee/xbee.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ -#ifndef XBEE_H -#define XBEE_H - -#if !defined(__GNUC__) && !defined(_WIN32) -#error "This library is only currently compatible with Linux and Win32" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef __LIBXBEE_API_H -typedef void* xbee_hnd; -#endif - -#include - -#ifdef __GNUC__ /* ---- */ -#include -typedef pthread_mutex_t xbee_mutex_t; -typedef pthread_cond_t xbee_cond_t; -typedef pthread_t xbee_thread_t; -typedef sem_t xbee_sem_t; -typedef FILE* xbee_file_t; -#elif (defined(WIN32) || defined(_WIN32)) /* -------------- */ -#include -#define CALLTYPE __stdcall -#define CALLTYPEVA __cdecl -typedef HANDLE xbee_mutex_t; -typedef CONDITION_VARIABLE xbee_cond_t; -typedef HANDLE xbee_thread_t; -typedef HANDLE xbee_sem_t; -typedef HANDLE xbee_file_t; -#else -#error "Unknown operating system or compiler" -#endif /* ------------- */ - -#ifndef CALLTYPE -#define CALLTYPE -#endif - -#ifndef CALLTYPEVA -#define CALLTYPEVA -#endif - -enum xbee_types { - xbee_unknown, - - xbee_localAT, /* frame ID */ - xbee_remoteAT, - xbee_modemStatus, - xbee_txStatus, - - /* XBee Series 1 stuff */ - xbee_16bitRemoteAT, /* frame ID */ - xbee_64bitRemoteAT, /* frame ID */ - - xbee_16bitData, /* frame ID for ACKs */ - xbee_64bitData, /* frame ID for ACKs */ - - xbee_16bitIO, - xbee_64bitIO, - - /* XBee Series 2 stuff */ - xbee2_data, - xbee2_txStatus -}; -typedef enum xbee_types xbee_types; - -typedef struct xbee_sample xbee_sample; -struct xbee_sample { - /* X A5 A4 A3 A2 A1 A0 D8 D7 D6 D5 D4 D3 D2 D1 D0 */ - unsigned short IOmask; /* IO */ - /* X X X X X X X D8 D7 D6 D5 D4 D3 D2 D1 D0 */ - unsigned short IOdigital; /* IO */ - /* X X X X X D D D D D D D D D D D */ - unsigned short IOanalog[6]; /* IO */ -}; - -typedef struct xbee_pkt xbee_pkt; -struct xbee_pkt { - unsigned int sAddr64 : 1; /* yes / no */ - unsigned int dataPkt : 1; /* if no - AT packet */ - unsigned int txStatusPkt : 1; - unsigned int modemStatusPkt : 1; - unsigned int remoteATPkt : 1; - unsigned int IOPkt : 1; - unsigned int isBroadcastADR : 1; - unsigned int isBroadcastPAN : 1; - - unsigned char frameID; /* AT Status */ - unsigned char atCmd[2]; /* AT */ - - unsigned char status; /* AT Data Status */ /* status / options */ - unsigned char samples; - unsigned char RSSI; /* Data */ - - unsigned char Addr16[2]; /* AT Data */ - - unsigned char Addr64[8]; /* AT Data */ - - unsigned char data[128]; /* AT Data */ - - unsigned int datalen; - xbee_types type; - - xbee_pkt *next; - - xbee_sample IOdata[1]; /* this array can be extended by using a this trick: - p = calloc(sizeof(xbee_pkt) + (sizeof(xbee_sample) * (samples - 1))) */ -}; - -typedef struct xbee_con xbee_con; -struct xbee_con { - unsigned int tAddr64 : 1; - unsigned int atQueue : 1; /* queues AT commands until AC is sent */ - unsigned int txDisableACK : 1; - unsigned int txBroadcastPAN: 1; /* broadcasts to PAN */ - unsigned int destroySelf : 1; /* if set, the callback thread will destroy the connection - after all of the packets have been processed */ - unsigned int waitforACK : 1; /* waits for the ACK or NAK after transmission */ - unsigned int noFreeAfterCB : 1; /* prevents libxbee from free'ing the packet after the callback has completed */ - unsigned int __spare__ : 1; - xbee_types type; - unsigned char frameID; - unsigned char tAddr[8]; /* 64-bit 0-7 16-bit 0-1 */ - void *customData; /* can be used to store data related to this connection */ - void (CALLTYPE *callback)(xbee_con*,xbee_pkt*); /* call back function */ - void *callbackList; - xbee_mutex_t callbackmutex; - xbee_mutex_t callbackListmutex; - xbee_mutex_t Txmutex; - xbee_sem_t waitforACKsem; - volatile unsigned char ACKstatus; /* 255 = waiting, 0 = success, 1 = no ack, 2 = cca fail, 3 = purged */ - xbee_con *next; -}; - -int CALLTYPE xbee_setup(char *path, int baudrate); -int CALLTYPE xbee_setuplog(char *path, int baudrate, int logfd); -int CALLTYPE xbee_setupAPI(char *path, int baudrate, char cmdSeq, int cmdTime); -int CALLTYPE xbee_setuplogAPI(char *path, int baudrate, int logfd, char cmdSeq, int cmdTime); -xbee_hnd CALLTYPE _xbee_setup(char *path, int baudrate); -xbee_hnd CALLTYPE _xbee_setuplog(char *path, int baudrate, int logfd); -xbee_hnd CALLTYPE _xbee_setupAPI(char *path, int baudrate, char cmdSeq, int cmdTime); -xbee_hnd CALLTYPE _xbee_setuplogAPI(char *path, int baudrate, int logfd, char cmdSeq, int cmdTime); - -int CALLTYPE xbee_end(void); -int CALLTYPE _xbee_end(xbee_hnd xbee); - -void CALLTYPE xbee_logitf(char *format, ...); -void CALLTYPE _xbee_logitf(xbee_hnd xbee, char *format, ...); -void CALLTYPE xbee_logit(char *str); -void CALLTYPE _xbee_logit(xbee_hnd xbee, char *str); - -xbee_con * CALLTYPEVA xbee_newcon(unsigned char frameID, xbee_types type, ...); -xbee_con * CALLTYPEVA _xbee_newcon(xbee_hnd xbee, unsigned char frameID, xbee_types type, ...); -xbee_con * CALLTYPE _xbee_vnewcon(xbee_hnd xbee, unsigned char frameID, xbee_types type, va_list ap); - -void CALLTYPE xbee_purgecon(xbee_con *con); -void CALLTYPE _xbee_purgecon(xbee_hnd xbee, xbee_con *con); - -void CALLTYPE xbee_endcon2(xbee_con **con, int alreadyUnlinked); -void CALLTYPE _xbee_endcon2(xbee_hnd xbee, xbee_con **con, int alreadyUnlinked); -#define xbee_endcon(x) xbee_endcon2(&(x),0) -#define _xbee_endcon(xbee,x) _xbee_endcon2((xbee),&(x),0) - -int CALLTYPE xbee_nsenddata(xbee_con *con, char *data, int length); -int CALLTYPE _xbee_nsenddata(xbee_hnd xbee, xbee_con *con, char *data, int length); -int CALLTYPEVA xbee_senddata(xbee_con *con, char *format, ...); -int CALLTYPEVA _xbee_senddata(xbee_hnd xbee, xbee_con *con, char *format, ...); -int CALLTYPE xbee_vsenddata(xbee_con *con, char *format, va_list ap); -int CALLTYPE _xbee_vsenddata(xbee_hnd xbee, xbee_con *con, char *format, va_list ap); - -#if defined(WIN32) -/* oh and just 'cos windows has rubbish memory management rules... this too */ -void CALLTYPE xbee_free(void *ptr); -#endif /* ------------- */ - -xbee_pkt * CALLTYPE xbee_getpacket(xbee_con *con); -xbee_pkt * CALLTYPE _xbee_getpacket(xbee_hnd xbee, xbee_con *con); -xbee_pkt * CALLTYPE xbee_getpacketwait(xbee_con *con); -xbee_pkt * CALLTYPE _xbee_getpacketwait(xbee_hnd xbee, xbee_con *con); - -int CALLTYPE xbee_hasdigital(xbee_pkt *pkt, int sample, int input); -int CALLTYPE xbee_getdigital(xbee_pkt *pkt, int sample, int input); - -int CALLTYPE xbee_hasanalog(xbee_pkt *pkt, int sample, int input); -double CALLTYPE xbee_getanalog(xbee_pkt *pkt, int sample, int input, double Vref); - -const char * CALLTYPE xbee_svn_version(void); -const char * CALLTYPE xbee_build_info(void); - -void CALLTYPE xbee_listen_stop(xbee_hnd xbee); - -#ifdef __cplusplus -} /* cplusplus */ -#endif - -#endif diff --git a/libs/thirdParty/libxbee/xsys/README b/libs/thirdParty/libxbee/xsys/README deleted file mode 100644 index 48d392850..000000000 --- a/libs/thirdParty/libxbee/xsys/README +++ /dev/null @@ -1 +0,0 @@ -This directory contains cross-system support files. \ No newline at end of file diff --git a/libs/thirdParty/libxbee/xsys/linux.c b/libs/thirdParty/libxbee/xsys/linux.c deleted file mode 100644 index 768d5b3d4..000000000 --- a/libs/thirdParty/libxbee/xsys/linux.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* ################################################################# */ -/* ### Linux Code ################################################## */ -/* ################################################################# */ - -/* this file contains code that is used by Linux ONLY */ -#ifndef __GNUC__ -#error "This file should only be used on a Linux system" -#endif - -#include "linux.h" - -int init_serial(xbee_hnd xbee, int baudrate) { - struct flock fl; - struct termios tc; - speed_t chosenbaud; - - /* select the baud rate */ - switch (baudrate) { - case 1200: chosenbaud = B1200; break; - case 2400: chosenbaud = B2400; break; - case 4800: chosenbaud = B4800; break; - case 9600: chosenbaud = B9600; break; - case 19200: chosenbaud = B19200; break; - case 38400: chosenbaud = B38400; break; - case 57600: chosenbaud = B57600; break; - case 115200:chosenbaud = B115200; break; - default: - fprintf(stderr,"%s(): Unknown or incompatiable baud rate specified... (%d)\n",__FUNCTION__,baudrate); - return -1; - }; - - /* open the serial port as a file descriptor */ - if ((xbee->ttyfd = open(xbee->path,O_RDWR | O_NOCTTY | O_NONBLOCK)) == -1) { - xbee_perror("xbee_setup():open()"); - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - Xfree(xbee->path); - return -1; - } - - /* lock the file */ - fl.l_type = F_WRLCK | F_RDLCK; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - fl.l_pid = getpid(); - if (fcntl(xbee->ttyfd, F_SETLK, &fl) == -1) { - xbee_perror("xbee_setup():fcntl()"); - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - Xfree(xbee->path); - close(xbee->ttyfd); - return -1; - } - - /* open the serial port as a FILE* */ - if ((xbee->tty = fdopen(xbee->ttyfd,"r+")) == NULL) { - xbee_perror("xbee_setup():fdopen()"); - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - Xfree(xbee->path); - close(xbee->ttyfd); - return -1; - } - - /* flush the serial port */ - fflush(xbee->tty); - - /* disable buffering */ - setvbuf(xbee->tty,NULL,_IONBF,BUFSIZ); - - /* setup the baud rate and other io attributes */ - tcgetattr(xbee->ttyfd, &tc); - /* input flags */ - tc.c_iflag &= ~ IGNBRK; /* enable ignoring break */ - tc.c_iflag &= ~(IGNPAR | PARMRK); /* disable parity checks */ - tc.c_iflag &= ~ INPCK; /* disable parity checking */ - tc.c_iflag &= ~ ISTRIP; /* disable stripping 8th bit */ - tc.c_iflag &= ~(INLCR | ICRNL); /* disable translating NL <-> CR */ - tc.c_iflag &= ~ IGNCR; /* disable ignoring CR */ - tc.c_iflag &= ~(IXON | IXOFF); /* disable XON/XOFF flow control */ - /* output flags */ - tc.c_oflag &= ~ OPOST; /* disable output processing */ - tc.c_oflag &= ~(ONLCR | OCRNL); /* disable translating NL <-> CR */ - tc.c_oflag &= ~ OFILL; /* disable fill characters */ - /* control flags */ - tc.c_cflag |= CREAD; /* enable reciever */ - tc.c_cflag &= ~ PARENB; /* disable parity */ - tc.c_cflag &= ~ CSTOPB; /* disable 2 stop bits */ - tc.c_cflag &= ~ CSIZE; /* remove size flag... */ - tc.c_cflag |= CS8; /* ...enable 8 bit characters */ - tc.c_cflag |= HUPCL; /* enable lower control lines on close - hang up */ - /* local flags */ - tc.c_lflag &= ~ ISIG; /* disable generating signals */ - tc.c_lflag &= ~ ICANON; /* disable canonical mode - line by line */ - tc.c_lflag &= ~ ECHO; /* disable echoing characters */ - tc.c_lflag &= ~ ECHONL; /* ??? */ - tc.c_lflag &= ~ NOFLSH; /* disable flushing on SIGINT */ - tc.c_lflag &= ~ IEXTEN; /* disable input processing */ - /* control characters */ - memset(tc.c_cc,0,sizeof(tc.c_cc)); - /* i/o rates */ - cfsetspeed(&tc, chosenbaud); /* set i/o baud rate */ - tcsetattr(xbee->ttyfd, TCSANOW, &tc); - tcflow(xbee->ttyfd, TCOON|TCION); /* enable input & output transmission */ - - return 0; -} - -static int xbee_select(xbee_hnd xbee, struct timeval *timeout) { - fd_set fds; - - FD_ZERO(&fds); - FD_SET(xbee->ttyfd, &fds); - - return select(xbee->ttyfd+1, &fds, NULL, NULL, timeout); -} - -#define xbee_sem_wait1sec(a) xbee_sem_wait1sec2(&(a)) -static inline int xbee_sem_wait1sec2(xbee_sem_t *sem) { - struct timespec to; - clock_gettime(CLOCK_REALTIME,&to); - to.tv_sec++; - return sem_timedwait(sem,&to); -} diff --git a/libs/thirdParty/libxbee/xsys/linux.h b/libs/thirdParty/libxbee/xsys/linux.h deleted file mode 100644 index 886bbf5bf..000000000 --- a/libs/thirdParty/libxbee/xsys/linux.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this file contains code that is used by Linux ONLY */ -#ifndef __GNUC__ -#error "This file should only be used on a Linux system" -#endif - -/* ################################################################# */ -/* ### Linux Code ################################################## */ -/* ################################################################# */ - -#define xbee_thread_create(a,b,c) pthread_create(&(a),NULL,(void *(*)(void *))(b),(void *)(c)) -#define xbee_thread_cancel(a,b) pthread_cancel((a)) -#define xbee_thread_join(a) pthread_join((a),NULL) -#define xbee_thread_tryjoin(a) pthread_tryjoin_np((a),NULL) - -#define xbee_mutex_init(a) pthread_mutex_init(&(a),NULL) -#define xbee_mutex_destroy(a) pthread_mutex_destroy(&(a)) -#define xbee_mutex_lock(a) pthread_mutex_lock(&(a)) -#define xbee_mutex_trylock(a) pthread_mutex_trylock(&(a)) -#define xbee_mutex_unlock(a) pthread_mutex_unlock(&(a)) - -#define xbee_sem_init(a) sem_init(&(a),0,0) -#define xbee_sem_destroy(a) sem_destroy(&(a)) -#define xbee_sem_wait(a) sem_wait(&(a)) -#define xbee_sem_post(a) sem_post(&(a)) - -#define xbee_cond_init(a) pthread_cond_init(&(a),NULL) -#define xbee_cond_destroy(a) pthread_cond_destroy(&(a)) -#define xbee_cond_wait(a,b) pthread_cond_wait(&(a),&(b)) -#define xbee_cond_signal(a) pthread_cond_signal(&(a)) -#define xbee_cond_broadcast(a) pthread_cond_broadcast(&(a)) - -#define xbee_write(xbee,a,b) fwrite((a),1,(b),(xbee)->tty) -#define xbee_read(xbee,a,b) fread((a),1,(b),(xbee)->tty) -#define xbee_ferror(xbee) ferror((xbee)->tty) -#define xbee_feof(xbee) feof((xbee)->tty) -#define xbee_close(a) fclose((a)) - diff --git a/libs/thirdParty/libxbee/xsys/pdf/linux.c.pdf b/libs/thirdParty/libxbee/xsys/pdf/linux.c.pdf deleted file mode 100644 index 75a9a38b29af858ad4bb773704982d44fa400b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8394 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 diff --git a/libs/thirdParty/libxbee/xsys/pdf/win32.def.pdf b/libs/thirdParty/libxbee/xsys/pdf/win32.def.pdf deleted file mode 100644 index 99b0548e4d2703b57cf69ec0fde18166639f570e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3538 zcmb_fdvFuS8MkY~;{r_!A?4Yw)xk1Oq`T8wiX?2wmW`2Y;|F$ZAUT~@_F+jU->qy} zDQR$;LKs452-I#VEl?9?2m>L|Oexq7EiXfp))1g}rXc|`JVS^BA+$jE^zf4={K1W9 zy!-9<``+KTs~JVv4h5~$5Hk*4d2J)11r*@jiwLusbizP2ssTDoDJC794?zKt4j+SH zHe`7Zv|0%f36Sv<;dP-mdW3H32fw^_=kYyTFN|GTV67_~-&N4PYr`4TeFRNn9^L3T z{Wsl)#sBF%_^ZbZVZ*V{-~9RR_Ic(M5Bp;0n|D{%pFFTXrRO7CeaH8jQg-a#@lw)^ z+gD|08pkeiR!lvboICED(T&!Tzt1?F`Vc~# zb`tEo+_#@4CoR8Z+q3_jm$!N|?@YYf0k=&3@@VFk^7XHGq%N5r9&y3+$@@)W+r*@2 z&&<7bXv)*e%8b8TzHQX4xf#hfTb#rX3zKBerESb#UodUtt$^lWDAmo|Y%q zesEAqc6!Y8{O!V@d!GDf zk#E)h&nur8cW$grc{%gdIj&=u8#+(rJGZw@Yka=-<5qXeWA5rdtvTU5m$UY66%pEV zdzDOF5^Pw~_IGn+@2C0O8o%-&?t?=WV_D0rckEpZfSY%S^&Q=0SKf`0i#C1#o3oey zm33+I^!8b0v#0eo>1~!dudADGe0H(bp6T8E%8mJ_m%F!DO?dU*ingrglBQ!79g!!@ zU#^qyU94?+KJAnYsFl<`XU5v9XM!KrJW^fhA7S#Qt^2q09C;-FUfKDbA#vUMiI-n0 zy`G=;+g(|ag%|v%emsBa$%Z@s9aZ?q#PcxViPt?|NxdRShBwTU7n5dhHQv+d;PRU{;VT>(kilC)14?svPae$2xp%g4K z5BlmM;#ejc22!FCWJ$=4q^wE)VRI5elO+FNyu!x&JP#lwYSd6EILZPCg$IH6XD-H_ zh;zTy6)tCDcGGHu%4&^Qt9e#9$gs5#0XMAX0v7qTzqHE%=dsAkwJypPw8I)MFCxH_ zNI@wZsb!5G`7A48p2grIhl(&0RCuG8fC!+-T4eTOr$Z(&giT?8(2vs%!hT;sG=(kl zD8z)<5}A~PC=05!$SYh$0P(!9mP0_LG%9HYt$qr41;!5>c%c^1N}U{w6g*y2F|PEO zK)kcaYY+;WNV1`!LD`^I@Gjtd3QvwNRs=Y3No^_)}QcugtxaSYSAe@o= z`;OBXcixP7OfKHTc^k9w__3-eno`gz1*Iyb)F!RQq@pX$mV`biStR0I(%4Q9Yx44fpTT9z1cN?2&ZKH4am~rC zW_*Y^20;4#`hOu@C69TD2Bca!u00p#p}mj|&|896%}RGAIx zEWN{yb=y>GdyY+GG-TOqM!Qa{&(S$(o5T9u91El;nTQwxMH8f^DJ?N$MoyuF_#frn Bi5~y} diff --git a/libs/thirdParty/libxbee/xsys/pdf/win32.dll.c.pdf b/libs/thirdParty/libxbee/xsys/pdf/win32.dll.c.pdf deleted file mode 100644 index 97d7acb34cfe49904b5c08b6c227512fc8bc6048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7893 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 JFtam9{2yx~BG~`{ diff --git a/libs/thirdParty/libxbee/xsys/pdf/win32.rc.pdf b/libs/thirdParty/libxbee/xsys/pdf/win32.rc.pdf deleted file mode 100644 index 8ff8a7956bff9e4e4ff4b5cb33683835c635a36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4744 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 DyZfM7 diff --git a/libs/thirdParty/libxbee/xsys/win32.c b/libs/thirdParty/libxbee/xsys/win32.c deleted file mode 100644 index a05950a94..000000000 --- a/libs/thirdParty/libxbee/xsys/win32.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* ################################################################# */ -/* ### Win32 Code ################################################## */ -/* ################################################################# */ - -/* this file contains code that is used by Win32 ONLY */ -#ifndef _WIN32 -#error "This file should only be used on a Win32 system" -#endif - -#include "win32.h" -#include "win32.dll.c" - -static int init_serial(xbee_hnd xbee, int baudrate) { - int chosenbaud; - DCB tc; - int evtMask; - COMMTIMEOUTS timeouts; - - /* open the serial port */ - xbee->tty = CreateFile(TEXT(xbee->path), - GENERIC_READ | GENERIC_WRITE, - 0, /* exclusive access */ - NULL, /* default security attributes */ - OPEN_EXISTING, - FILE_FLAG_OVERLAPPED, - NULL); - if (xbee->tty == INVALID_HANDLE_VALUE) { - xbee_logS("Invalid file handle..."); - xbee_logE("Is the XBee plugged in and avaliable on the correct port?"); - xbee_mutex_destroy(xbee->conmutex); - xbee_mutex_destroy(xbee->pktmutex); - xbee_mutex_destroy(xbee->sendmutex); - Xfree(xbee->path); - return -1; - } - - GetCommState(xbee->tty, &tc); - tc.BaudRate = baudrate; - tc.fBinary = TRUE; - tc.fParity = FALSE; - tc.fOutxCtsFlow = FALSE; - tc.fOutxDsrFlow = FALSE; - tc.fDtrControl = DTR_CONTROL_DISABLE; - tc.fDsrSensitivity = FALSE; - tc.fTXContinueOnXoff = FALSE; - tc.fOutX = FALSE; - tc.fInX = FALSE; - tc.fErrorChar = FALSE; - tc.fNull = FALSE; - tc.fRtsControl = RTS_CONTROL_DISABLE; - tc.fAbortOnError = FALSE; - tc.ByteSize = 8; - tc.Parity = NOPARITY; - tc.StopBits = ONESTOPBIT; - SetCommState(xbee->tty, &tc); - - timeouts.ReadIntervalTimeout = MAXDWORD; - timeouts.ReadTotalTimeoutMultiplier = 0; - timeouts.ReadTotalTimeoutConstant = 0; - timeouts.WriteTotalTimeoutMultiplier = 0; - timeouts.WriteTotalTimeoutConstant = 0; - SetCommTimeouts(xbee->tty, &timeouts); - - SetCommMask(xbee->tty, EV_RXCHAR); - - return 0; -} - -/* a replacement for the linux select() function... for a serial port */ -static int xbee_select(xbee_hnd xbee, struct timeval *timeout) { - int evtMask = 0; - COMSTAT status; - int ret; - - for (;;) { - /* find out how many bytes are in the Rx buffer... */ - if (ClearCommError(xbee->tty,NULL,&status) && (status.cbInQue > 0)) { - /* if there is data... return! */ - return 1; /*status.cbInQue;*/ - } else if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0) { - /* if the timeout was 0 (return immediately) then return! */ - return 0; - } - - /* otherwise wait for an Rx event... */ - memset(&(xbee->ttyovrs),0,sizeof(OVERLAPPED)); - xbee->ttyovrs.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); - if (!WaitCommEvent(xbee->tty,&evtMask,&(xbee->ttyovrs))) { - if (GetLastError() == ERROR_IO_PENDING) { - DWORD timeoutval; - if (!timeout) { - /* behave like the linux function... if the timeout pointer was NULL - then wait indefinately */ - timeoutval = INFINITE; - } else { - /* Win32 doesn't give the luxury of microseconds and seconds... just miliseconds! */ - timeoutval = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000); - } - ret = WaitForSingleObject(xbee->ttyovrs.hEvent,timeoutval); - if (ret == WAIT_TIMEOUT) { - /* cause the WaitCommEvent() call to stop */ - SetCommMask(xbee->tty, EV_RXCHAR); - /* if a timeout occured, then return 0 */ - CloseHandle(xbee->ttyovrs.hEvent); - return 0; - } - } else { - return -1; - } - } - CloseHandle(xbee->ttyovrs.hEvent); - } - - /* always return -1 (error) for now... */ - return -1; -} - -/* this offers the same behavior as non-blocking I/O under linux */ -int xbee_write(xbee_hnd xbee, const void *ptr, size_t size) { - xbee->ttyeof = FALSE; - if (!WriteFile(xbee->tty, ptr, size, NULL, &(xbee->ttyovrw)) && - (GetLastError() != ERROR_IO_PENDING)) return 0; - if (!GetOverlappedResult(xbee->tty, &(xbee->ttyovrw), &(xbee->ttyw), TRUE)) { - if (GetLastError() == ERROR_HANDLE_EOF) xbee->ttyeof = TRUE; - return 0; - } - return xbee->ttyw; -} - -/* this offers the same behavior as non-blocking I/O under linux */ -int xbee_read(xbee_hnd xbee, void *ptr, size_t size) { - xbee->ttyeof = FALSE; - if (!ReadFile(xbee->tty, ptr, size, NULL, &(xbee->ttyovrr)) && - (GetLastError() != ERROR_IO_PENDING)) return 0; - if (!GetOverlappedResult(xbee->tty, &(xbee->ttyovrr), &(xbee->ttyr), TRUE)) { - if (GetLastError() == ERROR_HANDLE_EOF) xbee->ttyeof = TRUE; - return 0; - } - return xbee->ttyr; -} - -/* this is because Win32 has some weird memory management rules... - - the thread that allocated the memory, MUST free it... */ -void xbee_free(void *ptr) { - if (!ptr) return; - free(ptr); -} - -/* win32 equivalent of unix gettimeofday() */ -int gettimeofday(struct timeval *tv, struct timezone *tz) { - if (tv) { - struct _timeb timeb; - _ftime(&timeb); - tv->tv_sec = timeb.time; - tv->tv_usec = timeb.millitm * 1000; - } - /* ignore tz for now */ - return 0; -} - -/* ################################################################# */ -/* ### Helper Functions (Mainly for VB6 use) ####################### */ -/* ################################################################# */ - -/* enable the debug output to a custom file or fallback to stderr */ -int xbee_setupDebugAPI(char *path, int baudrate, char *logfile, char cmdSeq, int cmdTime) { - xbee_hnd xbee = NULL; - int fd, ret; - if ((fd = _open(logfile,_O_WRONLY | _O_CREAT | _O_TRUNC)) == -1) { - fd = 2; - } - ret = xbee_setuplogAPI(path,baudrate,fd,cmdSeq,cmdTime); - if (fd > 2) { /* close fd, as libxbee dup'ed it */ - //_close(fd); - } - if (!ret) { /* libxbee started correctly */ - xbee = default_xbee; - if (fd == -1) { - xbee_log("Error opening logfile '%s' (errno=%d)... using stderr instead!",logfile,errno); - } - } - return ret; -} -int xbee_setupDebug(char *path, int baudrate, char *logfile) { - return xbee_setupDebugAPI(path,baudrate,logfile,0,0); -} - -/* These silly little functions are required for VB6 - - it freaks out when you call a function that uses va_args... */ -xbee_con *xbee_newcon_simple(unsigned char frameID, xbee_types type) { - return xbee_newcon(frameID, type); -} -xbee_con *xbee_newcon_16bit(unsigned char frameID, xbee_types type, int addr) { - return xbee_newcon(frameID, type, addr); -} -xbee_con *xbee_newcon_64bit(unsigned char frameID, xbee_types type, int addrL, int addrH) { - return xbee_newcon(frameID, type, addrL, addrH); -} - -void xbee_enableACKwait(xbee_con *con) { - con->waitforACK = 1; -} -void xbee_disableACKwait(xbee_con *con) { - con->waitforACK = 0; -} - -void xbee_enableDestroySelf(xbee_con *con) { - con->destroySelf = 1; -} - -/* for vb6... it will send a message to the given hWnd which can in turn check for a packet */ -void xbee_callback(xbee_con *con, xbee_pkt *pkt) { - xbee_hnd xbee = default_xbee; - - if (!win32_hWnd) { - xbee_log("*** Cannot do callback! No hWnd set... ***"); - return; - } - if (!win32_MessageID) { - xbee_log("*** Cannot do callback! No MessageID set... ***"); - return; - } - - xbee_log("Callback message sent!"); - SendMessage(win32_hWnd, win32_MessageID, (int)con, (int)pkt); -} - -/* very simple C function to provide more functionality to VB6 */ -int xbee_runCallback(int(*func)(xbee_con*,xbee_pkt*), xbee_con *con, xbee_pkt *pkt) { - return func(con,pkt); -} - -void xbee_enableCallbacks(HWND hWnd, UINT uMsg) { - xbee_hnd xbee = default_xbee; - if (!win32_MessageID || win32_MessageID != uMsg) { - xbee_log("Configuring libxbee to use MessageID = 0x%08X", uMsg); - win32_MessageID = uMsg; - } - if (!win32_hWnd || win32_hWnd != hWnd) { - xbee_log("Configuring libxbee to use hWnd = 0x%08X", hWnd); - win32_hWnd = hWnd; - } -} - -void xbee_attachCallback(xbee_con *con) { - xbee_hnd xbee = default_xbee; - - /* setup the callback function */ - xbee_log("Setting callback for connection @ 0x%08X",con); - con->callback = xbee_callback; -} - -void xbee_detachCallback(xbee_con *con) { - xbee_hnd xbee = default_xbee; - - /* un-setup the callback function */ - xbee_log("Unsetting callback for connection @ 0x%08X",con); - con->callback = NULL; -} diff --git a/libs/thirdParty/libxbee/xsys/win32.def b/libs/thirdParty/libxbee/xsys/win32.def deleted file mode 100644 index 888040ee3..000000000 --- a/libs/thirdParty/libxbee/xsys/win32.def +++ /dev/null @@ -1,71 +0,0 @@ -LIBRARY libxbee - -EXPORTS - ver - DllMain - DllCanUnloadNow PRIVATE - DllRegisterServer PRIVATE - DllUnregisterServer PRIVATE - - xbee_free - - xbee_setup - _xbee_setup - xbee_setuplog - _xbee_setuplog - xbee_setupAPI - _xbee_setupAPI - xbee_setuplogAPI - _xbee_setuplogAPI - xbee_setupDebug - xbee_setupDebugAPI - - xbee_end - _xbee_end - xbee_listen_stop - - xbee_newcon - _xbee_newcon - xbee_newcon_simple - xbee_newcon_16bit - xbee_newcon_64bit - - xbee_enableACKwait - xbee_disableACKwait - xbee_enableDestroySelf - - xbee_enableCallbacks - xbee_attachCallback - xbee_detachCallback - xbee_runCallback - - xbee_endcon2 - _xbee_endcon2 - xbee_purgecon - _xbee_purgecon - - xbee_senddata - _xbee_senddata - xbee_nsenddata - _xbee_nsenddata - xbee_vsenddata - _xbee_vsenddata - - xbee_getpacket - _xbee_getpacket - xbee_getpacketwait - _xbee_getpacketwait - - xbee_hasanalog - xbee_getanalog - - xbee_hasdigital - xbee_getdigital - - xbee_svn_version - xbee_build_info - - xbee_logit - _xbee_logit - xbee_logitf - _xbee_logitf diff --git a/libs/thirdParty/libxbee/xsys/win32.dll.c b/libs/thirdParty/libxbee/xsys/win32.dll.c deleted file mode 100644 index 1a9ebcaa8..000000000 --- a/libs/thirdParty/libxbee/xsys/win32.dll.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* ################################################################# */ -/* ### Win32 DLL Code ############################################## */ -/* ################################################################# */ - -/* this file contains code that is used by Win32 ONLY */ -#ifndef _WIN32 -#error "This file should only be used on a Win32 system" -#endif - -int ver(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) { - char t[256]; - sprintf(t,"libxbee.dll\n%s\n%s",xbee_svn_version(),xbee_build_info()); - MessageBox(NULL, t, "libxbee Win32 DLL", MB_OK); - return 0; -} - -void xbee_UNLOADALL(void) { - while (default_xbee) { - _xbee_end(default_xbee); - } -} - -/* this gets called when the dll is loaded and unloaded... */ -BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) { - if (dwReason == DLL_PROCESS_DETACH) { - /* ensure that libxbee has been shut down nicely */ - xbee_UNLOADALL(); - } else if (dwReason == DLL_PROCESS_ATTACH || dwReason == DLL_THREAD_ATTACH) { - if (!glob_hModule) { - /* keep a handle on the module */ - glob_hModule = (HMODULE)hModule; - } - } - return TRUE; -} - -HRESULT DllCanUnloadNow(void) { - if (default_xbee) return 0; - return 1; -} - -/* ################################################################# */ -/* ### Win32 DLL COM Code ########################################## */ -/* ################################################################# */ - -/* this function is from this tutorial: - http://www.codeguru.com/Cpp/COM-Tech/activex/tutorials/article.php/c5567 */ -BOOL RegWriteKey(HKEY roothk, const char *lpSubKey, LPCTSTR val_name, - DWORD dwType, void *lpvData, DWORD dwDataSize) { - /* roothk: HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE, etc - lpSubKey: the key relative to 'roothk' - val_name: the key value name where the data will be written - dwType: REG_SZ,REG_BINARY, etc. - lpvData: a pointer to the data buffer - dwDataSize: the size of the data pointed to by lpvData */ - HKEY hk; - if (ERROR_SUCCESS != RegCreateKey(roothk,lpSubKey,&hk) ) return FALSE; - if (ERROR_SUCCESS != RegSetValueEx(hk,val_name,0,dwType,(CONST BYTE *)lpvData,dwDataSize)) return FALSE; - if (ERROR_SUCCESS != RegCloseKey(hk)) return FALSE; - return TRUE; -} - -/* this is used by the regsrv32 application */ -STDAPI DllRegisterServer(void) { - char key[MAX_PATH]; - char value[MAX_PATH]; - - wsprintf(key,"CLSID\\%s",dllGUID); - wsprintf(value,"%s",dlldesc); - RegWriteKey(HKEY_CLASSES_ROOT, key, NULL, REG_SZ, (void *)value, lstrlen(value)); - - wsprintf(key,"CLSID\\%s\\InprocServer32",dllGUID); - GetModuleFileName(glob_hModule,value,MAX_PATH); - RegWriteKey(HKEY_CLASSES_ROOT, key, NULL, REG_SZ, (void *)value, lstrlen(value)); - - wsprintf(key,"CLSID\\%s\\ProgId",dllGUID); - lstrcpy(value,dllid); - RegWriteKey(HKEY_CLASSES_ROOT, key, NULL, REG_SZ, (void *)value, lstrlen(value)); - - lstrcpy(key,dllid); - lstrcpy(value,dlldesc); - RegWriteKey(HKEY_CLASSES_ROOT, key, NULL, REG_SZ, (void *)value, lstrlen(value)); - - wsprintf(key,"%s\\CLSID",dllid); - RegWriteKey(HKEY_CLASSES_ROOT, key, NULL, REG_SZ, (void *)dllGUID, lstrlen(dllGUID)); - - return S_OK; -} - -/* this is used by the regsrv32 application */ -STDAPI DllUnregisterServer(void) { - char key[MAX_PATH]; - char value[MAX_PATH]; - - wsprintf(key,"%s\\CLSID",dllid); - RegDeleteKey(HKEY_CLASSES_ROOT,key); - - wsprintf(key,"%s",dllid); - RegDeleteKey(HKEY_CLASSES_ROOT,key); - - wsprintf(key,"CLSID\\%s\\InprocServer32",dllGUID); - RegDeleteKey(HKEY_CLASSES_ROOT,key); - - wsprintf(key,"CLSID\\%s\\ProgId",dllGUID); - RegDeleteKey(HKEY_CLASSES_ROOT,key); - - wsprintf(key,"CLSID\\%s",dllGUID); - RegDeleteKey(HKEY_CLASSES_ROOT,key); - - return S_OK; -} diff --git a/libs/thirdParty/libxbee/xsys/win32.h b/libs/thirdParty/libxbee/xsys/win32.h deleted file mode 100644 index 65f19f805..000000000 --- a/libs/thirdParty/libxbee/xsys/win32.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - libxbee - a C library to aid the use of Digi's Series 1 XBee modules - running in API mode (AP=2). - - Copyright (C) 2009 Attie Grande (attie@attie.co.uk) - - This program 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. - - This program 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 this program. If not, see . -*/ - -/* this file contains code that is used by Win32 ONLY */ -#ifndef _WIN32 -#error "This file should only be used on a Win32 system" -#endif - -/* ################################################################# */ -/* ### Win32 Code ################################################## */ -/* ################################################################# */ - -#pragma comment(lib, "Advapi32.lib") -#pragma comment(lib, "User32.lib") - -#define dllid "attie-co-uk.libxbee" -#define dlldesc "libxbee - XBee API Library" -/* libxbee's GUID is {7A6E25AA-ECB5-4370-87B5-A1D31840FE23} */ -#define dllGUID "{7A6E25AA-ECB5-4370-87B5-A1D31840FE23}" - -#define Win32Message() MessageBox(0,"Run xbee_setup() first!...","libxbee",MB_OK); - -HMODULE glob_hModule = NULL; - -/* this uses miliseconds not microseconds... */ -#define usleep(a) Sleep((a)/1000) - -#define xbee_thread_create(a,b,c) (((a) = CreateThread(NULL,0,(void *)(b),(void *)(c),0,NULL)) == NULL) -#define xbee_thread_cancel(a,b) TerminateThread((a),(b)) -#define xbee_thread_join(a) WaitForSingleObject((a),INFINITE) -#define xbee_thread_tryjoin(a) WaitForSingleObject((a),0) - -#define xbee_mutex_init(a) (((a) = CreateEvent(NULL,FALSE,TRUE,NULL)) == NULL) -#define xbee_mutex_destroy(a) CloseHandle((a)) -#define xbee_mutex_lock(a) WaitForSingleObject((a),INFINITE) -#define xbee_mutex_trylock(a) WaitForSingleObject((a),0) -#define xbee_mutex_unlock(a) SetEvent((a)) - -#define xbee_sem_init(a) (((a) = CreateEvent(NULL,FALSE,FALSE,NULL)) == NULL) -#define xbee_sem_destroy(a) CloseHandle((a)) -#define xbee_sem_wait(a) WaitForSingleObject((a),INFINITE) -#define xbee_sem_wait1sec(a) WaitForSingleObject((a),1000) -#define xbee_sem_post(a) SetEvent((a)) - -#define xbee_cond_init(a) InitializeConditionVariable(&(a)) -#define xbee_cond_destroy(a) -#define xbee_cond_wait(a,b) SleepConditionVariableCS(&(a),&(b),INFINITE) -#define xbee_cond_signal(a) WakeConditionVariable(&(a)) -#define xbee_cond_broadcast(a) WakeAllConditionVariable(&(a)) - -#define xbee_feof(a) (xbee->ttyeof) -#define xbee_ferror(a) (0) -#define xbee_close(a) (((a)==xbee->log)?fclose((a)):CloseHandle((a))) - -HWND win32_hWnd = 0; -UINT win32_MessageID = 0; diff --git a/libs/thirdParty/libxbee/xsys/win32.rc b/libs/thirdParty/libxbee/xsys/win32.rc deleted file mode 100644 index 80f7d33bc..000000000 --- a/libs/thirdParty/libxbee/xsys/win32.rc +++ /dev/null @@ -1,47 +0,0 @@ -/* more info: http://msdn.microsoft.com/en-us/library/aa381058(v=vs.85).aspx */ - -#define APSTUDIO_READONLY_SYMBOLS -#include "winresrc.h" -#undef APSTUDIO_READONLY_SYMBOLS - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) - -#ifdef _WIN32 -/* Englush (UK) */ -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK -#pragma code_page(1252) -#endif //_WIN32 - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,4,1,0 - FILEFLAGSMASK 0x00L - FILEFLAGS 0x00L - FILEOS 0x40004L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "Provides a simple interface for XBee radios" - VALUE "CompanyName", "attie.co.uk" - VALUE "FileDescription", "Provides a simple interface for XBee radios" - VALUE "InternalName", "libxbee" - VALUE "LegalCopyright", "Copyright (C) 2009 onwards Attie Grande" - VALUE "LegalTrademarks", "" - VALUE "OriginalFilename", "libxbee.dll" - VALUE "PrivateBuild", "" - VALUE "ProductName", "libxbee - http://code.google.com/p/libxbee/" - VALUE "ProductVersion", "v1.4.1" - VALUE "SpecialBuild", "" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x809, 1200 - END -END - - -#endif diff --git a/src/comm/HexSpinBox.cpp b/src/comm/HexSpinBox.cpp deleted file mode 100644 index 878e9409e..000000000 --- a/src/comm/HexSpinBox.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "HexSpinBox.h" - -#include - -HexSpinBox::HexSpinBox(QWidget *parent) - : QSpinBox(parent), validator(NULL) -{ - setRange(0, 0x7fffffff); - validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this); -} - -HexSpinBox::~HexSpinBox(void) -{ - if(this->validator) - { - delete this->validator; - this->validator = NULL; - } -} - -QValidator::State HexSpinBox::validate(QString &text, int &pos) const -{ - return validator->validate(text, pos); -} - -QString HexSpinBox::textFromValue(int value) const -{ - return QString::number(value, 16).toUpper(); -} - -int HexSpinBox::valueFromText(const QString &text) const -{ - bool ok; - return text.toInt(&ok, 16); -} \ No newline at end of file diff --git a/src/comm/HexSpinBox.h b/src/comm/HexSpinBox.h deleted file mode 100644 index 84703c95c..000000000 --- a/src/comm/HexSpinBox.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef HEXSPINBOX_H_ -#define HEXSPINBOX_H_ - -#include - -class QRegExpValidator; - -class HexSpinBox : public QSpinBox -{ - Q_OBJECT -public: - HexSpinBox(QWidget *parent = 0); - ~HexSpinBox(void); - -protected: - QValidator::State validate(QString &text, int &pos) const; - int valueFromText(const QString &text) const; - QString textFromValue(int value) const; - -private: - QRegExpValidator *validator; -}; - -#endif // HEXSPINBOX_H_ - diff --git a/src/comm/LinkConfiguration.h b/src/comm/LinkConfiguration.h index af6b79b4b..42a181bf4 100644 --- a/src/comm/LinkConfiguration.h +++ b/src/comm/LinkConfiguration.h @@ -53,12 +53,6 @@ public: #ifdef QGC_ENABLE_BLUETOOTH TypeBluetooth, ///< Bluetooth Link #endif -#if 0 - // TODO Below is not yet implemented - TypeForwarding, ///< Forwarding Link - TypeXbee, ///< XBee Proprietary Link - TypeOpal, ///< Opal-RT Link -#endif #ifdef QT_DEBUG TypeMock, ///< Mock Link for Unitesting #endif diff --git a/src/comm/XbeeLink.cpp b/src/comm/XbeeLink.cpp deleted file mode 100644 index c3a7b1537..000000000 --- a/src/comm/XbeeLink.cpp +++ /dev/null @@ -1,239 +0,0 @@ -#include -#include -#include -#include -#include -#include "XbeeLink.h" - -XbeeLink::XbeeLink(QString portName, int baudRate) : - m_xbeeCon(NULL), - m_portName(NULL), - m_portNameLength(0), - m_baudRate(baudRate), - m_connected(false), - m_addrHigh(0), - m_addrLow(0) -{ - - /* setup the xbee */ - this->setPortName(portName); -} - -XbeeLink::~XbeeLink() -{ - if(m_portName) - { - delete m_portName; - m_portName = NULL; - } - _disconnect(); -} - -QString XbeeLink::getPortName() const -{ - QString portName; - for(unsigned int i = 0;im_portNameLength;i++) - { - portName.append(this->m_portName[i]); - } - return portName; -} - -int XbeeLink::getBaudRate() const -{ - return this->m_baudRate; -} - -bool XbeeLink::setPortName(QString portName) -{ - bool reconnect(false); - if(this->m_connected) - { - _disconnect(); - reconnect = true; - } - if(m_portName) - { - delete m_portName; - m_portName = NULL; - } - QStringList list = portName.split(QRegExp("\\s+"),QString::SkipEmptyParts); - if(list.size()>0) - { - this->m_portNameLength = list[0].size()+1; - m_portName = new char[this->m_portNameLength]; - for(int i=0;im_portName[i]=list[0][i].toLatin1(); - } - this->m_portName[list[0].size()] = '\0'; - } - else - { - this->m_portNameLength = 1; - m_portName = new char[this->m_portNameLength]; - this->m_portName[0] = '\0'; - } - - bool retVal(true); - if(reconnect) - { - retVal = _connect(); - } - - return retVal; -} - -bool XbeeLink::setBaudRate(int rate) -{ - bool reconnect(false); - if(this->m_connected) - { - _disconnect(); - reconnect = true; - } - bool retVal(true); - this->m_baudRate = rate; - if(reconnect) - { - retVal = _connect(); - } - return retVal; -} - -QString XbeeLink::getName() const -{ - return this->m_name; -} - -bool XbeeLink::isConnected() const -{ - return this->m_connected; -} - -qint64 XbeeLink::getConnectionSpeed() const -{ - return this->m_baudRate; -} - -qint64 XbeeLink::getCurrentInDataRate() const -{ - return 0; -} - -qint64 XbeeLink::getCurrentOutDataRate() const -{ - return 0; -} - -bool XbeeLink::hardwareConnect() -{ - emit tryConnectBegin(true); - if(this->isConnected()) - { - _disconnect(); - } - if (*this->m_portName == '\0') - { - return false; - } - if (xbee_setupAPI(this->m_portName,this->m_baudRate,0x2B,0x3E8) == -1) - { - /* oh no... it failed */ - qDebug() <<"xbee_setup() failed...\n"; - emit tryConnectEnd(true); - return false; - } - this->m_xbeeCon = xbee_newcon('A',xbee2_data,0x13A200,0x403D0935); - emit tryConnectEnd(true); - this->m_connected = true; - emit connected(); - return true; -} - -bool XbeeLink::_connect(void) -{ - if (this->isRunning()) _disconnect(); - this->start(LowPriority); - return true; -} - -void XbeeLink::_disconnect(void) -{ - if(this->isRunning()) this->terminate(); //stop running the thread, restart it upon connect - - if(this->m_xbeeCon) - { - xbee_end(); - this->m_xbeeCon = NULL; - } - this->m_connected = false; - - emit disconnected(); -} - -void XbeeLink::_writeBytes(const QByteArray bytes) -{ - if(!xbee_nsenddata(this->m_xbeeCon,const_cast(bytes.data()),bytes.size())) // return value of 0 is successful written - { - _logOutputDataRate(bytes.size(), QDateTime::currentMSecsSinceEpoch()); - } - else - { - _disconnect(); - emit communicationError(tr("Link Error"), QString("Error on link: %1. Could not send data - link is disconnected!").arg(getName())); - } -} - -void XbeeLink::readBytes() -{ - xbee_pkt *xbeePkt; - xbeePkt = xbee_getpacketwait(this->m_xbeeCon); - if(!(NULL==xbeePkt)) - { - QByteArray data; - for(unsigned int i=0;i<=xbeePkt->datalen;i++) - { - data.push_back(xbeePkt->data[i]); - } - - _logInputDataRate(data.length(), QDateTime::currentMSecsSinceEpoch()); - emit bytesReceived(this, data); - } -} - -void XbeeLink::run() -{ - // Initialize the connection - if(this->hardwareConnect()) - { - // Qt way to make clear what a while(1) loop does - forever - { - this->readBytes(); - } - } -} - -bool XbeeLink::setRemoteAddressHigh(quint32 high) -{ - this->m_addrHigh = high; - return true; -} - -bool XbeeLink::setRemoteAddressLow(quint32 low) -{ - this->m_addrLow = low; - return true; -} - -/* -void CALLTYPE XbeeLink::portCallback(xbee_con *xbeeCon, xbee_pkt *XbeePkt) -{ - QByteArray buf; - for(quint8 i=0;idatalen;i++) - { - buf.push_back(XbeePkt->data[i]); - } - emit bytesReceived(this, buf); -}*/ diff --git a/src/comm/XbeeLink.h b/src/comm/XbeeLink.h deleted file mode 100644 index 02180dd25..000000000 --- a/src/comm/XbeeLink.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef _XBEELINK_H_ -#define _XBEELINK_H_ - -#include -#include -#include -#include -#include -#include -#include "XbeeLinkInterface.h" -#include -#include "CallConv.h" - -class XbeeLink : public XbeeLinkInterface -{ - Q_OBJECT - -public: - XbeeLink(QString portName = "", int baudRate=57600); - ~XbeeLink(); - -public: // virtual functions from XbeeLinkInterface - QString getPortName() const; - void requestReset() { } - int getBaudRate() const; - - // These are left unimplemented in order to cause linker errors which indicate incorrect usage of - // connect/disconnect on link directly. All connect/disconnect calls should be made through LinkManager. - bool connect(void); - bool disconnect(void); - -public slots: // virtual functions from XbeeLinkInterface - bool setPortName(QString portName); - bool setBaudRate(int rate); - bool setRemoteAddressHigh(quint32 high); - bool setRemoteAddressLow(quint32 low); - -public: - // virtual functions from LinkInterface - QString getName() const; - bool isConnected() const; - - // Extensive statistics for scientific purposes - qint64 getConnectionSpeed() const; - qint64 getCurrentOutDataRate() const; - qint64 getCurrentInDataRate() const; - -private slots: // virtual functions from LinkInterface - void _writeBytes(const QByteArray bytes); - -protected slots: // virtual functions from LinkInterface - void readBytes(); - -public: - void run(); // initiating the thread - -protected: - xbee_con *m_xbeeCon; - char *m_portName; - unsigned int m_portNameLength; - int m_baudRate; - bool m_connected; - QString m_name; - quint32 m_addrHigh; - quint32 m_addrLow; - -private: - // From LinkInterface - virtual bool _connect(void); - virtual void _disconnect(void); - - bool hardwareConnect(); - //void CALLTYPE portCallback(xbee_con *XbeeCon, xbee_pkt *XbeePkt); -}; - - -#endif // _XBEELINK_H_ diff --git a/src/comm/XbeeLinkInterface.h b/src/comm/XbeeLinkInterface.h deleted file mode 100644 index d359f579d..000000000 --- a/src/comm/XbeeLinkInterface.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef XBEELINKINTERFACE_H_ -#define XBEELINKINTERFACE_H_ - -#include -#include -#include - -class XbeeLinkInterface : public LinkInterface -{ - Q_OBJECT - -public: - virtual QString getPortName() const = 0; - virtual int getBaudRate() const = 0; - -public slots: - virtual bool setPortName(QString portName) = 0; - virtual bool setBaudRate(int rate) = 0; - virtual bool setRemoteAddressHigh(quint32 high) = 0; - virtual bool setRemoteAddressLow(quint32 low) = 0; - -signals: - void tryConnectBegin(bool toTrue); - void tryConnectEnd(bool toTrue); -}; - -#endif // XBEELINKINTERFACE_H_ diff --git a/src/ui/XbeeConfigurationWindow.cpp b/src/ui/XbeeConfigurationWindow.cpp deleted file mode 100644 index 847ab8e93..000000000 --- a/src/ui/XbeeConfigurationWindow.cpp +++ /dev/null @@ -1,444 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -//#include -#include -#endif - -#if defined (__APPLE__) && defined (__MACH__) -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __MWERKS__ -#define __CF_USE_FRAMEWORK_INCLUDES__ -#endif - - -#include - -#include -#include -#if defined(MAC_OS_X_VERSION_10_3) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_3) -#include -#endif -#include - -// Apple internal modems default to local echo being on. If your modem has local echo disabled, -// undefine the following macro. -#define LOCAL_ECHO - -#define kATCommandString "AT\r" - -#ifdef LOCAL_ECHO -#define kOKResponseString "AT\r\r\nOK\r\n" -#else -#define kOKResponseString "\r\nOK\r\n" -#endif -#endif - - -// Some helper functions for serial port enumeration -#if defined (__APPLE__) && defined (__MACH__) - -enum { - kNumRetries = 3 -}; - -// Function prototypes -static kern_return_t FindModems(io_iterator_t *matchingServices); -static kern_return_t GetModemPath(io_iterator_t serialPortIterator, char *bsdPath, CFIndex maxPathSize); - -// Returns an iterator across all known modems. Caller is responsible for -// releasing the iterator when iteration is complete. -static kern_return_t FindModems(io_iterator_t *matchingServices) -{ - kern_return_t kernResult; - CFMutableDictionaryRef classesToMatch; - - /*! @function IOServiceMatching - @abstract Create a matching dictionary that specifies an IOService class match. - @discussion A very common matching criteria for IOService is based on its class. IOServiceMatching will create a matching dictionary that specifies any IOService of a class, or its subclasses. The class is specified by C-string name. - @param name The class name, as a const C-string. Class matching is successful on IOService's of this class or any subclass. - @result The matching dictionary created, is returned on success, or zero on failure. The dictionary is commonly passed to IOServiceGetMatchingServices or IOServiceAddNotification which will consume a reference, otherwise it should be released with CFRelease by the caller. */ - - // Serial devices are instances of class IOSerialBSDClient - classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue); - if (classesToMatch == NULL) { - printf("IOServiceMatching returned a NULL dictionary.\n"); - } else { - /*! - @function CFDictionarySetValue - Sets the value of the key in the dictionary. - @param theDict The dictionary to which the value is to be set. If this - parameter is not a valid mutable CFDictionary, the behavior is - undefined. If the dictionary is a fixed-capacity dictionary and - it is full before this operation, and the key does not exist in - the dictionary, the behavior is undefined. - @param key The key of the value to set into the dictionary. If a key - which matches this key is already present in the dictionary, only - the value is changed ("add if absent, replace if present"). If - no key matches the given key, the key-value pair is added to the - dictionary. If added, the key is retained by the dictionary, - using the retain callback provided - when the dictionary was created. If the key is not of the sort - expected by the key retain callback, the behavior is undefined. - @param value The value to add to or replace into the dictionary. The value - is retained by the dictionary using the retain callback provided - when the dictionary was created, and the previous value if any is - released. If the value is not of the sort expected by the - retain or release callbacks, the behavior is undefined. - */ - CFDictionarySetValue(classesToMatch, - CFSTR(kIOSerialBSDTypeKey), - CFSTR(kIOSerialBSDModemType)); - - // Each serial device object has a property with key - // kIOSerialBSDTypeKey and a value that is one of kIOSerialBSDAllTypes, - // kIOSerialBSDModemType, or kIOSerialBSDRS232Type. You can experiment with the - // matching by changing the last parameter in the above call to CFDictionarySetValue. - - // As shipped, this sample is only interested in modems, - // so add this property to the CFDictionary we're matching on. - // This will find devices that advertise themselves as modems, - // such as built-in and USB modems. However, this match won't find serial modems. - } - - /*! @function IOServiceGetMatchingServices - @abstract Look up registered IOService objects that match a matching dictionary. - @discussion This is the preferred method of finding IOService objects currently registered by IOKit. IOServiceAddNotification can also supply this information and install a notification of new IOServices. The matching information used in the matching dictionary may vary depending on the class of service being looked up. - @param masterPort The master port obtained from IOMasterPort(). - @param matching A CF dictionary containing matching information, of which one reference is consumed by this function. IOKitLib can contruct matching dictionaries for common criteria with helper functions such as IOServiceMatching, IOOpenFirmwarePathMatching. - @param existing An iterator handle is returned on success, and should be released by the caller when the iteration is finished. - @result A kern_return_t error code. */ - - kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault, classesToMatch, matchingServices); - if (KERN_SUCCESS != kernResult) { - printf("IOServiceGetMatchingServices returned %d\n", kernResult); - goto exit; - } - -exit: - return kernResult; -} - -/** Given an iterator across a set of modems, return the BSD path to the first one. - * If no modems are found the path name is set to an empty string. - */ -static kern_return_t GetModemPath(io_iterator_t serialPortIterator, char *bsdPath, CFIndex maxPathSize) -{ - io_object_t modemService; - kern_return_t kernResult = KERN_FAILURE; - Boolean modemFound = false; - - // Initialize the returned path - *bsdPath = '\0'; - - // Iterate across all modems found. In this example, we bail after finding the first modem. - - while ((modemService = IOIteratorNext(serialPortIterator)) && !modemFound) { - CFTypeRef bsdPathAsCFString; - - // Get the callout device's path (/dev/cu.xxxxx). The callout device should almost always be - // used: the dialin device (/dev/tty.xxxxx) would be used when monitoring a serial port for - // incoming calls, e.g. a fax listener. - - bsdPathAsCFString = IORegistryEntryCreateCFProperty(modemService, - CFSTR(kIOCalloutDeviceKey), - kCFAllocatorDefault, - 0); - if (bsdPathAsCFString) { - Boolean result; - - // Convert the path from a CFString to a C (NUL-terminated) string for use - // with the POSIX open() call. - - result = CFStringGetCString((CFStringRef)bsdPathAsCFString, - bsdPath, - maxPathSize, - kCFStringEncodingUTF8); - CFRelease(bsdPathAsCFString); - - if (result) { - //printf("Modem found with BSD path: %s", bsdPath); - modemFound = true; - kernResult = KERN_SUCCESS; - } - } - - printf("\n"); - - // Release the io_service_t now that we are done with it. - - (void) IOObjectRelease(modemService); - } - - return kernResult; -} -#endif - -XbeeConfigurationWindow::XbeeConfigurationWindow(LinkInterface* link, QWidget *parent, Qt::WindowFlags flags): QWidget(parent, flags), - userConfigured(false) -{ - XbeeLinkInterface *xbeeLink = dynamic_cast(link); - - if(xbeeLink != 0) - { - this->link = xbeeLink; - - baudLabel = new QLabel; - baudLabel->setText(tr("Baut Rate")); - baudBox = new QComboBox; - baudLabel->setBuddy(baudBox); - portLabel = new QLabel; - portLabel->setText(tr("SerialPort")); - portBox = new QComboBox; - portBox->setEditable(true); - portLabel->setBuddy(portBox); - highAddrLabel = new QLabel; - highAddrLabel->setText(tr("Remote hex Address &High")); - highAddr = new HexSpinBox(this); - highAddrLabel->setBuddy(highAddr); - lowAddrLabel = new QLabel; - lowAddrLabel->setText(tr("Remote hex Address &Low")); - lowAddr = new HexSpinBox(this); - lowAddrLabel->setBuddy(lowAddr); - actionLayout = new QGridLayout; - actionLayout->addWidget(baudLabel,1,1); - actionLayout->addWidget(baudBox,1,2); - actionLayout->addWidget(portLabel,2,1); - actionLayout->addWidget(portBox,2,2); - actionLayout->addWidget(highAddrLabel,3,1); - actionLayout->addWidget(highAddr,3,2); - actionLayout->addWidget(lowAddrLabel,4,1); - actionLayout->addWidget(lowAddr,4,2); - tmpLayout = new QVBoxLayout; - tmpLayout->addStretch(); - tmpLayout->addLayout(actionLayout); - xbeeLayout = new QHBoxLayout; - xbeeLayout->addStretch(); - xbeeLayout->addLayout(tmpLayout); - this->setLayout(xbeeLayout); - - //connect(portBox,SIGNAL(activated(QString)),this,SLOT(setPortName(QString))); - //connect(baudBox,SIGNAL(activated(QString)),this,SLOT(setBaudRateString(QString))); - connect(portBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(setPortName(QString))); - connect(portBox,SIGNAL(editTextChanged(QString)),this,SLOT(setPortName(QString))); - connect(baudBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(setBaudRateString(QString))); - connect(highAddr,SIGNAL(valueChanged(int)),this,SLOT(addrChangedHigh(int))); - connect(lowAddr,SIGNAL(valueChanged(int)),this,SLOT(addrChangedLow(int))); - connect(this,SIGNAL(addrHighChanged(quint32)),xbeeLink,SLOT(setRemoteAddressHigh(quint32))); - connect(this,SIGNAL(addrLowChanged(quint32)),xbeeLink,SLOT(setRemoteAddressLow(quint32))); - - baudBox->addItem("1200",1200); - baudBox->addItem("2400",2400); - baudBox->addItem("4800",4800); - baudBox->addItem("9600",9600); - baudBox->addItem("19200",19200); - baudBox->addItem("38400",38400); - baudBox->addItem("57600",57600); - baudBox->setCurrentIndex(6); - - // try to open xbeeConf file for last remote address - QFile in("Xbeeconf.txt"); - if(in.open(QIODevice::ReadOnly)) - { - QDataStream inStr(&in); - int tmpaddrHigh; - int tmpaddrLow; - inStr >> tmpaddrHigh; - inStr >> tmpaddrLow; - highAddr->setValue(tmpaddrHigh); - lowAddr->setValue(tmpaddrLow); - } - else - { - highAddr->setValue(0x13A200); - lowAddr->setValue(0x40DDDDDD); - } - - - - this->setupPortList(); - - portCheckTimer = new QTimer(this); - portCheckTimer->setInterval(1000); - connect(portCheckTimer, SIGNAL(timeout()), this, SLOT(setupPortList())); - - // Display the widget - this->window()->setWindowTitle(tr("Xbee Communication Settings")); - } - else - { - qDebug() << "This is not a Xbee Link"; - } -} - -XbeeConfigurationWindow::~XbeeConfigurationWindow() -{ - -} - -void XbeeConfigurationWindow::setupPortList() -{ - #ifdef __linux - - // TODO Linux has no standard way of enumerating serial ports - // However the device files are only present when the physical - // device is connected, therefore listing the files should be - // sufficient. - - QString devdir = "/dev"; - QDir dir(devdir); - dir.setFilter(QDir::System); - - QFileInfoList list = dir.entryInfoList(); - for (int i = 0; i < list.size(); ++i) { - QFileInfo fileInfo = list.at(i); - if (fileInfo.fileName().contains(QString("ttyUSB")) || fileInfo.fileName().contains(QString("ttyS"))) { - if (portBox->findText(fileInfo.canonicalFilePath()) == -1) { - portBox->addItem(fileInfo.canonicalFilePath()); - if (!userConfigured) portBox->setEditText(fileInfo.canonicalFilePath()); - } - } - } -#endif - -#if defined (__APPLE__) && defined (__MACH__) - - // Enumerate serial ports - //int fileDescriptor; - kern_return_t kernResult; // on PowerPC this is an int (4 bytes) - - io_iterator_t serialPortIterator; - char bsdPath[MAXPATHLEN]; - - kernResult = FindModems(&serialPortIterator); - - kernResult = GetModemPath(serialPortIterator, bsdPath, sizeof(bsdPath)); - - IOObjectRelease(serialPortIterator); // Release the iterator. - - // Add found modems - if (bsdPath[0]) { - if (portBox->findText(QString(bsdPath)) == -1) { - portBox->addItem(QString(bsdPath)); - if (!userConfigured) portBox->setEditText(QString(bsdPath)); - } - } - - // Add USB serial port adapters - // TODO Strangely usb serial port adapters are not enumerated, even when connected - QString devdir = "/dev"; - QDir dir(devdir); - dir.setFilter(QDir::System); - - QFileInfoList list = dir.entryInfoList(); - for (int i = list.size() - 1; i >= 0; i--) { - QFileInfo fileInfo = list.at(i); - if (fileInfo.fileName().contains(QString("ttyUSB")) || fileInfo.fileName().contains(QString("ttyS")) || fileInfo.fileName().contains(QString("tty.usbserial"))) { - if (portBox->findText(fileInfo.canonicalFilePath()) == -1) { - portBox->addItem(fileInfo.canonicalFilePath()); - if (!userConfigured) portBox->setEditText(fileInfo.canonicalFilePath()); - } - } - } - - -#endif - -#ifdef _WIN32 - // Get the ports available on this system - QList ports = QSerialPortInfo::availablePorts(); - //QList ports = QextSerialEnumerator::getPorts(); - - // Add the ports in reverse order, because we prepend them to the list - for (int i = ports.size() - 1; i >= 0; i--) { - QString portString = QString(ports.at(i).portName().toLocal8Bit().constData()); - // Prepend newly found port to the list - if (portBox->findText(portString) == -1) { - portBox->insertItem(0, portString); - if (!userConfigured) portBox->setEditText(portString); - } - } - - //printf("port name: %s\n", ports.at(i).portName.toLocal8Bit().constData()); - //printf("friendly name: %s\n", ports.at(i).friendName.toLocal8Bit().constData()); - //printf("physical name: %s\n", ports.at(i).physName.toLocal8Bit().constData()); - //printf("enumerator name: %s\n", ports.at(i).enumName.toLocal8Bit().constData()); - //printf("===================================\n\n"); -#endif -} - -void XbeeConfigurationWindow::showEvent(QShowEvent* event) -{ - Q_UNUSED(event); - portCheckTimer->start(); -} - -void XbeeConfigurationWindow::hideEvent(QHideEvent* event) -{ - Q_UNUSED(event); - portCheckTimer->stop(); -} - -void XbeeConfigurationWindow::configureCommunication() -{ - this->setupPortList(); - this->show(); -} - -void XbeeConfigurationWindow::setPortName(QString port) -{ - link->setPortName(port); -} - -void XbeeConfigurationWindow::setBaudRateString(QString baud) -{ - int rate = baud.toInt(); - this->link->setBaudRate(rate); -} - -void XbeeConfigurationWindow::addrChangedHigh(int addr) -{ - quint32 uaddr = static_cast(addr); - QFile out("Xbeeconf.txt"); - if(out.open(QIODevice::WriteOnly)) - { - QDataStream outStr(&out); - outStr << this->highAddr->value(); - outStr << this->lowAddr->value(); - } - emit addrHighChanged(uaddr); -} - -void XbeeConfigurationWindow::addrChangedLow(int addr) -{ - quint32 uaddr = static_cast(addr); - QFile out("Xbeeconf.txt"); - if(out.open(QIODevice::WriteOnly)) - { - QDataStream outStr(&out); - outStr << this->highAddr->value(); - outStr << this->lowAddr->value(); - } - emit addrLowChanged(uaddr); -} diff --git a/src/ui/XbeeConfigurationWindow.h b/src/ui/XbeeConfigurationWindow.h deleted file mode 100644 index 1a6f233fd..000000000 --- a/src/ui/XbeeConfigurationWindow.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef _XBEECONFIGURATIONWINDOW_H_ -#define _XBEECONFIGURATIONWINDOW_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include"XbeeLinkInterface.h" -#include "HexSpinBox.h" - - -class XbeeConfigurationWindow : public QWidget -{ - Q_OBJECT - -public: - XbeeConfigurationWindow(LinkInterface* link, QWidget *parent = 0, Qt::WindowFlags flags = Qt::Sheet); - ~XbeeConfigurationWindow(); - -public slots: - void configureCommunication(); - void setPortName(QString port); - void setBaudRateString(QString baud); - void setupPortList(); - -private slots: - void addrChangedHigh(int addr); - void addrChangedLow(int addr); - -protected: - void showEvent(QShowEvent* event); - void hideEvent(QHideEvent* event); - bool userConfigured; ///< Switch to detect if current values are user-selected and shouldn't be overriden - -private: - QLabel *portLabel; - QLabel *baudLabel; - QComboBox *portBox; - QComboBox *baudBox; - QGridLayout *actionLayout; - QHBoxLayout *xbeeLayout; - QVBoxLayout *tmpLayout; - XbeeLinkInterface* link; - QTimer* portCheckTimer; - HexSpinBox* highAddr; - HexSpinBox* lowAddr; - QLabel* highAddrLabel; - QLabel* lowAddrLabel; - -signals: - void addrHighChanged(quint32 addrHigh); - void addrLowChanged(quint32 addrLow); -}; - - -#endif //_XBEECONFIGURATIONWINDOW_H_ -- 2.22.0