aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTero Kontkanen <tero.kontkanen@granitedevices.fi>2017-02-23 00:57:24 +0200
committerTero Kontkanen <tero.kontkanen@granitedevices.fi>2017-02-23 01:01:09 +0200
commit8751d83576c4529607a02193585cff26e2e9f9ce (patch)
treecaa522f151681e58deaf3a710640dbc3a8aa55ac
parent81a6bba3d855f77b7185b99f77250d8572127d75 (diff)
parent77972a62d6d04b3a8b1ad2def67fef06a48b4da0 (diff)
downloadSimpleMotionV2-feature/BufferedMotionAPI.tar.gz
SimpleMotionV2-feature/BufferedMotionAPI.zip
Merge branch 'develop' into feature/BufferedMotionAPIfeature/BufferedMotionAPI
# Conflicts: # SimpleMotionV2.pri
-rw-r--r--LICENSE542
-rw-r--r--SimpleMotionV2.pri6
-rw-r--r--busdevice.c12
-rw-r--r--pcserialport.c209
-rw-r--r--pcserialport.h40
-rw-r--r--rs232.c366
-rw-r--r--rs232.h81
-rw-r--r--simplemotion.c47
-rw-r--r--simplemotion.h29
-rw-r--r--simplemotion_defs.h47
-rw-r--r--simplemotion_private.h17
-rw-r--r--smtest.c361
12 files changed, 559 insertions, 1198 deletions
diff --git a/LICENSE b/LICENSE
index ea5a3f2..f4f87bd 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,339 +1,203 @@
-GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) 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
-this service 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 make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. 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.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-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
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the 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 a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE 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.
-
- 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
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- SimpleMotion V2 library
- Copyright (C) 2013 GraniteDevices
-
- 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 2 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, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision 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, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- {signature of Ty Coon}, 1 April 1989
- Ty Coon, President of Vice
-
-This 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.
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ \ No newline at end of file
diff --git a/SimpleMotionV2.pri b/SimpleMotionV2.pri
index 9eeef0d..b5619bc 100644
--- a/SimpleMotionV2.pri
+++ b/SimpleMotionV2.pri
@@ -5,10 +5,10 @@ DEPENDPATH += $$PWD
DEFINES += SIMPLEMOTIONV2_LIBRARY
-SOURCES += $$PWD/sm_consts.c $$PWD/simplemotion.c $$PWD/busdevice.c $$PWD/rs232.c \
+SOURCES += $$PWD/sm_consts.c $$PWD/simplemotion.c $$PWD/busdevice.c $$PWD/pcserialport.c \
$$PWD/bufferedmotion.c
HEADERS += $$PWD/simplemotion_private.h\
- $$PWD/rs232.h $$PWD/busdevice.h $$PWD/simplemotion.h $$PWD/sm485.h $$PWD/simplemotion_defs.h \
- ../SimpleMotionV2Library/bufferedmotion.h
+ $$PWD/pcserialport.h $$PWD/busdevice.h $$PWD/simplemotion.h $$PWD/sm485.h $$PWD/simplemotion_defs.h \
+ $$PWD/bufferedmotion.h
diff --git a/busdevice.c b/busdevice.c
index 9bf82c8..c4f89a1 100644
--- a/busdevice.c
+++ b/busdevice.c
@@ -1,6 +1,6 @@
#include "busdevice.h"
-#include "rs232.h"
+#include "pcserialport.h"
#include <string.h>
#define BD_NONE 0
@@ -10,6 +10,8 @@
//how much bytes available in transmit buffer
#define TANSMIT_BUFFER_LENGTH 128
+unsigned long SMBusBaudrate=SM_BAUDRATE; //the next opened port (with smOpenBus) will be opened with the PBS defined here (default 460800 BPS)
+
typedef struct _SMBusDevice
{
//common
@@ -65,7 +67,7 @@ smbusdevicehandle smBDOpen( const char *devicename )
if(strncmp(devicename,"COM",3) == 0 || strncmp(devicename,"/dev/tty",8) == 0) //use rs232 lib
{
- BusDevice[handle].comPort=OpenComport( devicename, SM_BAUDRATE );
+ BusDevice[handle].comPort=serialPortOpen( devicename, SMBusBaudrate );
if( BusDevice[handle].comPort == -1 )
{
return -1; //failed to open
@@ -99,7 +101,7 @@ smbool smBDClose( const smbusdevicehandle handle )
if( BusDevice[handle].bdType==BD_RS )
{
- CloseComport( BusDevice[handle].comPort );
+ serialPortClose( BusDevice[handle].comPort );
BusDevice[handle].opened=smfalse;
return smtrue;
}
@@ -140,7 +142,7 @@ smbool smBDTransmit(const smbusdevicehandle handle)
if( BusDevice[handle].bdType==BD_RS )
{
- if(SendBuf(BusDevice[handle].comPort,BusDevice[handle].txBuffer, BusDevice[handle].txBufferUsed)==BusDevice[handle].txBufferUsed)
+ if(serialPortWriteBuffer(BusDevice[handle].comPort,BusDevice[handle].txBuffer, BusDevice[handle].txBufferUsed)==BusDevice[handle].txBufferUsed)
{
BusDevice[handle].txBufferUsed=0;
return smtrue;
@@ -164,7 +166,7 @@ smbool smBDRead( const smbusdevicehandle handle, smuint8 *byte )
if( BusDevice[handle].bdType==BD_RS )
{
int n;
- n=PollComport(BusDevice[handle].comPort, byte, 1);
+ n=serialPortRead(BusDevice[handle].comPort, byte, 1);
if( n!=1 ) return smfalse;
else return smtrue;
}
diff --git a/pcserialport.c b/pcserialport.c
new file mode 100644
index 0000000..792f079
--- /dev/null
+++ b/pcserialport.c
@@ -0,0 +1,209 @@
+/*
+ * pcserialport.h
+ *
+ * Header for PC serial port access library (win/linux)
+ *
+ * Created on: 28.12.2016
+ * Author: Tero
+ *
+ * Inspired by RS232 library by Teunis van Beelen
+ */
+
+
+
+#include "pcserialport.h"
+#include "simplemotion_private.h" //needed for timeout variable
+
+#ifdef __unix__
+
+#include <termios.h>
+#include <limits.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+smint32 serialPortOpen(const char * port_device_name, smint32 baudrate_bps)
+{
+ int port_handle;
+ int err;
+ int baudrateEnumValue;
+ struct termios new_port_settings;
+
+ switch(baudrate_bps)
+ {
+ case 9600 : baudrateEnumValue = B9600; break;
+ case 19200 : baudrateEnumValue = B19200; break;
+ case 38400 : baudrateEnumValue = B38400; break;
+ case 57600 : baudrateEnumValue = B57600; break;
+ case 115200 : baudrateEnumValue = B115200; break;
+ case 230400 : baudrateEnumValue = B230400; break;
+ case 460800 : baudrateEnumValue = B460800; break;
+ case 500000 : baudrateEnumValue = B500000; break;
+ case 576000 : baudrateEnumValue = B576000; break;
+ case 921600 : baudrateEnumValue = B921600; break;
+ case 1000000 : baudrateEnumValue = B1000000; break;
+ case 1115200 : baudrateEnumValue = B1152000; break;
+ case 1500000 : baudrateEnumValue = B1500000; break;
+ case 2000000 : baudrateEnumValue = B2000000; break;
+ case 2500000 : baudrateEnumValue = B2500000; break;
+ case 3000000 : baudrateEnumValue = B3000000; break;
+ case 3500000 : baudrateEnumValue = B3500000; break;
+ case 4000000 : baudrateEnumValue = B4000000; break;
+ default : smDebug(-1,Low,"Serial port error: unsupported baudrate\n");
+ return(1);
+ break;
+ }
+
+ port_handle = open(port_device_name, O_RDWR | O_NOCTTY );
+ if(port_handle==-1)
+ {
+ smDebug(-1, Low, "Serial port error: port open failed");
+ return(port_handle);
+ }
+
+ memset(&new_port_settings, 0, sizeof(new_port_settings)); //reset struct
+
+ new_port_settings.c_cflag = baudrateEnumValue | CS8 | CLOCAL | CREAD;
+ new_port_settings.c_iflag = IGNPAR;
+ new_port_settings.c_oflag = 0;
+ new_port_settings.c_lflag = 0;
+ new_port_settings.c_cc[VMIN] = 0; /* non blocking mode */
+ new_port_settings.c_cc[VTIME] = readTimeoutMs/100; /* timeout 100 ms steps */
+ err = tcsetattr(port_handle, TCSANOW, &new_port_settings);
+ if(err==-1)
+ {
+ close(port_handle);
+ smDebug(-1, Low, "Serial port error: failed to set port parameters");
+ return -1;
+ }
+ return port_handle;
+}
+
+
+smint32 serialPortRead(smint32 serialport_handle, smuint8 *buf, smint32 size)
+{
+ smint32 n;
+ if(size>4096) size = 4096;
+ n = read(serialport_handle, buf, size);
+ return n;
+}
+
+
+smint32 serialPortWrite(smint32 serialport_handle, unsigned char byte)
+{
+ smint32 n;
+ n = write(serialport_handle, &byte, 1);
+ if(n<0)
+ return 1;
+ return 0;
+}
+
+
+smint32 serialPortWriteBuffer(smint32 serialport_handle, unsigned char *buf, smint32 size)
+{
+ return(write(serialport_handle, buf, size));
+}
+
+
+void serialPortClose(smint32 serialport_handle)
+{
+ close(serialport_handle);
+}
+
+#else //windows: for API, see https://msdn.microsoft.com/en-us/library/ff802693.aspx
+
+#include <windows.h>
+#include <string.h>
+
+smint32 serialPortOpen(const char *port_device_name, smint32 baudrate_bps)
+{
+ char port_def_string[64], port_name[32];
+ HANDLE port_handle;
+
+ sprintf(port_def_string,"baud=%d data=8 parity=N stop=1", (int)baudrate_bps);
+ sprintf(port_name,"\\\\.\\%s",port_device_name);
+
+ port_handle = CreateFileA(port_name,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
+
+ if(port_handle==INVALID_HANDLE_VALUE)
+ {
+ smDebug( -1, Low, "Serial port error: Unable to create serial port handle");
+ return -1;
+ }
+
+ //fill DCB settings struct
+ DCB dcb;
+ FillMemory(&dcb, sizeof(dcb), 0);
+ dcb.DCBlength = sizeof(dcb);
+
+ if(!BuildCommDCBA(port_def_string, &dcb))
+ {
+ smDebug( -1, Low, "Serial port error: Unable to build DCB settings\n");
+ CloseHandle(port_handle);
+ return -1;
+ }
+
+ if(!SetCommState(port_handle, &dcb))
+ {
+ smDebug( -1, Low, "Serial port error: Unable to set port settings\n");
+ CloseHandle(port_handle);
+ return -1;
+ }
+
+ //set timeout
+ COMMTIMEOUTS port_timeouts;
+ port_timeouts.ReadTotalTimeoutConstant = readTimeoutMs;
+ port_timeouts.ReadIntervalTimeout = 0;
+ port_timeouts.ReadTotalTimeoutMultiplier = 0;
+ port_timeouts.WriteTotalTimeoutMultiplier = 50;
+ port_timeouts.WriteTotalTimeoutConstant = 50;
+
+ if(!SetCommTimeouts(port_handle, &port_timeouts))
+ {
+ smDebug( -1, Low, "Serial port error: Failed to set port timeout settings\n");
+ CloseHandle(port_handle);
+ return(-1);
+ }
+
+ return( (smint32)port_handle);
+}
+
+
+smint32 serialPortRead(smint32 serialport_handle, unsigned char *buf, smint32 size)
+{
+ smint32 n;
+ if(size>4096)
+ size = 4096;
+ ReadFile((HANDLE)serialport_handle, buf, size, (LPDWORD)((void *)&n), NULL);
+ return n;
+}
+
+
+smint32 serialPortWriteByte(smint32 serialport_handle, unsigned char byte)
+{
+ smint32 n;
+ WriteFile((HANDLE)serialport_handle, &byte, 1, (LPDWORD)((void *)&n), NULL);
+ if(n<0)
+ return 1;
+ return 0;
+}
+
+
+smint32 serialPortWriteBuffer(smint32 serialport_handle, unsigned char *buf, smint32 size)
+{
+ smint32 n;
+ if(WriteFile((HANDLE)serialport_handle, buf, size, (LPDWORD)((void *)&n), NULL))
+ return n;
+ return -1;
+}
+
+
+void serialPortClose(smint32 serialport_number)
+{
+ CloseHandle((HANDLE)serialport_number);
+}
+
+
+#endif//windows
diff --git a/pcserialport.h b/pcserialport.h
new file mode 100644
index 0000000..832786d
--- /dev/null
+++ b/pcserialport.h
@@ -0,0 +1,40 @@
+/*
+ * pcserialport.h
+ *
+ * Header for PC serial port access library (win/linux)
+ *
+ * Created on: 28.12.2016
+ * Author: Tero
+ *
+ * Inspired by RS232 library by Teunis van Beelen
+ */
+
+
+/* Todo:
+ -Restore port settings at CloseComport
+ */
+
+#ifndef PCSERAILPORT_H
+#define PCSERAILPORT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "simplemotion.h"
+
+//return port handle or -1 if fails
+smint32 serialPortOpen(const char *port_device_name, smint32 baudrate_bps);
+smint32 serialPortRead(smint32 serialport_handle, unsigned char *buf, smint32 size);
+smint32 serialPortWriteByte(smint32 serialport_handle, unsigned char byte);
+smint32 serialPortWriteBuffer(smint32 serialport_handle, unsigned char *buf, smint32 size);
+void serialPortClose(smint32 serialport_number);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/rs232.c b/rs232.c
deleted file mode 100644
index 1773767..0000000
--- a/rs232.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
-***************************************************************************
-*
-* Author: Teunis van Beelen
-*
-* Copyright (C) 2005, 2006, 2007, 2008, 2009 Teunis van Beelen
-*
-* teuniz@gmail.com
-*
-***************************************************************************
-*
-* 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 version 2 of the License.
-*
-* 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, write to the Free Software Foundation, Inc.,
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*
-***************************************************************************
-*
-* This version of GPL is at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
-*
-***************************************************************************
-*/
-
-
-
-#include "rs232.h"
-#include "simplemotion_private.h"
-
-
-#ifdef __linux__ /* Linux */
-
-
-int OpenComport(const char * comport_name, int baudrate)
-{
- int error;
- int handle;
- int baudr;
- struct termios new_port_settings;
-
- switch(baudrate)
- {
- case 50 : baudr = B50;
- break;
- case 75 : baudr = B75;
- break;
- case 110 : baudr = B110;
- break;
- case 134 : baudr = B134;
- break;
- case 150 : baudr = B150;
- break;
- case 200 : baudr = B200;
- break;
- case 300 : baudr = B300;
- break;
- case 600 : baudr = B600;
- break;
- case 1200 : baudr = B1200;
- break;
- case 1800 : baudr = B1800;
- break;
- case 2400 : baudr = B2400;
- break;
- case 4800 : baudr = B4800;
- break;
- case 9600 : baudr = B9600;
- break;
- case 19200 : baudr = B19200;
- break;
- case 38400 : baudr = B38400;
- break;
- case 57600 : baudr = B57600;
- break;
- case 115200 : baudr = B115200;
- break;
- case 230400 : baudr = B230400;
- break;
- case 460800 : baudr = B460800;
- break;
- case 500000 : baudr = B500000;
- break;
- case 576000 : baudr = B576000;
- break;
- case 921600 : baudr = B921600;
- break;
- case 1000000 : baudr = B1000000;
- break;
- default : printf("invalid baudrate\n");
- return(1);
- break;
- }
-
- //Cport[comport_number] = open(comports[comport_number], O_RDWR | O_NOCTTY | O_NDELAY);
- handle = open(comport_name, O_RDWR | O_NOCTTY );
- if(handle==-1)
- {
- perror("unable to open comport ");
- return(handle);
- }
-
- memset(&new_port_settings, 0, sizeof(new_port_settings)); /* clear the new struct */
-
- new_port_settings.c_cflag = baudr | CS8 | CLOCAL | CREAD;
- new_port_settings.c_iflag = IGNPAR;
- new_port_settings.c_oflag = 0;
- new_port_settings.c_lflag = 0;
- new_port_settings.c_cc[VMIN] = 0; /* block untill n bytes are received */
- new_port_settings.c_cc[VTIME] = readTimeoutMs/100; /* block untill a timer expires (n * 100 mSec.) */
- error = tcsetattr(handle, TCSANOW, &new_port_settings);
- if(error==-1)
- {
- close(handle);
- perror("unable to adjust portsettings ");
- return(-1);
- }
-
- return(handle);
-}
-
-
-int PollComport(int comport_number, unsigned char *buf, int size)
-{
- int n;
-
- #ifndef __STRICT_ANSI__ /* __STRICT_ANSI__ is defined when the -ansi option is used for gcc */
- if(size>SSIZE_MAX) size = (int)SSIZE_MAX; /* SSIZE_MAX is defined in limits.h */
- #else
- if(size>4096) size = 4096;
- #endif
-
- n = read(comport_number, buf, size);
-
- return(n);
-}
-
-
-int SendByte(int comport_number, unsigned char byte)
-{
- int n;
-
- n = write(comport_number, &byte, 1);
- if(n<0) return(1);
-
- return(0);
-}
-
-
-int SendBuf(int comport_number, unsigned char *buf, int size)
-{
- return(write(comport_number, buf, size));
-}
-
-
-void CloseComport(int comport_number)
-{
- close(comport_number);
- //feature removed, not restorint old settings :
- //tcsetattr(comport_number, TCSANOW, old_port_settings + comport_number);
-}
-
-/*
-Constant Description
-TIOCM_LE DSR (data set ready/line enable)
-TIOCM_DTR DTR (data terminal ready)
-TIOCM_RTS RTS (request to send)
-TIOCM_ST Secondary TXD (transmit)
-TIOCM_SR Secondary RXD (receive)
-TIOCM_CTS CTS (clear to send)
-TIOCM_CAR DCD (data carrier detect)
-TIOCM_CD Synonym for TIOCM_CAR
-TIOCM_RNG RNG (ring)
-TIOCM_RI Synonym for TIOCM_RNG
-TIOCM_DSR DSR (data set ready)
-*/
-
-int IsCTSEnabled(int comport_number)
-{
- int status;
-
- status = ioctl(comport_number, TIOCMGET, &status);
-
- if(status&TIOCM_CTS) return(1);
- else return(0);
-}
-
-
-#else /* windows */
-
-#ifdef DEBUG_COMPORT
-//for finding problem with windows calls
-void print_win32_system_error(char *name) {
- // Retrieve, format, and print out a message from the last error. The
- // `name' that's passed should be in the form of a present tense noun
- // (phrase) such as "opening file".
- //
- char *ptr = NULL;
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM,
- 0,
- GetLastError(),
- 0,
- (char *)&ptr,
- 1024,
- NULL);
-
- fprintf(stderr, "\nError %s: %ls\n", name, ptr);
- LocalFree(ptr);
-}
-#endif
-
-int OpenComport(const char * comport_name, int baudrate)
-{
-
- char baudr[64], portname[64];
- HANDLE handle;
-
-
- switch(baudrate)
- {
- case 110 : strcpy(baudr, "baud=110 data=8 parity=N stop=1");
- break;
- case 300 : strcpy(baudr, "baud=300 data=8 parity=N stop=1");
- break;
- case 600 : strcpy(baudr, "baud=600 data=8 parity=N stop=1");
- break;
- case 1200 : strcpy(baudr, "baud=1200 data=8 parity=N stop=1");
- break;
- case 2400 : strcpy(baudr, "baud=2400 data=8 parity=N stop=1");
- break;
- case 4800 : strcpy(baudr, "baud=4800 data=8 parity=N stop=1");
- break;
- case 9600 : strcpy(baudr, "baud=9600 data=8 parity=N stop=1");
- break;
- case 19200 : strcpy(baudr, "baud=19200 data=8 parity=N stop=1");
- break;
- case 38400 : strcpy(baudr, "baud=38400 data=8 parity=N stop=1");
- break;
- case 57600 : strcpy(baudr, "baud=57600 data=8 parity=N stop=1");
- break;
- case 115200 : strcpy(baudr, "baud=115200 data=8 parity=N stop=1");
- break;
- case 128000 : strcpy(baudr, "baud=128000 data=8 parity=N stop=1");
- break;
- case 256000 : strcpy(baudr, "baud=256000 data=8 parity=N stop=1");
- break;
- case 460800 : strcpy(baudr, "baud=460800 data=8 parity=N stop=1");
- break;
- default : printf("invalid baudrate\n");
- return(-1);
- break;
- }
-
- strcpy(portname,"\\\\.\\");
- strcat(portname,comport_name);
-
- handle = CreateFileA(portname,
- GENERIC_READ|GENERIC_WRITE,
- 0, /* no share */
- NULL, /* no security */
- OPEN_EXISTING,
- 0, /* no threads */
- NULL); /* no templates */
-
- if(handle==INVALID_HANDLE_VALUE)
- {
- printf("unable to open comport\n");
- return(-1);
- }
-
- DCB port_settings;
- memset(&port_settings, 0, sizeof(port_settings)); /* clear the new struct */
- port_settings.DCBlength = sizeof(port_settings);
-
- if(!BuildCommDCBA(baudr, &port_settings))
- {
- printf("unable to set comport dcb settings\n");
- CloseHandle(handle);
- return(-1);
- }
-
- if(!SetCommState(handle, &port_settings))
- {
- printf("unable to set comport cfg settings\n");
- CloseHandle(handle);
- return(-1);
- }
-
- COMMTIMEOUTS Cptimeouts;
-
- Cptimeouts.ReadIntervalTimeout = 0;
- Cptimeouts.ReadTotalTimeoutMultiplier = 0;
- Cptimeouts.ReadTotalTimeoutConstant = readTimeoutMs;
- Cptimeouts.WriteTotalTimeoutMultiplier = 50;
- Cptimeouts.WriteTotalTimeoutConstant = 50;
-
-
- if(!SetCommTimeouts(handle, &Cptimeouts))
- {
- printf("unable to set comport time-out settings\n");
- CloseHandle(handle);
- return(-1);
- }
-
- return( (int)handle);
-}
-
-
-int PollComport(int comport_number, unsigned char *buf, int size)
-{
- int n;
-
- if(size>4096) size = 4096;
-
- /* added the void pointer cast, otherwise gcc will complain about */
- /* "warning: dereferencing type-punned pointer will break strict aliasing rules" */
-
- ReadFile((HANDLE)comport_number, buf, size, (LPDWORD)((void *)&n), NULL);
-
- return(n);
-}
-
-
-int SendByte(int comport_number, unsigned char byte)
-{
- int n;
-
- WriteFile((HANDLE)comport_number, &byte, 1, (LPDWORD)((void *)&n), NULL);
-
- if(n<0) return(1);
-
- return(0);
-}
-
-
-
-int SendBuf(int comport_number, unsigned char *buf, int size)
-{
- int n;
-
- if(WriteFile((HANDLE)comport_number, buf, size, (LPDWORD)((void *)&n), NULL))
- {
- return(n);
- }
-
- return(-1);
-}
-
-
-void CloseComport(int comport_number)
-{
- CloseHandle((HANDLE)comport_number);
-}
-
-
-
-#endif
-
diff --git a/rs232.h b/rs232.h
deleted file mode 100644
index 7c90fea..0000000
--- a/rs232.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-***************************************************************************
-*
-* Author: Teunis van Beelen
-*
-* Copyright (C) 2005, 2006, 2007, 2008, 2009 Teunis van Beelen
-*
-* teuniz@gmail.com
-*
-***************************************************************************
-*
-* 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 version 2 of the License.
-*
-* 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, write to the Free Software Foundation, Inc.,
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*
-***************************************************************************
-*
-* This version of GPL is at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
-*
-***************************************************************************
-*/
-
-/* libraray modified for Simplemotion, major changes:
- -OpenComport now returns actual file handle that must be passed to rx/tx functions, or -1 if fails
-
- Todo:
- -Restore port settings at CloseComport
- */
-
-#ifndef rs232_INCLUDED
-#define rs232_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdio.h>
-#include <string.h>
-
-
-
-#ifdef __linux__
-
-#include <termios.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <limits.h>
-
-#else
-
-#include <windows.h>
-
-#endif
-
-//return port handle or -1 if fails
-int OpenComport(const char * comport_name, int baudrate);
-int PollComport(int, unsigned char *, int);
-int SendByte(int, unsigned char);
-int SendBuf(int, unsigned char *, int);
-void CloseComport(int);
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif
-
-
diff --git a/simplemotion.c b/simplemotion.c
index cea0238..78059ab 100644
--- a/simplemotion.c
+++ b/simplemotion.c
@@ -1,16 +1,5 @@
//Copyright (c) Granite Devices Oy
-/*
- 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; version 2 of the License.
-
- 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.
-*/
-
#include <stdio.h>
#include <string.h>
@@ -92,7 +81,10 @@ void smDebug( smbus handle, smVerbosityLevel verbositylevel, char *format, ...)
va_start(fmtargs,format);
vsnprintf(buffer,sizeof(buffer)-1,format,fmtargs);
va_end(fmtargs);
- fprintf(smDebugOut,"%s: %s",smBus[handle].busDeviceName, buffer);
+ if(handle>=0)
+ fprintf(smDebugOut,"%s: %s",smBus[handle].busDeviceName, buffer);
+ else
+ fprintf(smDebugOut,"SMLib: %s",buffer);//no handle given
}
}
#else
@@ -222,6 +214,27 @@ smbus smOpenBus( const char * devicename )
return handle;
}
+/** Change baudrate of SM communication port. This does not affect already opened ports but the next smOpenBus will be opened at the new speed.
+ Calling this is optional. By default SM bus and all slave devices operates at 460800 BPS speed.
+ Parameters:
+ -bps: bus speed in bits per second. for possible choices, see rs232.c (but note that all speeds are not necessarily supported by SM devices)
+ Typical usage is:
+ - first call smSetParameter(handle,0,SMP_BUS_SPEED,N) to change speed of all connected slaves to N PBS
+ - then close port with smCloseBus
+ - then call smSetBaudrate(N)
+ - then open bus again with smOpenBus
+
+ Note that in upcoming SM device firmware versions, bitrate will be reset to default (460800) if device side SM bus watchdog timer has been enabled, and it timeouts.
+ This allows re-establishing connection at defautl speed if connection breaks up and SM bus watchdog timeout gets exceeded. To identify is device supports this,
+ read parameter SMP_SM_VERSION. Values above 25 support this feature. Value 25 and below will not reset baudrate.
+
+ Note also that SMP_BUS_SPEED will not be saved in device flash memory - it will reset to default at every reset & power on.
+ */
+LIB void smSetBaudrate( unsigned long pbs )
+{
+ SMBusBaudrate=pbs;
+}
+
/** Close connection to given bus handle number. This frees communication link therefore makes it available for other apps for opening.
-return value: a SM_STATUS value, i.e. SM_OK if command succeed
*/
@@ -558,7 +571,7 @@ SM_STATUS smGetQueuedSMCommandReturnValue( const smbus bushandle, smint32 *retV
if(smBus[bushandle].cmd_recv_queue_bytes>=smBus[bushandle].recv_payloadsize)
{
- smDebug(Trace,bushandle,"Packet receive error, return data coudn't be parsed\n");
+ smDebug(bushandle,Trace, "Packet receive error, return data coudn't be parsed\n");
//return 0
if(retValue!=NULL) *retValue=0;//check every time if retValue is set NULL by caller -> don't store anything to it if its NULL
@@ -579,7 +592,7 @@ SM_STATUS smGetQueuedSMCommandReturnValue( const smbus bushandle, smint32 *retV
smuint8 *readBuf=(smuint8*)&read;
readBuf[1]=rxbyte;
readBuf[0]=bufget8bit(smBus[bushandle].recv_rsbuf, smBus[bushandle].cmd_recv_queue_bytes++);
- smDebug(Trace,bushandle,"RET16B: %d\n",read.retData);
+ smDebug(bushandle,Trace,"RET16B: %d\n",read.retData);
if(retValue!=NULL) *retValue=read.retData;
return recordStatus(bushandle,SM_OK);
@@ -592,7 +605,7 @@ SM_STATUS smGetQueuedSMCommandReturnValue( const smbus bushandle, smint32 *retV
readBuf[2]=rxbyte;
readBuf[1]=bufget8bit(smBus[bushandle].recv_rsbuf, smBus[bushandle].cmd_recv_queue_bytes++);
readBuf[0]=bufget8bit(smBus[bushandle].recv_rsbuf, smBus[bushandle].cmd_recv_queue_bytes++);
- smDebug(Trace,bushandle,"RET24B: %d\n",read.retData);
+ smDebug(bushandle,Trace,"RET24B: %d\n",read.retData);
if(retValue!=NULL) *retValue=read.retData;
return recordStatus(bushandle,SM_OK);
@@ -606,7 +619,7 @@ SM_STATUS smGetQueuedSMCommandReturnValue( const smbus bushandle, smint32 *retV
readBuf[2]=bufget8bit(smBus[bushandle].recv_rsbuf, smBus[bushandle].cmd_recv_queue_bytes++);
readBuf[1]=bufget8bit(smBus[bushandle].recv_rsbuf, smBus[bushandle].cmd_recv_queue_bytes++);
readBuf[0]=bufget8bit(smBus[bushandle].recv_rsbuf, smBus[bushandle].cmd_recv_queue_bytes++);
- smDebug(Trace,bushandle,"RET32B: %d\n",read.retData);
+ smDebug(bushandle,Trace,"RET32B: %d\n",read.retData);
if(retValue!=NULL) *retValue=read.retData;
return recordStatus(bushandle,SM_OK);
@@ -617,7 +630,7 @@ SM_STATUS smGetQueuedSMCommandReturnValue( const smbus bushandle, smint32 *retV
SMPayloadCommandRet8 read;
smuint8 *readBuf=(smuint8*)&read;
readBuf[0]=rxbyte;
- smDebug(Trace,bushandle,"RET_OTHER: %d\n",read.retData);
+ smDebug(bushandle,Trace,"RET_OTHER: %d\n",read.retData);
if(retValue!=NULL) *retValue=read.retData;
return recordStatus(bushandle,SM_OK);
diff --git a/simplemotion.h b/simplemotion.h
index 056c745..965512f 100644
--- a/simplemotion.h
+++ b/simplemotion.h
@@ -1,17 +1,6 @@
//Global SimpleMotion functions & definitions
//Copyright (c) Granite Devices Oy
-/*
- 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; version 2 of the License.
-
- 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.
-*/
-
#ifndef SIMPLEMOTION_H
#define SIMPLEMOTION_H
@@ -81,6 +70,24 @@ typedef enum _smVerbosityLevel {Off,Low,Mid,High,Trace} smVerbosityLevel;
*/
LIB smbus smOpenBus( const char * devicename );
+/** Change baudrate of SM communication port. This does not affect already opened ports but the next smOpenBus will be opened at the new speed.
+ Calling this is optional. By default SM bus and all slave devices operates at 460800 BPS speed.
+ Parameters:
+ -bps: bus speed in bits per second. for possible choices, see rs232.c (but note that all speeds are not necessarily supported by SM devices)
+ Typical usage is:
+ - first call smSetParameter(handle,0,SMP_BUS_SPEED,N) to change speed of all connected slaves to N PBS
+ - then close port with smCloseBus
+ - then call smSetBaudrate(N)
+ - then open bus again with smOpenBus
+
+ Note that in upcoming SM device firmware versions, bitrate will be reset to default (460800) if device side SM bus watchdog timer has been enabled, and it timeouts.
+ This allows re-establishing connection at defautl speed if connection breaks up and SM bus watchdog timeout gets exceeded. To identify is device supports this,
+ read parameter SMP_SM_VERSION. Values above 25 support this feature. Value 25 and below will not reset baudrate.
+
+ Note also that SMP_BUS_SPEED will not be saved in device flash memory - it will reset to default at every reset & power on.
+ */
+LIB void smSetBaudrate( unsigned long pbs );
+
/** Set timeout of how long to wait reply packet from bus. Must be set before smOpenBus and cannot be changed afterwards
* max value 5000ms. In unix this is rounded to 100ms (rounding downwards), so 99 or less gives 0ms timeout.
*
diff --git a/simplemotion_defs.h b/simplemotion_defs.h
index d5f6630..f85b40f 100644
--- a/simplemotion_defs.h
+++ b/simplemotion_defs.h
@@ -20,7 +20,7 @@
/* SMV2 protocol change log:
* Version 20:
* -V20 was introduced with Argon FW 1.0.0 and present at least until 1.4.0
- * Version 21 (is backwards compatible in syntax but not in setpoint behavior, see details below):
+ * Version 25 (is backwards compatible in syntax but not in setpoint behavior, see details below):
* -V25 was introduced with IONI
* -setpoint calculation is different:
* now there is only one common setpoint and all ABS and INC commands (buffered & instant)
@@ -31,6 +31,10 @@
* this makes it possible to insert any parameter read/write commands in middle of buffered motion.
* -implemented watchdog functionality in new param SMP_FAULT_BEHAVIOR
* -added param SMP_ADDRESS_OFFSET
+ * Version 26:
+ * - fast SM command added (actually is also present in late V25 too, but as unofficial feature)
+ * - watchdog timout now resets bitrate to default and aborts buffered motion
+ *
*/
/* Important when using SMV2 protocol:
@@ -344,6 +348,13 @@
#define SMP_SYSTEM_CONTROL_MEASURE_MOTOR_RL 256
//resets position mode FB and setpoint values to 0, and also resets homing status. useful after using in vel or torq mode.
#define SMP_SYSTEM_CONTROL_RESET_FB_AND_SETPOINT 512
+ //writes various FW version specific values into debug parameters
+ #define SMP_SYSTEM_CONTROL_GET_SPECIAL_DATA 1024
+ //stores encoder index position in SMP_DEBUGPARAM_1. while busy (index not found) SMP_DEBUGPARAM_2 will be 100, after found it is 200.
+ #define SMP_SYSTEM_CONTROL_CAPTURE_INDEX_POSITION 2048
+ //write SM bus SM_CRCINIT constant modifier. special purposes only, don't use if unsure because
+ //it is one time programmable variable (permanently irreversible operation, can't be ever reset to default by provided methods)
+ #define SMP_SYSTEM_CONTROL_MODIFY_CRCINIT 262144
//follow error tolerance for position control:
#define SMP_POS_FERROR_TRIP 555
@@ -421,7 +432,7 @@
#define FLAG_INVERTED_HALLS BV(13)
#define FLAG_USE_HALLS BV(14)
#define FLAG_MECH_BRAKE_DURING_PHASING BV(15)
- #define FLAG_LIMIT_SWITCHES_NORMALLY_CLOSED_TYPE BV(16)
+ #define FLAG_LIMIT_SWITCHES_NORMALLY_OPEN_TYPE BV(16)
#define SMP_MOTION_FAULT_THRESHOLD 568
#define SMP_HV_VOLTAGE_HI_LIMIT 569
#define SMP_HV_VOLTAGE_LOW_LIMIT 570
@@ -432,13 +443,23 @@
#define SMP_ELECTRICAL_MODE 573
#define EL_MODE_STANDARD 0
#define EL_MODE_IONICUBE 1
- #define EL_MODE_IONIZER 2
-
+ #define EL_MODE_SIMUCUBE 2
+ #define EL_MODE_IONIZER 3
+
+/*for BiSS/SSI encoder
+ * bits defined as (from LSB):
+ * bits 0-7: single turn bits, accepted value range 4-24
+ * bits 8-15: multi turn bits, accepted value range 0-16
+ * bits 16-18: serial encoder mode: 000=BiSS, 001=SSI, 010=AMS SSI (SSI+CS+error monitoring), 011=SPI (SSI+CS) 100=GRAY SSI (i.e. SICK TTK70)
+ * rest: reserved for future use (always 0)
+ */
+#define SMP_SERIAL_ENC_BITS 574
//primary feedback loop 200-299
#define SMP_VEL_I 200
#define SMP_POS_P 201
#define SMP_VEL_P 202
+#define SMP_VEL_D 203
#define SMP_VEL_FF 220
#define SMP_ACC_FF 221
#define SMP_POS_FF 222
@@ -446,6 +467,24 @@
//anti dither limits
#define SMP_ANTIDITHER_MODE 230
+//torque modifiers & effects
+/*SMP_TORQUE_NOTCH_FILTER contains 3 values in different bit positions:
+ * 0-7 (lowest byte), attenuation in 0.1dB steps and value V=1-255 means attenuation of (-V-255)/10 dB gain. if V set 0, use notch filter instead of peaking with "infinite" attenuation. value 255 disables notch filter.
+ * 8-15, Q factor in 0.1 steps. Minimum is 0.1, below that filter is disabled.
+ * 16-29, center frequency in 0.1Hz steps, and 1.1Hz is minimum, so range is 1.1-409.5 Hz. value below or equal 1Hz disables the filter.
+ *
+ *Example, peaking filter with gain -11.5dB, center freq 20Hz and Q=3.5 value is: 0x00648c23 = dec 6589475
+ *
+ *Notch filter works in all control modes and is applied to torque controller setpoint
+ */
+#define SMP_TORQUE_NOTCH_FILTER 240
+//define damping effect gain in torque control mode, torque added to setpoint equals -speed*gain with
+#define SMP_TORQUE_EFFECT_DAMPING 241
+//define friction effect gain in torque control mode
+#define SMP_TORQUE_EFFECT_FRICTION 242
+//define inertia effect gain in torque control mode, torque added to setpoint equals -acceleration*gain
+#define SMP_TORQUE_EFFECT_INERTIA 243
+
//secondary feedback loop 300-399
//NOT IMPLEMENTED YET
diff --git a/simplemotion_private.h b/simplemotion_private.h
index c56363e..67128b7 100644
--- a/simplemotion_private.h
+++ b/simplemotion_private.h
@@ -1,16 +1,6 @@
//Internal functions & definitions, not for library user
//Copyright (c) Granite Devices Oy
-/*
- 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; version 2 of the License.
-
- 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.
-*/
#ifndef SIMPLEMOTION_PRIVATE_H
#define SIMPLEMOTION_PRIVATE_H
@@ -19,7 +9,7 @@
#include "busdevice.h"
#include <stdio.h>
-#define SM_VERSION 0x020001
+#define SM_VERSION 0x020100
//max number of simultaneously opened buses. change this and recompiple SMlib if
//necessary (to increase channels or reduce to save memory)
#define SM_MAX_BUSES 10
@@ -30,6 +20,7 @@
#define BUSDEV_FTDI 2 /*not implemented yet: direct FTDI lib support*/
#define SM_BUSDEVICENAME_LEN 64
+extern unsigned long SMBusBaudrate; //the next opened port (with smOpenBus) will be opened with the PBS defined here (default 460800 BPS)
//default timeout in ms
//Argon drive's worst case response time should be ~20ms with max length packets
@@ -42,6 +33,10 @@ extern const smuint8 table_crc8[];
extern FILE *smDebugOut; //such as stderr or file handle. if NULL, debug info disbled
extern smuint16 readTimeoutMs;
+//smDebug: prints debug info to smDebugOut stream. If no handle availab, set it to -1.
+//set verbositylevel according to frequency of prints made.
+//I.e Low=low frequency, so it gets displayed when global verbosity level is set to at least Low or set it to Trace which gets filtered
+//out if global verbisity level is set less than Trace
void smDebug( smbus handle, smVerbosityLevel verbositylevel, char *format, ...);
//accumulates status to internal variable by ORing the bits. returns same value that is fed as paramter
SM_STATUS recordStatus( const smbus handle, const SM_STATUS stat );
diff --git a/smtest.c b/smtest.c
deleted file mode 100644
index e021da6..0000000
--- a/smtest.c
+++ /dev/null
@@ -1,361 +0,0 @@
-#include "simplemotion.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-#define ADDR 255
-#include "vsd_cmd.h"
-
-
-//gcc -o testi *.c
-
-//#include "D:\gd\vsdr\vsdr-stm32\src\simplemotion_defs.h"
-#include "/home/tero/shr/svn/granited/firmware_design/eclipseworkspace/vsdr-stm32/src/simplemotion_defs.h"
-
-smbus h;
- smint32 ret;
- SM_STATUS stat=0;
-
-
-
-void test()
-{
- //printf( "stat %d\n", smRawCommand( h, ADDR, 2, 0, &ret ) );
- //printf("ret=%08x\n",ret);
-
- //printf( "stat %d\n", smRawCommand( h, 2, 2, 0, &ret ) );
- //printf("ret=%08x\n",ret);
-
-
-
- //stat|=smAppendSetParamCommandToQueue(h,SMP_DIGITAL_OUT_VALUE_1,151);
-// stat|=smAppendSetParamCommandToQueue(h,SMP_INPUT_MULTIPLIER,11);
- stat|=smExecuteCommandQueue( h, ADDR );
- stat|=smGetQueuedSetParamReturnValue(h,&ret);
- printf("setstat=%d val=%d\n",stat,ret);
-
- stat=0;
- stat|=smAppendGetParamCommandToQueue(h,SMP_BUS_SPEED);
- stat|=smAppendGetParamCommandToQueue(h,SMP_SM_VERSION_COMPAT);
- stat|=smAppendGetParamCommandToQueue(h,SMP_DIGITAL_OUT_VALUE_1);
- stat|=smExecuteCommandQueue( h, ADDR );
- stat|=smGetQueuedGetParamReturnValue(h,&ret);
- printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedGetParamReturnValue(h,&ret);
- printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedGetParamReturnValue(h,&ret);
- printf("stat=%d val=%d\n",stat,ret);
-
-
-/* smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_RETURN_PARAM_LEN );
- smAppendSMCommandToQueue( h, SMPCMD_24B, SMPRET_32B );
- smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_RETURN_PARAM_ADDR );
- smAppendSMCommandToQueue( h, SMPCMD_32B, SMP_BUS_SPEED );
-
- smAppendSMCommandToQueue( h, SMPCMD_32B,SMP_INPUT_MULTIPLIER );
- smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_INPUT_MULTIPLIER );
- smAppendSMCommandToQueue( h, SMPCMD_24B, 100 );
-// SMP_INPUT_MULTIPLIER
-
-
- smExecuteCommandQueue( h, ADDR );
- printf("",smGetQueuedSMCommandReturnValue( h ));
- printf("",smGetQueuedSMCommandReturnValue( h ));
- printf("",smGetQueuedSMCommandReturnValue( h ));
- printf("",smGetQueuedSMCommandReturnValue( h ));
- printf("",smGetQueuedSMCommandReturnValue( h ));
- printf("",smGetQueuedSMCommandReturnValue( h ));
- printf("",smGetQueuedSMCommandReturnValue( h ));
- // printf("%d\n",smGetQueuedSMCommandReturnValue( h ));*/
-
- /* smAppendCommandToQueue( h, CMD_GET_PARAM, RUNTIME_FAULTBITS );
- smAppendCommandToQueue( h, CMD_GET_PARAM, RUNTIME_STATUSBITS );
- smAppendCommandToQueue( h, CMD_GET_PARAM, RUNTIME_FIRMWARE_VERSION );
- smExecuteCommandQueue( h, ADDR );
- printf("%d\n",smGetQueuedCommandReturnValue( h, 0 ));
- printf("%d\n",smGetQueuedCommandReturnValue( h, 1 ));
- printf("%d\n",smGetQueuedCommandReturnValue( h, 2 ));
- */
-}
-
-void tests();
-
-/*BL functions started by writing a value to this param:
- * 1:mass erase and reset write pos counter to 0
- * 2:write block
- * 3:verify flash (update BOOTLOADER_STAT_FLASH_VERIFIED_OK status)
- * 4:start main app
- */
-#define SMP_BOOTLOADER_FUNCTION 191
-//upload 16bits of data to buffer. max buffer length 4096 bytes before it must be written with "write block" function
-//total uploaded amount must be multiple of 4 bytes before issuing write function
-#define SMP_BOOTLOADER_UPLOAD 192
-//bootloaded status
-#define SMP_BOOTLOADER_STAT 193
- #define BOOTLOADER_STAT_FLASH_VERIFIED_OK BV(0)
-#define SMP_FIRMWARE_VERSION 6010
-#define SMP_BACKWARDS_COMP_VERSION 6012
-
-#define SUPPORTED_BL_VERSION_MIN 10000
-#define SUPPORTED_BL_VERSION_MAX 10010
-
-
-//load app rom from file. args:
-//pass pointer to "data". this func will allocate the memory
-//return number of 16bit words or -1 if load failed
-int loadBLfile( const char *filename, smuint16 **data )
-{
- int bytes;
- int i;
- FILE *f;
- smuint16 *buf;
-
- //open file
- f=fopen(filename,"rb");
- if(f==NULL)
- return -1;
-
- //find file size
- fseek(f, 0L, SEEK_END);
- bytes = ftell(f);
- fseek(f, 0L, SEEK_SET);
- printf("size=%d\n",bytes);
- //allocate
- buf=(smuint16*)malloc((bytes+1)/2);//round upwards
- if(buf==NULL)
- return -1;
-
- //load
- for(i=0;i<bytes;i++)
- {
- int get=fgetc(f);
- if(get==EOF)
- return -1;
-
- //treat data as byte array
- ((smuint8*)buf)[i]=get;
- }
- printf(".\n");
- //fclose(f);
- printf(".\n");
-
- *data=buf;
-
- return ((bytes+1)/2);
-}
-
-#define BL_CHUNK_LEN 32
-
-int uploadGCfile(const char *fname)
-{
- smint32 blversion,blcompversion;
- stat=0;
- smuint16 *bin;
- int i,c;
-
- int size=loadBLfile(fname,&bin);
- if(size<0)
- {
- printf("load failed\n");
- return;
- }
- printf("loaded %d words\n",size);
-
-
-
- //get possible node detected faults in communications
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_RETURN_PARAM_ADDR );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_24B, SMP_CUMULATIVE_STATUS );
- //set return param type and command type
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_RETURN_PARAM_LEN );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_32B, SMPRET_CMD_STATUS );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_BOOTLOADER_UPLOAD );
- stat|=smExecuteCommandQueue( h, ADDR );
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- int smnodestats=ret;
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
-
- if(stat!=SM_OK || smnodestats!=SMP_CMD_STATUS_ACK)
- {
- printf("SM errors occurred:%d\n",smnodestats);
- exit(5);
- }
-
- //upload data in 32=BL_CHUNK_LEN word chunks
- for(i=0;i<size;)
- {
- printf("pos %d\n",i);
- //getchar();
-
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_BOOTLOADER_UPLOAD );
- for(c=0;c<BL_CHUNK_LEN;c++)
- {
- smuint16 upword;
- //pad end of file with constant
- if(i>=size)
- upword=0xeeee;
- else
- upword=bin[i];
- printf("i=%d\n",i);
-
- stat|=smAppendSMCommandToQueue( h, SMPCMD_24B, upword );
- i++;
- }
-// stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_BOOTLOADER_FUNCTION );
-// stat|=smAppendSMCommandToQueue( h, SMPCMD_24B, 2);//do write
-
- stat|=smExecuteCommandQueue( h, ADDR );
-
- for(c=0;c<BL_CHUNK_LEN+1;c++)
- {
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );
- if(stat!=SM_OK)
- {
- printf("error stat=%d\n",stat);
- exit(6);
- }
- }
- }
-
- printf("done. enter to flash\n");
- getchar();
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_BOOTLOADER_FUNCTION );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_24B, 5);//flash gc
- stat|=smExecuteCommandQueue( h, ADDR );
-}
-
-void blcommtest(const char *fname)
-{
- smint32 blversion,blcompversion;
- stat=0;
- smuint16 *bin;
- int i,c;
-
- int size=loadBLfile(fname,&bin);
- if(size<0)
- {
- printf("load failed\n");
- return;
- }
- printf("loaded %d words\n",size);
-
-
- //read bl variables
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_RETURN_PARAM_LEN );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_32B, SMPRET_32B );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_RETURN_PARAM_ADDR );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_32B, SMP_FIRMWARE_VERSION );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_32B, SMP_BACKWARDS_COMP_VERSION );
- stat|=smExecuteCommandQueue( h, ADDR );
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- blversion=ret;
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- blcompversion=ret;
-
- //if version ok
- //if(blversion
-
- //mass erase flash
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_BOOTLOADER_FUNCTION );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_32B, 1 );//do mass erase
- stat|=smExecuteCommandQueue( h, ADDR );
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
-
- usleep(1000000);
-
- //flash
-
- //get possible node detected faults in communications
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_RETURN_PARAM_ADDR );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_24B, SMP_CUMULATIVE_STATUS );
- //set return param type and command type
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_RETURN_PARAM_LEN );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_32B, SMPRET_CMD_STATUS );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_BOOTLOADER_UPLOAD );
- stat|=smExecuteCommandQueue( h, ADDR );
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- int smnodestats=ret;
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );printf("stat=%d val=%d\n",stat,ret);
-
- if(stat!=SM_OK || smnodestats!=SMP_CMD_STATUS_ACK)
- {
- printf("SM errors occurred:%d\n",smnodestats);
- exit(5);
- }
-
- //upload data in 32=BL_CHUNK_LEN word chunks
- for(i=0;i<size;)
- {
- printf("pos %d\n",i);
- //getchar();
-
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_BOOTLOADER_UPLOAD );
- for(c=0;c<BL_CHUNK_LEN;c++)
- {
- smuint16 upword;
- //pad end of file with constant
- if(i>=size)
- upword=0xeeee;
- else
- upword=bin[i];
- printf("i=%d\n",i);
-
- stat|=smAppendSMCommandToQueue( h, SMPCMD_24B, upword );
- i++;
- }
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_BOOTLOADER_FUNCTION );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_24B, 2);//do write
-
- stat|=smExecuteCommandQueue( h, ADDR );
-
- for(c=0;c<BL_CHUNK_LEN+3;c++)
- {
- stat|=smGetQueuedSMCommandReturnValue( h,&ret );
- if(stat!=SM_OK)
- {
- printf("error stat=%d\n",stat);
- exit(6);
- }
- }
- }
-
- printf("done. enter to run\n");
- getchar();
- stat|=smAppendSMCommandToQueue( h, SMPCMD_SETPARAMADDR, SMP_BOOTLOADER_FUNCTION );
- stat|=smAppendSMCommandToQueue( h, SMPCMD_24B, 4);//launch
- stat|=smExecuteCommandQueue( h, ADDR );
-
-
-}
-
-int main(int args, const char *argv[])
-{
- if(args<2)
- {
- printf("args: rom bin file name\n");
- return(0);
- }
-
- smSetDebugOutput(High,stderr);
-
- smSetTimeout(1500);
- h=smOpenBus("COM17"); //17=USB1 16=0
-
- printf("handle=%d\n",h);
- if(h==-1) return 3;
-
-
- uploadGCfile(argv[1]);
- //blcommtest(argv[1]);
-
- smCloseBus(h);
-}