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 0f31a6e155..52e5de7fb6 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 94a9ed024d..0000000000 --- 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 a5dbbfe0f3..0000000000 --- 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 ef5923b568..0000000000 --- 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 692bd7b165..0000000000 --- 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 57b7f6a0c5..0000000000 --- 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 9990d7f2e3..0000000000 --- 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 7eaa6c2701..0000000000 --- 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 d7250a3cc4..0000000000 --- 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 1d046d7921..0000000000 --- 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 1883c3262e..0000000000 --- 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 2df9136221..0000000000 --- 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 45063f7736..0000000000 --- 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 e2c495c41a..0000000000 --- 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 9774f40817..0000000000 --- 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 7eaa6c2701..0000000000 --- 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 32f085b268..0000000000 --- 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 3da3c6f217..0000000000 --- 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 1859405aa7..0000000000 --- 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 31baf1c73b..0000000000 --- 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 5b69945a51..0000000000 --- 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 158f1857c9..0000000000 --- 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 16accc5713..0000000000 --- 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 801cbfaf90..0000000000 --- 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 5a9b7d948c..0000000000 --- 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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 J8UiCA1OP8M`cnV^ 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 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 BQB(i` diff --git a/libs/thirdParty/libxbee/lib/libxbee.map b/libs/thirdParty/libxbee/lib/libxbee.map deleted file mode 100644 index 6adaef145b..0000000000 --- a/libs/thirdParty/libxbee/lib/libxbee.map +++ /dev/null @@ -1,897 +0,0 @@ - libxbee - - Timestamp is 4e2eb2df (Tue Jul 26 14:28:15 2011) - - Preferred load address is 10000000 - - Start Length Name Class - 0001:00000000 00019a38H .text CODE - 0002:00000000 00000188H .idata$5 DATA - 0002:00000188 00000004H .CRT$XCA DATA - 0002:0000018c 00000004H .CRT$XCZ DATA - 0002:00000190 00000004H .CRT$XIA DATA - 0002:00000194 00000010H .CRT$XIC DATA - 0002:000001a4 00000004H .CRT$XIZ DATA - 0002:000001a8 00000004H .CRT$XPA DATA - 0002:000001ac 00000004H .CRT$XPX DATA - 0002:000001b0 00000004H .CRT$XPXA DATA - 0002:000001b4 00000004H .CRT$XPZ DATA - 0002:000001b8 00000004H .CRT$XTA DATA - 0002:000001bc 00000004H .CRT$XTZ DATA - 0002:000001c0 000022c0H .rdata DATA - 0002:00002480 0000000cH .rdata$sxdata DATA - 0002:0000248c 00000004H .rtc$IAA DATA - 0002:00002490 00000000H .rtc$IMZ DATA - 0002:00002490 00000004H .rtc$IZZ DATA - 0002:00002494 00000004H .rtc$TAA DATA - 0002:00002498 00000000H .rtc$TMZ DATA - 0002:00002498 00000004H .rtc$TZZ DATA - 0002:000024a0 0000049cH .xdata$x DATA - 0002:0000293c 0000003cH .idata$2 DATA - 0002:00002978 00000014H .idata$3 DATA - 0002:0000298c 00000188H .idata$4 DATA - 0002:00002b14 000006baH .idata$6 DATA - 0002:000031d0 000005a5H .edata DATA - 0003:00000000 000052f0H .data DATA - 0003:00005300 00001f44H .bss DATA - 0004:00000000 00000058H .rsrc$01 DATA - 0004:00000060 00000400H .rsrc$02 DATA - - Address Publics by Value Rva+Base Lib:Object - - 0000:00000000 __except_list 00000000 - 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 7dcacafa7e..0000000000 --- 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 11b9d3fa62..0000000000 --- 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 6bcb978f6f..0000000000 --- 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 37e7705044..0000000000 --- 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 5fd1de5127..0000000000 --- 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 e64ccedb26..0000000000 --- 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 e64ccedb26..0000000000 --- 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 f7bc1d0c72..0000000000 --- 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 4a0af65b50..0000000000 --- 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 a458e49602..0000000000 --- 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 402a3f266f..0000000000 --- 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 5557111123..0000000000 --- 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 5fd1de5127..0000000000 --- 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 2ec511278d..0000000000 --- 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 b36885d854..0000000000 --- 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 d5e269c13c..0000000000 --- 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 e64ccedb26..0000000000 --- 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 10296bb8c1..0000000000 --- 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 2628c46f71..0000000000 --- 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 56a5fcac56..0000000000 --- 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 56a5fcac56..0000000000 --- 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 56a5fcac56..0000000000 --- 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 b36885d854..0000000000 --- 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 5e56ab9ce3..0000000000 --- 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 cb2e1c923d..0000000000 --- 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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 teuSS4HiIPFGSAL&zE04*Yea5m< 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 diff --git a/libs/thirdParty/libxbee/pdf/api.h.pdf b/libs/thirdParty/libxbee/pdf/api.h.pdf deleted file mode 100644 index 43d99a493e1864ab981612be1960ae6e71117f56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11188 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 b7Ss%@me>W}wdyP7$ 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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 ZMt*TgVo?b=L0TA@8gQwqy863u0RWDHMpys< diff --git a/libs/thirdParty/libxbee/pdf/xbee.h.pdf b/libs/thirdParty/libxbee/pdf/xbee.h.pdf deleted file mode 100644 index a4ee0d754dea35167f2c622db520a173d2fcd0e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11925 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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 84069e39a2..0000000000 --- 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 cff70bf1ae..0000000000 --- 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 66946f1848..0000000000 --- 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 13afbe4169..0000000000 --- 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 9e48276b0f..0000000000 --- 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 4b0c9f6331..0000000000 --- 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 46db084f13..0000000000 --- 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 107f88f6e9..0000000000 --- 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 4546887f9e..0000000000 --- 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 d3360222cc..0000000000 --- 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 8ab776f127..0000000000 --- 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 26750988ab..0000000000 --- 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 fe13a7dfcb..0000000000 --- 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 4c7c6655bc..0000000000 --- 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 b1e51fd907..0000000000 --- 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 815e949e70..0000000000 --- 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 0875907f91..0000000000 --- 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 426a9df939..0000000000 --- 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 dc9f5f76d1..0000000000 --- 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 a80cc9bf25..0000000000 --- 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 223ddcf637..0000000000 --- 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 db49fe6fa6..0000000000 --- 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 597a32377f..0000000000 --- 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 f16dc0d94e..0000000000 --- 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 d909656817..0000000000 --- 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 61331d8443..0000000000 --- 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 48d3928505..0000000000 --- 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 768d5b3d4e..0000000000 --- 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 886bbf5bf1..0000000000 --- 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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 Dt6OS* diff --git a/libs/thirdParty/libxbee/xsys/pdf/linux.h.pdf b/libs/thirdParty/libxbee/xsys/pdf/linux.h.pdf deleted file mode 100644 index a4c65ae408966bc912ed72e08fc49c4edee516ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5205 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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 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 IuKsRZ04Ys}#{d8T diff --git a/libs/thirdParty/libxbee/xsys/pdf/win32.h.pdf b/libs/thirdParty/libxbee/xsys/pdf/win32.h.pdf deleted file mode 100644 index b844726f1a19607952831452b160be3896a412b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5959 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 diff --git a/libs/thirdParty/libxbee/xsys/win32.c b/libs/thirdParty/libxbee/xsys/win32.c deleted file mode 100644 index a05950a94b..0000000000 --- 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 888040ee38..0000000000 --- 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 1a9ebcaa85..0000000000 --- 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 65f19f805c..0000000000 --- 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 80f7d33bc4..0000000000 --- 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 878e9409e6..0000000000 --- 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 84703c95c7..0000000000 --- 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 af6b79b4b3..42a181bf48 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 c3a7b15379..0000000000 --- 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 02180dd254..0000000000 --- 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 d359f579d7..0000000000 --- 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 847ab8e93d..0000000000 --- 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 1a6f233fd0..0000000000 --- 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_ -- GitLab