/[dtapublic]/winprojs/scirfmmon/source/log_packet.c
ViewVC logotype

Annotation of /winprojs/scirfmmon/source/log_packet.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 22 - (hide annotations) (download)
Sat Oct 8 06:05:29 2016 UTC (7 years, 10 months ago) by dashley
File MIME type: text/plain
File size: 178386 byte(s)
Initial commit.
1 dashley 22 //$Header: /home/dashley/cvsrep/e3ft_gpl01/e3ft_gpl01/winprojs/scirfmmon/source/log_packet.c,v 1.24 2009/01/17 22:12:37 dashley Exp $
2     //--------------------------------------------------------------------------------
3     //Copyright 2008 David T. Ashley
4     //-------------------------------------------------------------------------------------------------
5     //This source code and any program in which it is compiled/used is provided under the GNU GENERAL
6     //PUBLIC LICENSE, Version 3, full license text below.
7     //-------------------------------------------------------------------------------------------------
8     // GNU GENERAL PUBLIC LICENSE
9     // Version 3, 29 June 2007
10     //
11     // Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
12     // Everyone is permitted to copy and distribute verbatim copies
13     // of this license document, but changing it is not allowed.
14     //
15     // Preamble
16     //
17     // The GNU General Public License is a free, copyleft license for
18     //software and other kinds of works.
19     //
20     // The licenses for most software and other practical works are designed
21     //to take away your freedom to share and change the works. By contrast,
22     //the GNU General Public License is intended to guarantee your freedom to
23     //share and change all versions of a program--to make sure it remains free
24     //software for all its users. We, the Free Software Foundation, use the
25     //GNU General Public License for most of our software; it applies also to
26     //any other work released this way by its authors. You can apply it to
27     //your programs, too.
28     //
29     // When we speak of free software, we are referring to freedom, not
30     //price. Our General Public Licenses are designed to make sure that you
31     //have the freedom to distribute copies of free software (and charge for
32     //them if you wish), that you receive source code or can get it if you
33     //want it, that you can change the software or use pieces of it in new
34     //free programs, and that you know you can do these things.
35     //
36     // To protect your rights, we need to prevent others from denying you
37     //these rights or asking you to surrender the rights. Therefore, you have
38     //certain responsibilities if you distribute copies of the software, or if
39     //you modify it: responsibilities to respect the freedom of others.
40     //
41     // For example, if you distribute copies of such a program, whether
42     //gratis or for a fee, you must pass on to the recipients the same
43     //freedoms that you received. You must make sure that they, too, receive
44     //or can get the source code. And you must show them these terms so they
45     //know their rights.
46     //
47     // Developers that use the GNU GPL protect your rights with two steps:
48     //(1) assert copyright on the software, and (2) offer you this License
49     //giving you legal permission to copy, distribute and/or modify it.
50     //
51     // For the developers' and authors' protection, the GPL clearly explains
52     //that there is no warranty for this free software. For both users' and
53     //authors' sake, the GPL requires that modified versions be marked as
54     //changed, so that their problems will not be attributed erroneously to
55     //authors of previous versions.
56     //
57     // Some devices are designed to deny users access to install or run
58     //modified versions of the software inside them, although the manufacturer
59     //can do so. This is fundamentally incompatible with the aim of
60     //protecting users' freedom to change the software. The systematic
61     //pattern of such abuse occurs in the area of products for individuals to
62     //use, which is precisely where it is most unacceptable. Therefore, we
63     //have designed this version of the GPL to prohibit the practice for those
64     //products. If such problems arise substantially in other domains, we
65     //stand ready to extend this provision to those domains in future versions
66     //of the GPL, as needed to protect the freedom of users.
67     //
68     // Finally, every program is threatened constantly by software patents.
69     //States should not allow patents to restrict development and use of
70     //software on general-purpose computers, but in those that do, we wish to
71     //avoid the special danger that patents applied to a free program could
72     //make it effectively proprietary. To prevent this, the GPL assures that
73     //patents cannot be used to render the program non-free.
74     //
75     // The precise terms and conditions for copying, distribution and
76     //modification follow.
77     //
78     // TERMS AND CONDITIONS
79     //
80     // 0. Definitions.
81     //
82     // "This License" refers to version 3 of the GNU General Public License.
83     //
84     // "Copyright" also means copyright-like laws that apply to other kinds of
85     //works, such as semiconductor masks.
86     //
87     // "The Program" refers to any copyrightable work licensed under this
88     //License. Each licensee is addressed as "you". "Licensees" and
89     //"recipients" may be individuals or organizations.
90     //
91     // To "modify" a work means to copy from or adapt all or part of the work
92     //in a fashion requiring copyright permission, other than the making of an
93     //exact copy. The resulting work is called a "modified version" of the
94     //earlier work or a work "based on" the earlier work.
95     //
96     // A "covered work" means either the unmodified Program or a work based
97     //on the Program.
98     //
99     // To "propagate" a work means to do anything with it that, without
100     //permission, would make you directly or secondarily liable for
101     //infringement under applicable copyright law, except executing it on a
102     //computer or modifying a private copy. Propagation includes copying,
103     //distribution (with or without modification), making available to the
104     //public, and in some countries other activities as well.
105     //
106     // To "convey" a work means any kind of propagation that enables other
107     //parties to make or receive copies. Mere interaction with a user through
108     //a computer network, with no transfer of a copy, is not conveying.
109     //
110     // An interactive user interface displays "Appropriate Legal Notices"
111     //to the extent that it includes a convenient and prominently visible
112     //feature that (1) displays an appropriate copyright notice, and (2)
113     //tells the user that there is no warranty for the work (except to the
114     //extent that warranties are provided), that licensees may convey the
115     //work under this License, and how to view a copy of this License. If
116     //the interface presents a list of user commands or options, such as a
117     //menu, a prominent item in the list meets this criterion.
118     //
119     // 1. Source Code.
120     //
121     // The "source code" for a work means the preferred form of the work
122     //for making modifications to it. "Object code" means any non-source
123     //form of a work.
124     //
125     // A "Standard Interface" means an interface that either is an official
126     //standard defined by a recognized standards body, or, in the case of
127     //interfaces specified for a particular programming language, one that
128     //is widely used among developers working in that language.
129     //
130     // The "System Libraries" of an executable work include anything, other
131     //than the work as a whole, that (a) is included in the normal form of
132     //packaging a Major Component, but which is not part of that Major
133     //Component, and (b) serves only to enable use of the work with that
134     //Major Component, or to implement a Standard Interface for which an
135     //implementation is available to the public in source code form. A
136     //"Major Component", in this context, means a major essential component
137     //(kernel, window system, and so on) of the specific operating system
138     //(if any) on which the executable work runs, or a compiler used to
139     //produce the work, or an object code interpreter used to run it.
140     //
141     // The "Corresponding Source" for a work in object code form means all
142     //the source code needed to generate, install, and (for an executable
143     //work) run the object code and to modify the work, including scripts to
144     //control those activities. However, it does not include the work's
145     //System Libraries, or general-purpose tools or generally available free
146     //programs which are used unmodified in performing those activities but
147     //which are not part of the work. For example, Corresponding Source
148     //includes interface definition files associated with source files for
149     //the work, and the source code for shared libraries and dynamically
150     //linked subprograms that the work is specifically designed to require,
151     //such as by intimate data communication or control flow between those
152     //subprograms and other parts of the work.
153     //
154     // The Corresponding Source need not include anything that users
155     //can regenerate automatically from other parts of the Corresponding
156     //Source.
157     //
158     // The Corresponding Source for a work in source code form is that
159     //same work.
160     //
161     // 2. Basic Permissions.
162     //
163     // All rights granted under this License are granted for the term of
164     //copyright on the Program, and are irrevocable provided the stated
165     //conditions are met. This License explicitly affirms your unlimited
166     //permission to run the unmodified Program. The output from running a
167     //covered work is covered by this License only if the output, given its
168     //content, constitutes a covered work. This License acknowledges your
169     //rights of fair use or other equivalent, as provided by copyright law.
170     //
171     // You may make, run and propagate covered works that you do not
172     //convey, without conditions so long as your license otherwise remains
173     //in force. You may convey covered works to others for the sole purpose
174     //of having them make modifications exclusively for you, or provide you
175     //with facilities for running those works, provided that you comply with
176     //the terms of this License in conveying all material for which you do
177     //not control copyright. Those thus making or running the covered works
178     //for you must do so exclusively on your behalf, under your direction
179     //and control, on terms that prohibit them from making any copies of
180     //your copyrighted material outside their relationship with you.
181     //
182     // Conveying under any other circumstances is permitted solely under
183     //the conditions stated below. Sublicensing is not allowed; section 10
184     //makes it unnecessary.
185     //
186     // 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
187     //
188     // No covered work shall be deemed part of an effective technological
189     //measure under any applicable law fulfilling obligations under article
190     //11 of the WIPO copyright treaty adopted on 20 December 1996, or
191     //similar laws prohibiting or restricting circumvention of such
192     //measures.
193     //
194     // When you convey a covered work, you waive any legal power to forbid
195     //circumvention of technological measures to the extent such circumvention
196     //is effected by exercising rights under this License with respect to
197     //the covered work, and you disclaim any intention to limit operation or
198     //modification of the work as a means of enforcing, against the work's
199     //users, your or third parties' legal rights to forbid circumvention of
200     //technological measures.
201     //
202     // 4. Conveying Verbatim Copies.
203     //
204     // You may convey verbatim copies of the Program's source code as you
205     //receive it, in any medium, provided that you conspicuously and
206     //appropriately publish on each copy an appropriate copyright notice;
207     //keep intact all notices stating that this License and any
208     //non-permissive terms added in accord with section 7 apply to the code;
209     //keep intact all notices of the absence of any warranty; and give all
210     //recipients a copy of this License along with the Program.
211     //
212     // You may charge any price or no price for each copy that you convey,
213     //and you may offer support or warranty protection for a fee.
214     //
215     // 5. Conveying Modified Source Versions.
216     //
217     // You may convey a work based on the Program, or the modifications to
218     //produce it from the Program, in the form of source code under the
219     //terms of section 4, provided that you also meet all of these conditions:
220     //
221     // a) The work must carry prominent notices stating that you modified
222     // it, and giving a relevant date.
223     //
224     // b) The work must carry prominent notices stating that it is
225     // released under this License and any conditions added under section
226     // 7. This requirement modifies the requirement in section 4 to
227     // "keep intact all notices".
228     //
229     // c) You must license the entire work, as a whole, under this
230     // License to anyone who comes into possession of a copy. This
231     // License will therefore apply, along with any applicable section 7
232     // additional terms, to the whole of the work, and all its parts,
233     // regardless of how they are packaged. This License gives no
234     // permission to license the work in any other way, but it does not
235     // invalidate such permission if you have separately received it.
236     //
237     // d) If the work has interactive user interfaces, each must display
238     // Appropriate Legal Notices; however, if the Program has interactive
239     // interfaces that do not display Appropriate Legal Notices, your
240     // work need not make them do so.
241     //
242     // A compilation of a covered work with other separate and independent
243     //works, which are not by their nature extensions of the covered work,
244     //and which are not combined with it such as to form a larger program,
245     //in or on a volume of a storage or distribution medium, is called an
246     //"aggregate" if the compilation and its resulting copyright are not
247     //used to limit the access or legal rights of the compilation's users
248     //beyond what the individual works permit. Inclusion of a covered work
249     //in an aggregate does not cause this License to apply to the other
250     //parts of the aggregate.
251     //
252     // 6. Conveying Non-Source Forms.
253     //
254     // You may convey a covered work in object code form under the terms
255     //of sections 4 and 5, provided that you also convey the
256     //machine-readable Corresponding Source under the terms of this License,
257     //in one of these ways:
258     //
259     // a) Convey the object code in, or embodied in, a physical product
260     // (including a physical distribution medium), accompanied by the
261     // Corresponding Source fixed on a durable physical medium
262     // customarily used for software interchange.
263     //
264     // b) Convey the object code in, or embodied in, a physical product
265     // (including a physical distribution medium), accompanied by a
266     // written offer, valid for at least three years and valid for as
267     // long as you offer spare parts or customer support for that product
268     // model, to give anyone who possesses the object code either (1) a
269     // copy of the Corresponding Source for all the software in the
270     // product that is covered by this License, on a durable physical
271     // medium customarily used for software interchange, for a price no
272     // more than your reasonable cost of physically performing this
273     // conveying of source, or (2) access to copy the
274     // Corresponding Source from a network server at no charge.
275     //
276     // c) Convey individual copies of the object code with a copy of the
277     // written offer to provide the Corresponding Source. This
278     // alternative is allowed only occasionally and noncommercially, and
279     // only if you received the object code with such an offer, in accord
280     // with subsection 6b.
281     //
282     // d) Convey the object code by offering access from a designated
283     // place (gratis or for a charge), and offer equivalent access to the
284     // Corresponding Source in the same way through the same place at no
285     // further charge. You need not require recipients to copy the
286     // Corresponding Source along with the object code. If the place to
287     // copy the object code is a network server, the Corresponding Source
288     // may be on a different server (operated by you or a third party)
289     // that supports equivalent copying facilities, provided you maintain
290     // clear directions next to the object code saying where to find the
291     // Corresponding Source. Regardless of what server hosts the
292     // Corresponding Source, you remain obligated to ensure that it is
293     // available for as long as needed to satisfy these requirements.
294     //
295     // e) Convey the object code using peer-to-peer transmission, provided
296     // you inform other peers where the object code and Corresponding
297     // Source of the work are being offered to the general public at no
298     // charge under subsection 6d.
299     //
300     // A separable portion of the object code, whose source code is excluded
301     //from the Corresponding Source as a System Library, need not be
302     //included in conveying the object code work.
303     //
304     // A "User Product" is either (1) a "consumer product", which means any
305     //tangible personal property which is normally used for personal, family,
306     //or household purposes, or (2) anything designed or sold for incorporation
307     //into a dwelling. In determining whether a product is a consumer product,
308     //doubtful cases shall be resolved in favor of coverage. For a particular
309     //product received by a particular user, "normally used" refers to a
310     //typical or common use of that class of product, regardless of the status
311     //of the particular user or of the way in which the particular user
312     //actually uses, or expects or is expected to use, the product. A product
313     //is a consumer product regardless of whether the product has substantial
314     //commercial, industrial or non-consumer uses, unless such uses represent
315     //the only significant mode of use of the product.
316     //
317     // "Installation Information" for a User Product means any methods,
318     //procedures, authorization keys, or other information required to install
319     //and execute modified versions of a covered work in that User Product from
320     //a modified version of its Corresponding Source. The information must
321     //suffice to ensure that the continued functioning of the modified object
322     //code is in no case prevented or interfered with solely because
323     //modification has been made.
324     //
325     // If you convey an object code work under this section in, or with, or
326     //specifically for use in, a User Product, and the conveying occurs as
327     //part of a transaction in which the right of possession and use of the
328     //User Product is transferred to the recipient in perpetuity or for a
329     //fixed term (regardless of how the transaction is characterized), the
330     //Corresponding Source conveyed under this section must be accompanied
331     //by the Installation Information. But this requirement does not apply
332     //if neither you nor any third party retains the ability to install
333     //modified object code on the User Product (for example, the work has
334     //been installed in ROM).
335     //
336     // The requirement to provide Installation Information does not include a
337     //requirement to continue to provide support service, warranty, or updates
338     //for a work that has been modified or installed by the recipient, or for
339     //the User Product in which it has been modified or installed. Access to a
340     //network may be denied when the modification itself materially and
341     //adversely affects the operation of the network or violates the rules and
342     //protocols for communication across the network.
343     //
344     // Corresponding Source conveyed, and Installation Information provided,
345     //in accord with this section must be in a format that is publicly
346     //documented (and with an implementation available to the public in
347     //source code form), and must require no special password or key for
348     //unpacking, reading or copying.
349     //
350     // 7. Additional Terms.
351     //
352     // "Additional permissions" are terms that supplement the terms of this
353     //License by making exceptions from one or more of its conditions.
354     //Additional permissions that are applicable to the entire Program shall
355     //be treated as though they were included in this License, to the extent
356     //that they are valid under applicable law. If additional permissions
357     //apply only to part of the Program, that part may be used separately
358     //under those permissions, but the entire Program remains governed by
359     //this License without regard to the additional permissions.
360     //
361     // When you convey a copy of a covered work, you may at your option
362     //remove any additional permissions from that copy, or from any part of
363     //it. (Additional permissions may be written to require their own
364     //removal in certain cases when you modify the work.) You may place
365     //additional permissions on material, added by you to a covered work,
366     //for which you have or can give appropriate copyright permission.
367     //
368     // Notwithstanding any other provision of this License, for material you
369     //add to a covered work, you may (if authorized by the copyright holders of
370     //that material) supplement the terms of this License with terms:
371     //
372     // a) Disclaiming warranty or limiting liability differently from the
373     // terms of sections 15 and 16 of this License; or
374     //
375     // b) Requiring preservation of specified reasonable legal notices or
376     // author attributions in that material or in the Appropriate Legal
377     // Notices displayed by works containing it; or
378     //
379     // c) Prohibiting misrepresentation of the origin of that material, or
380     // requiring that modified versions of such material be marked in
381     // reasonable ways as different from the original version; or
382     //
383     // d) Limiting the use for publicity purposes of names of licensors or
384     // authors of the material; or
385     //
386     // e) Declining to grant rights under trademark law for use of some
387     // trade names, trademarks, or service marks; or
388     //
389     // f) Requiring indemnification of licensors and authors of that
390     // material by anyone who conveys the material (or modified versions of
391     // it) with contractual assumptions of liability to the recipient, for
392     // any liability that these contractual assumptions directly impose on
393     // those licensors and authors.
394     //
395     // All other non-permissive additional terms are considered "further
396     //restrictions" within the meaning of section 10. If the Program as you
397     //received it, or any part of it, contains a notice stating that it is
398     //governed by this License along with a term that is a further
399     //restriction, you may remove that term. If a license document contains
400     //a further restriction but permits relicensing or conveying under this
401     //License, you may add to a covered work material governed by the terms
402     //of that license document, provided that the further restriction does
403     //not survive such relicensing or conveying.
404     //
405     // If you add terms to a covered work in accord with this section, you
406     //must place, in the relevant source files, a statement of the
407     //additional terms that apply to those files, or a notice indicating
408     //where to find the applicable terms.
409     //
410     // Additional terms, permissive or non-permissive, may be stated in the
411     //form of a separately written license, or stated as exceptions;
412     //the above requirements apply either way.
413     //
414     // 8. Termination.
415     //
416     // You may not propagate or modify a covered work except as expressly
417     //provided under this License. Any attempt otherwise to propagate or
418     //modify it is void, and will automatically terminate your rights under
419     //this License (including any patent licenses granted under the third
420     //paragraph of section 11).
421     //
422     // However, if you cease all violation of this License, then your
423     //license from a particular copyright holder is reinstated (a)
424     //provisionally, unless and until the copyright holder explicitly and
425     //finally terminates your license, and (b) permanently, if the copyright
426     //holder fails to notify you of the violation by some reasonable means
427     //prior to 60 days after the cessation.
428     //
429     // Moreover, your license from a particular copyright holder is
430     //reinstated permanently if the copyright holder notifies you of the
431     //violation by some reasonable means, this is the first time you have
432     //received notice of violation of this License (for any work) from that
433     //copyright holder, and you cure the violation prior to 30 days after
434     //your receipt of the notice.
435     //
436     // Termination of your rights under this section does not terminate the
437     //licenses of parties who have received copies or rights from you under
438     //this License. If your rights have been terminated and not permanently
439     //reinstated, you do not qualify to receive new licenses for the same
440     //material under section 10.
441     //
442     // 9. Acceptance Not Required for Having Copies.
443     //
444     // You are not required to accept this License in order to receive or
445     //run a copy of the Program. Ancillary propagation of a covered work
446     //occurring solely as a consequence of using peer-to-peer transmission
447     //to receive a copy likewise does not require acceptance. However,
448     //nothing other than this License grants you permission to propagate or
449     //modify any covered work. These actions infringe copyright if you do
450     //not accept this License. Therefore, by modifying or propagating a
451     //covered work, you indicate your acceptance of this License to do so.
452     //
453     // 10. Automatic Licensing of Downstream Recipients.
454     //
455     // Each time you convey a covered work, the recipient automatically
456     //receives a license from the original licensors, to run, modify and
457     //propagate that work, subject to this License. You are not responsible
458     //for enforcing compliance by third parties with this License.
459     //
460     // An "entity transaction" is a transaction transferring control of an
461     //organization, or substantially all assets of one, or subdividing an
462     //organization, or merging organizations. If propagation of a covered
463     //work results from an entity transaction, each party to that
464     //transaction who receives a copy of the work also receives whatever
465     //licenses to the work the party's predecessor in interest had or could
466     //give under the previous paragraph, plus a right to possession of the
467     //Corresponding Source of the work from the predecessor in interest, if
468     //the predecessor has it or can get it with reasonable efforts.
469     //
470     // You may not impose any further restrictions on the exercise of the
471     //rights granted or affirmed under this License. For example, you may
472     //not impose a license fee, royalty, or other charge for exercise of
473     //rights granted under this License, and you may not initiate litigation
474     //(including a cross-claim or counterclaim in a lawsuit) alleging that
475     //any patent claim is infringed by making, using, selling, offering for
476     //sale, or importing the Program or any portion of it.
477     //
478     // 11. Patents.
479     //
480     // A "contributor" is a copyright holder who authorizes use under this
481     //License of the Program or a work on which the Program is based. The
482     //work thus licensed is called the contributor's "contributor version".
483     //
484     // A contributor's "essential patent claims" are all patent claims
485     //owned or controlled by the contributor, whether already acquired or
486     //hereafter acquired, that would be infringed by some manner, permitted
487     //by this License, of making, using, or selling its contributor version,
488     //but do not include claims that would be infringed only as a
489     //consequence of further modification of the contributor version. For
490     //purposes of this definition, "control" includes the right to grant
491     //patent sublicenses in a manner consistent with the requirements of
492     //this License.
493     //
494     // Each contributor grants you a non-exclusive, worldwide, royalty-free
495     //patent license under the contributor's essential patent claims, to
496     //make, use, sell, offer for sale, import and otherwise run, modify and
497     //propagate the contents of its contributor version.
498     //
499     // In the following three paragraphs, a "patent license" is any express
500     //agreement or commitment, however denominated, not to enforce a patent
501     //(such as an express permission to practice a patent or covenant not to
502     //sue for patent infringement). To "grant" such a patent license to a
503     //party means to make such an agreement or commitment not to enforce a
504     //patent against the party.
505     //
506     // If you convey a covered work, knowingly relying on a patent license,
507     //and the Corresponding Source of the work is not available for anyone
508     //to copy, free of charge and under the terms of this License, through a
509     //publicly available network server or other readily accessible means,
510     //then you must either (1) cause the Corresponding Source to be so
511     //available, or (2) arrange to deprive yourself of the benefit of the
512     //patent license for this particular work, or (3) arrange, in a manner
513     //consistent with the requirements of this License, to extend the patent
514     //license to downstream recipients. "Knowingly relying" means you have
515     //actual knowledge that, but for the patent license, your conveying the
516     //covered work in a country, or your recipient's use of the covered work
517     //in a country, would infringe one or more identifiable patents in that
518     //country that you have reason to believe are valid.
519     //
520     // If, pursuant to or in connection with a single transaction or
521     //arrangement, you convey, or propagate by procuring conveyance of, a
522     //covered work, and grant a patent license to some of the parties
523     //receiving the covered work authorizing them to use, propagate, modify
524     //or convey a specific copy of the covered work, then the patent license
525     //you grant is automatically extended to all recipients of the covered
526     //work and works based on it.
527     //
528     // A patent license is "discriminatory" if it does not include within
529     //the scope of its coverage, prohibits the exercise of, or is
530     //conditioned on the non-exercise of one or more of the rights that are
531     //specifically granted under this License. You may not convey a covered
532     //work if you are a party to an arrangement with a third party that is
533     //in the business of distributing software, under which you make payment
534     //to the third party based on the extent of your activity of conveying
535     //the work, and under which the third party grants, to any of the
536     //parties who would receive the covered work from you, a discriminatory
537     //patent license (a) in connection with copies of the covered work
538     //conveyed by you (or copies made from those copies), or (b) primarily
539     //for and in connection with specific products or compilations that
540     //contain the covered work, unless you entered into that arrangement,
541     //or that patent license was granted, prior to 28 March 2007.
542     //
543     // Nothing in this License shall be construed as excluding or limiting
544     //any implied license or other defenses to infringement that may
545     //otherwise be available to you under applicable patent law.
546     //
547     // 12. No Surrender of Others' Freedom.
548     //
549     // If conditions are imposed on you (whether by court order, agreement or
550     //otherwise) that contradict the conditions of this License, they do not
551     //excuse you from the conditions of this License. If you cannot convey a
552     //covered work so as to satisfy simultaneously your obligations under this
553     //License and any other pertinent obligations, then as a consequence you may
554     //not convey it at all. For example, if you agree to terms that obligate you
555     //to collect a royalty for further conveying from those to whom you convey
556     //the Program, the only way you could satisfy both those terms and this
557     //License would be to refrain entirely from conveying the Program.
558     //
559     // 13. Use with the GNU Affero General Public License.
560     //
561     // Notwithstanding any other provision of this License, you have
562     //permission to link or combine any covered work with a work licensed
563     //under version 3 of the GNU Affero General Public License into a single
564     //combined work, and to convey the resulting work. The terms of this
565     //License will continue to apply to the part which is the covered work,
566     //but the special requirements of the GNU Affero General Public License,
567     //section 13, concerning interaction through a network will apply to the
568     //combination as such.
569     //
570     // 14. Revised Versions of this License.
571     //
572     // The Free Software Foundation may publish revised and/or new versions of
573     //the GNU General Public License from time to time. Such new versions will
574     //be similar in spirit to the present version, but may differ in detail to
575     //address new problems or concerns.
576     //
577     // Each version is given a distinguishing version number. If the
578     //Program specifies that a certain numbered version of the GNU General
579     //Public License "or any later version" applies to it, you have the
580     //option of following the terms and conditions either of that numbered
581     //version or of any later version published by the Free Software
582     //Foundation. If the Program does not specify a version number of the
583     //GNU General Public License, you may choose any version ever published
584     //by the Free Software Foundation.
585     //
586     // If the Program specifies that a proxy can decide which future
587     //versions of the GNU General Public License can be used, that proxy's
588     //public statement of acceptance of a version permanently authorizes you
589     //to choose that version for the Program.
590     //
591     // Later license versions may give you additional or different
592     //permissions. However, no additional obligations are imposed on any
593     //author or copyright holder as a result of your choosing to follow a
594     //later version.
595     //
596     // 15. Disclaimer of Warranty.
597     //
598     // THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
599     //APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
600     //HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
601     //OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
602     //THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
603     //PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
604     //IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
605     //ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
606     //
607     // 16. Limitation of Liability.
608     //
609     // IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
610     //WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
611     //THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
612     //GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
613     //USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
614     //DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
615     //PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
616     //EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
617     //SUCH DAMAGES.
618     //
619     // 17. Interpretation of Sections 15 and 16.
620     //
621     // If the disclaimer of warranty and limitation of liability provided
622     //above cannot be given local legal effect according to their terms,
623     //reviewing courts shall apply local law that most closely approximates
624     //an absolute waiver of all civil liability in connection with the
625     //Program, unless a warranty or assumption of liability accompanies a
626     //copy of the Program in return for a fee.
627     //
628     // END OF TERMS AND CONDITIONS
629     //
630     // How to Apply These Terms to Your New Programs
631     //
632     // If you develop a new program, and you want it to be of the greatest
633     //possible use to the public, the best way to achieve this is to make it
634     //free software which everyone can redistribute and change under these terms.
635     //
636     // To do so, attach the following notices to the program. It is safest
637     //to attach them to the start of each source file to most effectively
638     //state the exclusion of warranty; and each file should have at least
639     //the "copyright" line and a pointer to where the full notice is found.
640     //
641     // <one line to give the program's name and a brief idea of what it does.>
642     // Copyright (C) <year> <name of author>
643     //
644     // This program is free software: you can redistribute it and/or modify
645     // it under the terms of the GNU General Public License as published by
646     // the Free Software Foundation, either version 3 of the License, or
647     // (at your option) any later version.
648     //
649     // This program is distributed in the hope that it will be useful,
650     // but WITHOUT ANY WARRANTY; without even the implied warranty of
651     // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
652     // GNU General Public License for more details.
653     //
654     // You should have received a copy of the GNU General Public License
655     // along with this program. If not, see <http://www.gnu.org/licenses/>.
656     //
657     //Also add information on how to contact you by electronic and paper mail.
658     //
659     // If the program does terminal interaction, make it output a short
660     //notice like this when it starts in an interactive mode:
661     //
662     // <program> Copyright (C) <year> <name of author>
663     // This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
664     // This is free software, and you are welcome to redistribute it
665     // under certain conditions; type `show c' for details.
666     //
667     //The hypothetical commands `show w' and `show c' should show the appropriate
668     //parts of the General Public License. Of course, your program's commands
669     //might be different; for a GUI interface, you would use an "about box".
670     //
671     // You should also get your employer (if you work as a programmer) or school,
672     //if any, to sign a "copyright disclaimer" for the program, if necessary.
673     //For more information on this, and how to apply and follow the GNU GPL, see
674     //<http://www.gnu.org/licenses/>.
675     //
676     // The GNU General Public License does not permit incorporating your program
677     //into proprietary programs. If your program is a subroutine library, you
678     //may consider it more useful to permit linking proprietary applications with
679     //the library. If this is what you want to do, use the GNU Lesser General
680     //Public License instead of this License. But first, please read
681     //<http://www.gnu.org/philosophy/why-not-lgpl.html>.
682     //-------------------------------------------------------------------------------------------------
683     //--------------------------------------------------------------------------------
684     //This file is part of scirfmmon.
685     //
686     //scirfmmon is free software: you can redistribute it and/or modify
687     //it under the terms of the GNU General Public License as published by
688     //the Free Software Foundation, either version 3 of the License, or
689     //(at your option) any later version.
690     //
691     //scirfmmon is distributed in the hope that it will be useful,
692     //but WITHOUT ANY WARRANTY; without even the implied warranty of
693     //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
694     //GNU General Public License for more details.
695     //
696     //You should have received a copy of the GNU General Public License
697     //along with scirfmmon (see the file copying.txt). If not,
698     //see <http://www.gnu.org/licenses/>.
699     //--------------------------------------------------------------------------------
700     #define MODULE_LOG_PACKET
701    
702     #include <stdio.h>
703     #include <sys/timeb.h>
704     #include <time.h>
705    
706     #include "log_packet.h"
707    
708     #include "c_main.h"
709     #include "ccmfatal.h"
710     #include "log.h"
711     #include "miscfunc.h"
712     #include "qchar.h"
713    
714    
715     static void LOG_PACKET_log_f_setpanid (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
716     static void LOG_PACKET_log_f_acksetpanid (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
717     static void LOG_PACKET_log_f_querypanid (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
718     static void LOG_PACKET_log_f_resppanid (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
719     static void LOG_PACKET_log_f_settransad (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
720     static void LOG_PACKET_log_f_acksettransad (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
721     static void LOG_PACKET_log_f_querytransad (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
722     static void LOG_PACKET_log_f_resptransad (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
723     static void LOG_PACKET_log_f_setrfchannel (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
724     static void LOG_PACKET_log_f_acksetrfchannel (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
725     static void LOG_PACKET_log_f_queryrfchannel (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
726     static void LOG_PACKET_log_f_resprfchannel (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
727     static void LOG_PACKET_log_f_endisallrfmsgs (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
728     static void LOG_PACKET_log_f_ackendisallrfmsgs (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
729     static void LOG_PACKET_log_f_queryrxallrfmsgsstatus (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
730     static void LOG_PACKET_log_f_resprxallrfmsgsstatus (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
731     static void LOG_PACKET_log_f_endisrfacksretries (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
732     static void LOG_PACKET_log_f_ackendisrfacksretries (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
733     static void LOG_PACKET_log_f_queryrfacksretriesstatus (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
734     static void LOG_PACKET_log_f_resprfacksretriesstatus (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
735     static void LOG_PACKET_log_f_setradiofeaturesoptions (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
736     static void LOG_PACKET_log_f_acksetradiofeaturesoptions (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
737     static void LOG_PACKET_log_f_queryradiofeaturesoptions (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
738     static void LOG_PACKET_log_f_respradiofeaturesoptions (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
739     static void LOG_PACKET_log_f_querystatistics (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
740     static void LOG_PACKET_log_f_respstatistics (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
741     static void LOG_PACKET_log_f_clearstatistics (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
742     static void LOG_PACKET_log_f_ackclearstatistics (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
743     static void LOG_PACKET_log_f_settxpowerlevel (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
744     static void LOG_PACKET_log_f_acksettxpowerlevel (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
745     static void LOG_PACKET_log_f_querytxpowerlevel (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
746     static void LOG_PACKET_log_f_resptxpowerlevel (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
747     static void LOG_PACKET_log_f_savecfgnvm (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
748     static void LOG_PACKET_log_f_acksavecfgnvm (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
749     static void LOG_PACKET_log_f_queryfirmwareversion (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
750     static void LOG_PACKET_log_f_respfirmwareversion (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
751     static void LOG_PACKET_log_f_setlowpowermode (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
752     static void LOG_PACKET_log_f_acksetlowpowermode (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
753     static void LOG_PACKET_log_f_senddata (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
754     static void LOG_PACKET_log_f_acksenddata (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
755     static void LOG_PACKET_log_f_rxeddata (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
756     static void LOG_PACKET_log_f_resetrequest (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
757     static void LOG_PACKET_log_f_ackresetrequest (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
758     static void LOG_PACKET_log_f_sendmsgapp (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
759     static void LOG_PACKET_log_f_acksendmsgapp (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
760     static void LOG_PACKET_log_f_rxedmsgapp (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
761     static void LOG_PACKET_log_f_initfirmwaredownload (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
762     static void LOG_PACKET_log_f_ackinitfirmwaredownload (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
763     static void LOG_PACKET_log_f_transferfirmwareblock (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
764     static void LOG_PACKET_log_f_acktransferfirmwareblock (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
765     static void LOG_PACKET_log_f_terminatedownload (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
766     static void LOG_PACKET_log_f_ackterminatedownload (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
767     static void LOG_PACKET_log_f_setdigpincfg (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
768     static void LOG_PACKET_log_f_acksetdigpincfg (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
769     static void LOG_PACKET_log_f_querydigpincfg (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
770     static void LOG_PACKET_log_f_respdigpincfg (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
771     static void LOG_PACKET_log_f_setdigpinstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
772     static void LOG_PACKET_log_f_acksetdigpinstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
773     static void LOG_PACKET_log_f_querydigpinstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
774     static void LOG_PACKET_log_f_respdigpinstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
775     static void LOG_PACKET_log_f_queryanalogpinvalues (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
776     static void LOG_PACKET_log_f_respanalogpinvalues (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
777     static void LOG_PACKET_log_f_setanalogpinsleepstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
778     static void LOG_PACKET_log_f_acksetanalogpinsleepstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
779     static void LOG_PACKET_log_f_queryanalogpinsleepstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
780     static void LOG_PACKET_log_f_respanalogpinsleepstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
781     static void LOG_PACKET_log_f_setdigpinsleepstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
782     static void LOG_PACKET_log_f_acksetdigpinsleepstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
783     static void LOG_PACKET_log_f_querydigpinsleepstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
784     static void LOG_PACKET_log_f_respdigpinsleepstate (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
785     static void LOG_PACKET_log_f_setdebugmode (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
786     static void LOG_PACKET_log_f_acksetdebugmode (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
787     static void LOG_PACKET_log_f_setledfunctionality (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
788     static void LOG_PACKET_log_f_acksetledfunctionality (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
789     static void LOG_PACKET_log_f_rxbytesidtoid (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
790     static void LOG_PACKET_log_f_setprogrammablesettings (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
791     static void LOG_PACKET_log_f_acksetprogrammablesettings (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
792     static void LOG_PACKET_log_f_queryprogrammablesettings (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
793     static void LOG_PACKET_log_f_respprogrammablesettings (int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
794    
795    
796     struct LOG_PACKET_pkt_types_struct
797     {
798     char *tag_terse; //Terse tag for the log file and so on identifying this packet type.
799     int type_byte; //The type byte value.
800     int length_byte_min; //The minimum length byte value.
801     int length_byte_max; //The maximum length byte value.
802     int valid_from_host; //TRUE if this is valid transmitted from the host microcontroller.
803     int valid_from_rf_mod; //TRUE if this is valid transmitted from the RF module.
804     void (*logptr)(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console);
805     //Function that will parse the full packet and log any errors,
806     //then log the contents of the packet. Note that gross packet formatting
807     //errors (bad type, length, or checksum) are handled at a higher level. This
808     //only needs to flag errors in a packet with a correct type, length,
809     //and checksum.
810     };
811    
812    
813     static const struct LOG_PACKET_pkt_types_struct LOG_PACKET_pkt_type_lut_a[] =
814     {
815     //Tabulated in same order that appear in LSR documentation.
816     //p. 9
817     {
818     "SET_PAN_ID (0x01)",
819     0x01,
820     0x07,
821     0x07,
822     TRUE,
823     FALSE,
824     LOG_PACKET_log_f_setpanid
825     },
826     //p. 9
827     {
828     "ACK_SET_PAN_ID (0x81)",
829     0x81,
830     0x05,
831     0x05,
832     FALSE,
833     TRUE,
834     LOG_PACKET_log_f_acksetpanid
835     },
836     //p. 10
837     {
838     "QUERY_PAN_ID (0x02)",
839     0x02,
840     0x05,
841     0x05,
842     TRUE,
843     FALSE,
844     LOG_PACKET_log_f_querypanid
845     },
846     //p. 10
847     {
848     "RESP_PAN_ID (0x82)",
849     0x82,
850     0x07,
851     0x07,
852     FALSE,
853     TRUE,
854     LOG_PACKET_log_f_resppanid
855     },
856     //p. 11
857     {
858     "SET_TRANS_AD (0x03)",
859     0x03,
860     0x0F,
861     0x0F,
862     TRUE,
863     FALSE,
864     LOG_PACKET_log_f_settransad
865     },
866     //p. 11
867     {
868     "ACK_SET_TRANS_AD (0x83)",
869     0x83,
870     0x05,
871     0x05,
872     FALSE,
873     TRUE,
874     LOG_PACKET_log_f_acksettransad
875     },
876     //p. 12
877     {
878     "QUERY_TRANS_AD (0x04)",
879     0x04,
880     0x05,
881     0x05,
882     TRUE,
883     FALSE,
884     LOG_PACKET_log_f_querytransad
885     },
886     //p. 12
887     {
888     "RESP_TRANS_AD (0x84)",
889     0x84,
890     0x0F,
891     0x0F,
892     FALSE,
893     TRUE,
894     LOG_PACKET_log_f_resptransad
895     },
896     //p. 13
897     {
898     "SET_RF_CHANNEL (0x05)",
899     0x05,
900     0x06,
901     0x06,
902     TRUE,
903     FALSE,
904     LOG_PACKET_log_f_setrfchannel
905     },
906     //p. 13
907     {
908     "ACK_SET_RF_CHANNEL (0x85)",
909     0x85,
910     0x05,
911     0x05,
912     FALSE,
913     TRUE,
914     LOG_PACKET_log_f_acksetrfchannel
915     },
916     //p. 14
917     {
918     "QUERY_RF_CHANNEL (0x06)",
919     0x06,
920     0x05,
921     0x05,
922     TRUE,
923     FALSE,
924     LOG_PACKET_log_f_queryrfchannel
925     },
926     //p. 14
927     {
928     "RESP_RF_CHANNEL (0x86)",
929     0x86,
930     0x06,
931     0x06,
932     FALSE,
933     TRUE,
934     LOG_PACKET_log_f_resprfchannel
935     },
936     //p. 15
937     {
938     "EN_DIS_ALL_RF_MSGS (0x07)",
939     0x07,
940     0x06,
941     0x06,
942     TRUE,
943     FALSE,
944     LOG_PACKET_log_f_endisallrfmsgs
945     },
946     //p. 15
947     {
948     "ACK_EN_DIS_ALL_RF_MSGS (0x87)",
949     0x87,
950     0x05,
951     0x05,
952     FALSE,
953     TRUE,
954     LOG_PACKET_log_f_ackendisallrfmsgs
955     },
956     //p. 16
957     {
958     "QUERY_RX_ALL_RF_MSGS_STATUS (0x08)",
959     0x08,
960     0x05,
961     0x05,
962     TRUE,
963     FALSE,
964     LOG_PACKET_log_f_queryrxallrfmsgsstatus
965     },
966     //p. 16
967     {
968     "RESP_RX_ALL_RF_MSGS_STATUS (0x88)",
969     0x88,
970     0x06,
971     0x06,
972     FALSE,
973     TRUE,
974     LOG_PACKET_log_f_resprxallrfmsgsstatus
975     },
976     //p. 17
977     {
978     "EN_DIS_RF_ACKS_RETRIES (0x09)",
979     0x09,
980     0x06,
981     0x06,
982     TRUE,
983     FALSE,
984     LOG_PACKET_log_f_endisrfacksretries
985     },
986     //p. 17
987     {
988     "ACK_EN_DIS_RF_ACKS_RETRIES (0x89)",
989     0x89,
990     0x05,
991     0x05,
992     FALSE,
993     TRUE,
994     LOG_PACKET_log_f_ackendisrfacksretries
995     },
996     //p. 18
997     {
998     "QUERY_RF_ACKS_RETRIES_STATUS (0x0A)",
999     0x0A,
1000     0x05,
1001     0x05,
1002     TRUE,
1003     FALSE,
1004     LOG_PACKET_log_f_queryrfacksretriesstatus
1005     },
1006     //p. 18
1007     {
1008     "RESP_RF_ACKS_RETRIES_STATUS (0x8A)",
1009     0x8A,
1010     0x06,
1011     0x06,
1012     FALSE,
1013     TRUE,
1014     LOG_PACKET_log_f_resprfacksretriesstatus
1015     },
1016     //p. 19
1017     {
1018     "SET_RADIO_FEATURES_OPTIONS (0x0B)",
1019     0x0B,
1020     0x07,
1021     0x07,
1022     TRUE,
1023     FALSE,
1024     LOG_PACKET_log_f_setradiofeaturesoptions
1025     },
1026     //p. 19
1027     {
1028     "ACK_SET_RADIO_FEATURES_OPTIONS (0x8B)",
1029     0x8B,
1030     0x05,
1031     0x05,
1032     FALSE,
1033     TRUE,
1034     LOG_PACKET_log_f_acksetradiofeaturesoptions
1035     },
1036     //p. 20
1037     {
1038     "QUERY_RADIO_FEATURES_OPTIONS (0x0C)",
1039     0x0C,
1040     0x05,
1041     0x05,
1042     TRUE,
1043     FALSE,
1044     LOG_PACKET_log_f_queryradiofeaturesoptions
1045     },
1046     //p. 20
1047     {
1048     "RESP_RADIO_FEATURES_OPTIONS (0x8C)",
1049     0x8C,
1050     0x07,
1051     0x07,
1052     FALSE,
1053     TRUE,
1054     LOG_PACKET_log_f_respradiofeaturesoptions
1055     },
1056     //p. 21
1057     {
1058     "QUERY_STATISTICS (0x0D)",
1059     0x0D,
1060     0x05,
1061     0x05,
1062     TRUE,
1063     FALSE,
1064     LOG_PACKET_log_f_querystatistics
1065     },
1066     //p. 21
1067     {
1068     "RESP_STATISTICS (0x8D)",
1069     0x8D,
1070     0x15,
1071     0x15,
1072     FALSE,
1073     TRUE,
1074     LOG_PACKET_log_f_respstatistics
1075     },
1076     //p. 22
1077     {
1078     "CLEAR_STATISTICS (0x0E)",
1079     0x0E,
1080     0x05,
1081     0x05,
1082     TRUE,
1083     FALSE,
1084     LOG_PACKET_log_f_clearstatistics
1085     },
1086     //p. 22
1087     {
1088     "ACK_CLEAR_STATISTICS (0x8E)",
1089     0x8E,
1090     0x05,
1091     0x05,
1092     FALSE,
1093     TRUE,
1094     LOG_PACKET_log_f_ackclearstatistics
1095     },
1096     //p. 23
1097     {
1098     "SET_TX_POWER_LEVEL (0x0F)",
1099     0x0F,
1100     0x06,
1101     0x06,
1102     TRUE,
1103     FALSE,
1104     LOG_PACKET_log_f_settxpowerlevel
1105     },
1106     //p. 23
1107     {
1108     "ACK_SET_TX_POWER_LEVEL (0x8F)",
1109     0x8F,
1110     0x05,
1111     0x05,
1112     FALSE,
1113     TRUE,
1114     LOG_PACKET_log_f_acksettxpowerlevel
1115     },
1116     //p. 24
1117     {
1118     "QUERY_TX_POWER_LEVEL (0x10)",
1119     0x10,
1120     0x05,
1121     0x05,
1122     TRUE,
1123     FALSE,
1124     LOG_PACKET_log_f_querytxpowerlevel
1125     },
1126     //p. 24
1127     {
1128     "RESP_TX_POWER_LEVEL (0x90)",
1129     0x90,
1130     0x06,
1131     0x06,
1132     FALSE,
1133     TRUE,
1134     LOG_PACKET_log_f_resptxpowerlevel
1135     },
1136     //p. 25
1137     {
1138     "SAVE_CFG_NVM (0x11)",
1139     0x11,
1140     0x05,
1141     0x05,
1142     TRUE,
1143     FALSE,
1144     LOG_PACKET_log_f_savecfgnvm
1145     },
1146     //p. 25
1147     {
1148     "ACK_SAVE_CFG_NVM (0x91)",
1149     0x91,
1150     0x05,
1151     0x05,
1152     FALSE,
1153     TRUE,
1154     LOG_PACKET_log_f_acksavecfgnvm
1155     },
1156     //p. 26
1157     {
1158     "QUERY_FIRMWARE_VERSION (0x12)",
1159     0x12,
1160     0x05,
1161     0x05,
1162     TRUE,
1163     FALSE,
1164     LOG_PACKET_log_f_queryfirmwareversion
1165     },
1166     //p. 26
1167     {
1168     "RESP_FIRMWARE_VERSION (0x92)",
1169     0x92,
1170     11,
1171     43,
1172     FALSE,
1173     TRUE,
1174     LOG_PACKET_log_f_respfirmwareversion
1175     },
1176     //p. 27
1177     {
1178     "SET_LOW_POWER_MODE (0x13)",
1179     0x13,
1180     0x06,
1181     0x06,
1182     TRUE,
1183     FALSE,
1184     LOG_PACKET_log_f_setlowpowermode
1185     },
1186     //p. 27
1187     {
1188     "ACK_SET_LOW_POWER_MODE (0x93)",
1189     0x93,
1190     0x05,
1191     0x05,
1192     FALSE,
1193     TRUE,
1194     LOG_PACKET_log_f_acksetlowpowermode
1195     },
1196     //p. 28
1197     {
1198     "SEND_DATA (0x14)",
1199     0x14,
1200     11,
1201     255,
1202     TRUE,
1203     FALSE,
1204     LOG_PACKET_log_f_senddata
1205     },
1206     //p. 28
1207     {
1208     "ACK_SEND_DATA (0x94)",
1209     0x94,
1210     0x08,
1211     0x08,
1212     FALSE,
1213     TRUE,
1214     LOG_PACKET_log_f_acksenddata
1215     },
1216     //p. 29
1217     {
1218     "RXED_DATA (0x95)",
1219     0x95,
1220     14,
1221     255,
1222     FALSE,
1223     TRUE,
1224     LOG_PACKET_log_f_rxeddata
1225     },
1226    
1227     //p. 30
1228     {
1229     "RESET_REQUEST (0x18)",
1230     0x18,
1231     0x05,
1232     0x05,
1233     TRUE,
1234     FALSE,
1235     LOG_PACKET_log_f_resetrequest
1236     },
1237     //p. 30
1238     {
1239     "ACK_RESET_REQUEST (0x98)",
1240     0x98,
1241     0x05,
1242     0x05,
1243     FALSE,
1244     TRUE,
1245     LOG_PACKET_log_f_ackresetrequest
1246     },
1247     //p. 31
1248     {
1249     "SEND_MSG_APP (0x19)",
1250     0x19,
1251     6,
1252     255,
1253     TRUE,
1254     FALSE,
1255     LOG_PACKET_log_f_sendmsgapp
1256     },
1257     //p. 31
1258     {
1259     "ACK_SEND_MSG_APP (0x99)",
1260     0x99,
1261     0x05,
1262     0x05,
1263     FALSE,
1264     TRUE,
1265     LOG_PACKET_log_f_acksendmsgapp
1266     },
1267     //p. 32
1268     {
1269     "RXED_MSG_APP (0x9A)",
1270     0x9A,
1271     6,
1272     255,
1273     FALSE,
1274     TRUE,
1275     LOG_PACKET_log_f_rxedmsgapp
1276     },
1277     //p. 33
1278     {
1279     "INIT_FIRMWARE_DOWNLOAD (0x1B)",
1280     0x1B,
1281     0x0F,
1282     0x0F,
1283     TRUE,
1284     FALSE,
1285     LOG_PACKET_log_f_initfirmwaredownload
1286     },
1287     //p. 33
1288     {
1289     "ACK_INIT_FIRMWARE_DOWNLOAD (0x9B)",
1290     0x9B,
1291     0x0E,
1292     0x0E,
1293     FALSE,
1294     TRUE,
1295     LOG_PACKET_log_f_ackinitfirmwaredownload
1296     },
1297     //p. 34
1298     {
1299     "TRANSFER_FIRMWARE_BLOCK (0x1C)",
1300     0x1C,
1301     0x4F,
1302     0x4F,
1303     TRUE,
1304     FALSE,
1305     LOG_PACKET_log_f_transferfirmwareblock
1306     },
1307     //p. 34
1308     {
1309     "ACK_TRANSFER_FIRMWARE_BLOCK (0x9C)",
1310     0x9C,
1311     0x10,
1312     0x10,
1313     FALSE,
1314     TRUE,
1315     LOG_PACKET_log_f_acktransferfirmwareblock
1316     },
1317     //p. 35
1318     {
1319     "TERMINATE_DOWNLOAD (0x1D)",
1320     0x1D,
1321     0x0D,
1322     0x0D,
1323     TRUE,
1324     FALSE,
1325     LOG_PACKET_log_f_terminatedownload
1326     },
1327     //p. 35
1328     {
1329     "ACK_TERMINATE_DOWNLOAD (0x9D)",
1330     0x9D,
1331     0x0D,
1332     0x0D,
1333     FALSE,
1334     TRUE,
1335     LOG_PACKET_log_f_ackterminatedownload
1336     },
1337     //p. 36
1338     {
1339     "SET_DIG_PIN_CFG (0x1E)",
1340     0x1E,
1341     0x08,
1342     0x08,
1343     TRUE,
1344     FALSE,
1345     LOG_PACKET_log_f_setdigpincfg
1346     },
1347     //p. 36
1348     {
1349     "ACK_SET_DIG_PIN_CFG (0x9E)",
1350     0x9E,
1351     0x05,
1352     0x05,
1353     FALSE,
1354     TRUE,
1355     LOG_PACKET_log_f_acksetdigpincfg
1356     },
1357     //p. 37
1358     {
1359     "QUERY_DIG_PIN_CFG (0x1F)",
1360     0x1F,
1361     0x05,
1362     0x05,
1363     TRUE,
1364     FALSE,
1365     LOG_PACKET_log_f_querydigpincfg
1366     },
1367     //p. 37
1368     {
1369     "RESP_DIG_PIN_CFG (0x9F)",
1370     0x9F,
1371     0x08,
1372     0x08,
1373     FALSE,
1374     TRUE,
1375     LOG_PACKET_log_f_respdigpincfg
1376     },
1377     //p. 38
1378     {
1379     "SET_DIG_PIN_STATE (0x20)",
1380     0x20,
1381     0x06,
1382     0x06,
1383     TRUE,
1384     FALSE,
1385     LOG_PACKET_log_f_setdigpinstate
1386     },
1387     //p. 38
1388     {
1389     "ACK_SET_DIG_PIN_STATE (0xA0)",
1390     0xA0,
1391     0x05,
1392     0x05,
1393     FALSE,
1394     TRUE,
1395     LOG_PACKET_log_f_acksetdigpinstate
1396     },
1397     //p. 39
1398     {
1399     "QUERY_DIG_PIN_STATE (0x21)",
1400     0x21,
1401     0x05,
1402     0x05,
1403     TRUE,
1404     FALSE,
1405     LOG_PACKET_log_f_querydigpinstate
1406     },
1407     //p. 39
1408     {
1409     "RESP_DIG_PIN_STATE (0xA1)",
1410     0xA1,
1411     0x06,
1412     0x06,
1413     FALSE,
1414     TRUE,
1415     LOG_PACKET_log_f_respdigpinstate
1416     },
1417     //p. 40
1418     {
1419     "QUERY_ANALOG_PIN_VALUES (0x22)",
1420     0x22,
1421     0x05,
1422     0x05,
1423     TRUE,
1424     FALSE,
1425     LOG_PACKET_log_f_queryanalogpinvalues
1426     },
1427     //p. 40
1428     {
1429     "RESP_ANALOG_PIN_VALUES (0xA2)",
1430     0xA2,
1431     0x09,
1432     0x09,
1433     FALSE,
1434     TRUE,
1435     LOG_PACKET_log_f_respanalogpinvalues
1436     },
1437     //p. 41
1438     {
1439     "SET_ANALOG_PIN_SLEEP_STATE (0x23)",
1440     0x23,
1441     0x07,
1442     0x07,
1443     TRUE,
1444     FALSE,
1445     LOG_PACKET_log_f_setanalogpinsleepstate
1446     },
1447     //p. 41
1448     {
1449     "ACK_SET_ANALOG_PIN_SLEEP_STATE (0xA3)",
1450     0xA3,
1451     0x05,
1452     0x05,
1453     FALSE,
1454     TRUE,
1455     LOG_PACKET_log_f_acksetanalogpinsleepstate
1456     },
1457     //p. 42
1458     {
1459     "QUERY_ANALOG_PIN_SLEEP_STATE (0x24)",
1460     0x24,
1461     0x05,
1462     0x05,
1463     TRUE,
1464     FALSE,
1465     LOG_PACKET_log_f_queryanalogpinsleepstate
1466     },
1467     //p. 42
1468     {
1469     "RESP_ANALOG_PIN_SLEEP_STATE (0xA4)",
1470     0xA4,
1471     0x07,
1472     0x07,
1473     FALSE,
1474     TRUE,
1475     LOG_PACKET_log_f_respanalogpinsleepstate
1476     },
1477     //p. 43
1478     {
1479     "SET_DIG_PIN_SLEEP_STATE (0x25)",
1480     0x25,
1481     0x08,
1482     0x08,
1483     TRUE,
1484     FALSE,
1485     LOG_PACKET_log_f_setdigpinsleepstate
1486     },
1487     //p. 43
1488     {
1489     "ACK_SET_DIG_PIN_SLEEP_STATE (0xA5)",
1490     0xA5,
1491     0x05,
1492     0x05,
1493     FALSE,
1494     TRUE,
1495     LOG_PACKET_log_f_acksetdigpinsleepstate
1496     },
1497     //p. 44
1498     {
1499     "QUERY_DIG_PIN_SLEEP_STATE (0x26)",
1500     0x26,
1501     0x05,
1502     0x05,
1503     TRUE,
1504     FALSE,
1505     LOG_PACKET_log_f_querydigpinsleepstate
1506     },
1507     //p. 44
1508     {
1509     "RESP_DIG_PIN_SLEEP_STATE (0xA6)",
1510     0xA6,
1511     0x08,
1512     0x08,
1513     FALSE,
1514     TRUE,
1515     LOG_PACKET_log_f_respdigpinsleepstate
1516     },
1517     //p. 45
1518     {
1519     "SET_DEBUG_MODE (0x27)",
1520     0x27,
1521     0x06,
1522     0x06,
1523     TRUE,
1524     FALSE,
1525     LOG_PACKET_log_f_setdebugmode
1526     },
1527     //p. 45
1528     {
1529     "ACK_SET_DEBUG_MODE (0xA7)",
1530     0xA7,
1531     0x05,
1532     0x05,
1533     FALSE,
1534     TRUE,
1535     LOG_PACKET_log_f_acksetdebugmode
1536     },
1537     //p. 47
1538     {
1539     "SET_LED_FUNCTIONALITY (0x28)",
1540     0x28,
1541     0x06,
1542     0x06,
1543     TRUE,
1544     FALSE,
1545     LOG_PACKET_log_f_setledfunctionality
1546     },
1547     //p. 47
1548     {
1549     "ACK_SET_LED_FUNCTIONALITY (0xA8)",
1550     0xA8,
1551     0x05,
1552     0x05,
1553     FALSE,
1554     TRUE,
1555     LOG_PACKET_log_f_acksetledfunctionality
1556     },
1557     //p. 49
1558     {
1559     "RX_BYTES_ID_TO_ID (0xA9)",
1560     0xA9,
1561     14,
1562     255,
1563     FALSE,
1564     TRUE,
1565     LOG_PACKET_log_f_rxbytesidtoid
1566     },
1567     //p. 50
1568     {
1569     "SET_PROGRAMMABLE_SETTINGS (0x2A)",
1570     0x2A,
1571     0x15,
1572     0x15,
1573     TRUE,
1574     FALSE,
1575     LOG_PACKET_log_f_setprogrammablesettings
1576     },
1577     //p. 50
1578     {
1579     "ACK_SET_PROGRAMMABLE_SETTINGS (0xAA)",
1580     0xAA,
1581     0x07,
1582     0x07,
1583     FALSE,
1584     TRUE,
1585     LOG_PACKET_log_f_acksetprogrammablesettings
1586     },
1587     //p. 51
1588     {
1589     "QUERY_PROGRAMMABLE_SETTINGS (0x2B)",
1590     0x2B,
1591     0x05,
1592     0x05,
1593     TRUE,
1594     FALSE,
1595     LOG_PACKET_log_f_queryprogrammablesettings
1596     },
1597     //p. 51
1598     {
1599     "RESP_PROGRAMMABLE_SETTINGS (0xAB)",
1600     0xAB,
1601     0x15,
1602     0x15,
1603     FALSE,
1604     TRUE,
1605     LOG_PACKET_log_f_respprogrammablesettings
1606     },
1607     };
1608    
1609     //Given a type and length byte, returns either:
1610     // a)The table index in the lookup table LOG_PACKET_pkt_type_lut_a[] corresponding to the
1611     // information table entry. This will be a non-negative number.
1612     // b)-1 to signal that the type byte is invalid.
1613     // c)-2 to signal that the type byte is valid but the length is invalid.
1614     //
1615     static int LOG_PACKET_type_length_lookup_a(int in_type, int in_length)
1616     {
1617     int i;
1618    
1619     for (i=0; i < (sizeof(LOG_PACKET_pkt_type_lut_a)/sizeof(LOG_PACKET_pkt_type_lut_a[0])); i++)
1620     {
1621     if (LOG_PACKET_pkt_type_lut_a[i].type_byte == in_type)
1622     {
1623     if (
1624     (in_length >= LOG_PACKET_pkt_type_lut_a[i].length_byte_min)
1625     &&
1626     (in_length <= LOG_PACKET_pkt_type_lut_a[i].length_byte_max)
1627     )
1628     {
1629     //Type and length are consistent. Return the index.
1630     return(i);
1631     }
1632     else
1633     {
1634     //Type is OK, but length is not.
1635     return(-2);
1636     }
1637     }
1638     }
1639    
1640     //If we're here, couldn't find a match on the type.
1641     return(-1);
1642     }
1643    
1644    
1645     //Logs the bytes of a message.
1646     static void LOG_PACKET_log_bytes(const struct __timeb64 *in_ts,
1647     QCHAR_TSE *in_pkts,
1648     int in_npkts,
1649     unsigned in_messagetype,
1650     unsigned in_whichlogs)
1651     {
1652     int i, j, k;
1653     const int bytes_per_line = 14;
1654     int nlines;
1655     char buf[250];
1656     char buf_sub[250];
1657    
1658     nlines = (in_npkts + bytes_per_line - 1) / bytes_per_line;
1659    
1660     for (i=0; i<nlines; i++)
1661     {
1662     strcpy_s(buf, sizeof(buf), " ");
1663    
1664     for (j=0; j<bytes_per_line; j++)
1665     {
1666     k = i * bytes_per_line + j;
1667    
1668     if (k >= in_npkts)
1669     break;
1670    
1671     sprintf_s(buf_sub, sizeof(buf_sub), "<%02X>", ((int)in_pkts[k].c) & 0xFF);
1672     strcat_s(buf, sizeof(buf), buf_sub);
1673     }
1674    
1675     LOG_write_ls(in_ts,
1676     in_messagetype,
1677     in_whichlogs,
1678     buf);
1679     }
1680     }
1681    
1682    
1683     //This is the generic packet printer. It is called when no more specific handler has been written.
1684     //
1685     static void LOG_PACKET_log_f_generic(int in_channel,
1686     const struct __timeb64 *in_ts,
1687     QCHAR_TSE *in_pkts,
1688     int in_npkts,
1689     int in_lutblentry,
1690     int in_mirror_to_console,
1691     struct __timeb64 *t_last_msg, //Static time of last message.
1692     int *first_time //Static version of whether this is the first time.
1693     )
1694     {
1695     int cspan;
1696     int mdelta;
1697     char buf[250];
1698    
1699     if (*first_time)
1700     {
1701     memcpy(t_last_msg, &(in_pkts[0].ts), sizeof(*t_last_msg));
1702     *first_time = FALSE;
1703     }
1704    
1705     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
1706     mdelta = MISCFUNC_timb64_diff_bounded_ms(t_last_msg, &(in_pkts[0].ts));
1707     memcpy(t_last_msg, &(in_pkts[0].ts), sizeof(*t_last_msg));
1708    
1709     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
1710    
1711     LOG_write_ls(&(in_pkts[0].ts),
1712     LOG_MT_ROUTINE,
1713     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
1714     buf);
1715    
1716     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
1717    
1718     LOG_write_ls(&(in_pkts[0].ts),
1719     LOG_MT_ROUTINE,
1720     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
1721     buf);
1722    
1723     //The header.
1724     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
1725     in_pkts,
1726     3,
1727     LOG_MT_ROUTINE,
1728     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
1729     //The payload.
1730     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
1731     in_pkts+3,
1732     in_npkts-5,
1733     LOG_MT_ROUTINE,
1734     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
1735     //The trailer.
1736     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
1737     in_pkts+in_npkts-2,
1738     2,
1739     LOG_MT_ROUTINE,
1740     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
1741     }
1742    
1743    
1744     static void LOG_PACKET_log_f_setpanid(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1745     {
1746     static struct __timeb64 t_last_msg;
1747     static int first_time = TRUE;
1748    
1749     LOG_PACKET_log_f_generic(in_channel,
1750     in_ts,
1751     in_pkts,
1752     in_npkts,
1753     in_lutblentry,
1754     in_mirror_to_console,
1755     &t_last_msg,
1756     &first_time);
1757     }
1758    
1759    
1760     static void LOG_PACKET_log_f_acksetpanid(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1761     {
1762     static struct __timeb64 t_last_msg;
1763     static int first_time = TRUE;
1764    
1765     LOG_PACKET_log_f_generic(in_channel,
1766     in_ts,
1767     in_pkts,
1768     in_npkts,
1769     in_lutblentry,
1770     in_mirror_to_console,
1771     &t_last_msg,
1772     &first_time);
1773     }
1774    
1775    
1776     static void LOG_PACKET_log_f_querypanid(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1777     {
1778     static struct __timeb64 t_last_msg;
1779     static int first_time = TRUE;
1780    
1781     LOG_PACKET_log_f_generic(in_channel,
1782     in_ts,
1783     in_pkts,
1784     in_npkts,
1785     in_lutblentry,
1786     in_mirror_to_console,
1787     &t_last_msg,
1788     &first_time);
1789     }
1790    
1791    
1792     static void LOG_PACKET_log_f_resppanid(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1793     {
1794     static struct __timeb64 t_last_msg;
1795     static int first_time = TRUE;
1796    
1797     LOG_PACKET_log_f_generic(in_channel,
1798     in_ts,
1799     in_pkts,
1800     in_npkts,
1801     in_lutblentry,
1802     in_mirror_to_console,
1803     &t_last_msg,
1804     &first_time);
1805     }
1806    
1807    
1808     static void LOG_PACKET_log_f_settransad(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1809     {
1810     int cspan;
1811     int mdelta;
1812     int translongad[8];
1813     int transshortad[2];
1814     static struct __timeb64 t_last_msg;
1815     static int first_time = TRUE;
1816     char buf[250];
1817    
1818     if (first_time)
1819     {
1820     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
1821     first_time = FALSE;
1822     }
1823    
1824     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
1825     mdelta = MISCFUNC_timb64_diff_bounded_ms(&t_last_msg, &(in_pkts[0].ts));
1826     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
1827    
1828     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
1829    
1830     LOG_write_ls(&(in_pkts[0].ts),
1831     LOG_MT_ROUTINE,
1832     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
1833     buf);
1834    
1835     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
1836    
1837     LOG_write_ls(&(in_pkts[0].ts),
1838     LOG_MT_ROUTINE,
1839     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
1840     buf);
1841    
1842     //The header.
1843     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
1844     in_pkts,
1845     3,
1846     LOG_MT_ROUTINE,
1847     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
1848     //The payload.
1849     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
1850     in_pkts+3,
1851     in_npkts-5,
1852     LOG_MT_ROUTINE,
1853     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
1854     //The trailer.
1855     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
1856     in_pkts+in_npkts-2,
1857     2,
1858     LOG_MT_ROUTINE,
1859     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
1860    
1861     translongad[7] = ((int)in_pkts[ 3].c) & 0xFF;
1862     translongad[6] = ((int)in_pkts[ 4].c) & 0xFF;
1863     translongad[5] = ((int)in_pkts[ 5].c) & 0xFF;
1864     translongad[4] = ((int)in_pkts[ 6].c) & 0xFF;
1865     translongad[3] = ((int)in_pkts[ 7].c) & 0xFF;
1866     translongad[2] = ((int)in_pkts[ 8].c) & 0xFF;
1867     translongad[1] = ((int)in_pkts[ 9].c) & 0xFF;
1868     translongad[0] = ((int)in_pkts[10].c) & 0xFF;
1869    
1870     transshortad[1] = ((int)in_pkts[11].c) & 0xFF;
1871     transshortad[0] = ((int)in_pkts[12].c) & 0xFF;
1872    
1873     sprintf_s(buf, sizeof(buf), " TRANS_LONG_AD: 0x%02X%02X%02X%02X%02X%02X%02X%02X, TRANS_SHORT_AD: 0x%02X%02X.",
1874     translongad[0],
1875     translongad[1],
1876     translongad[2],
1877     translongad[3],
1878     translongad[4],
1879     translongad[5],
1880     translongad[6],
1881     translongad[7],
1882     transshortad[0],
1883     transshortad[1]);
1884    
1885     LOG_write_ls(&(in_pkts[0].ts),
1886     LOG_MT_ROUTINE,
1887     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
1888     buf);
1889     }
1890    
1891    
1892     static void LOG_PACKET_log_f_acksettransad(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1893     {
1894     static struct __timeb64 t_last_msg;
1895     static int first_time = TRUE;
1896    
1897     LOG_PACKET_log_f_generic(in_channel,
1898     in_ts,
1899     in_pkts,
1900     in_npkts,
1901     in_lutblentry,
1902     in_mirror_to_console,
1903     &t_last_msg,
1904     &first_time);
1905     }
1906    
1907    
1908     static void LOG_PACKET_log_f_querytransad(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1909     {
1910     static struct __timeb64 t_last_msg;
1911     static int first_time = TRUE;
1912    
1913     LOG_PACKET_log_f_generic(in_channel,
1914     in_ts,
1915     in_pkts,
1916     in_npkts,
1917     in_lutblentry,
1918     in_mirror_to_console,
1919     &t_last_msg,
1920     &first_time);
1921     }
1922    
1923    
1924     static void LOG_PACKET_log_f_resptransad(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1925     {
1926     static struct __timeb64 t_last_msg;
1927     static int first_time = TRUE;
1928    
1929     LOG_PACKET_log_f_generic(in_channel,
1930     in_ts,
1931     in_pkts,
1932     in_npkts,
1933     in_lutblentry,
1934     in_mirror_to_console,
1935     &t_last_msg,
1936     &first_time);
1937     }
1938    
1939    
1940     static void LOG_PACKET_log_f_setrfchannel(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1941     {
1942     static struct __timeb64 t_last_msg;
1943     static int first_time = TRUE;
1944    
1945     LOG_PACKET_log_f_generic(in_channel,
1946     in_ts,
1947     in_pkts,
1948     in_npkts,
1949     in_lutblentry,
1950     in_mirror_to_console,
1951     &t_last_msg,
1952     &first_time);
1953     }
1954    
1955    
1956     static void LOG_PACKET_log_f_acksetrfchannel(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1957     {
1958     static struct __timeb64 t_last_msg;
1959     static int first_time = TRUE;
1960    
1961     LOG_PACKET_log_f_generic(in_channel,
1962     in_ts,
1963     in_pkts,
1964     in_npkts,
1965     in_lutblentry,
1966     in_mirror_to_console,
1967     &t_last_msg,
1968     &first_time);
1969     }
1970    
1971    
1972     static void LOG_PACKET_log_f_queryrfchannel(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1973     {
1974     static struct __timeb64 t_last_msg;
1975     static int first_time = TRUE;
1976    
1977     LOG_PACKET_log_f_generic(in_channel,
1978     in_ts,
1979     in_pkts,
1980     in_npkts,
1981     in_lutblentry,
1982     in_mirror_to_console,
1983     &t_last_msg,
1984     &first_time);
1985     }
1986    
1987    
1988     static void LOG_PACKET_log_f_resprfchannel(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
1989     {
1990     static struct __timeb64 t_last_msg;
1991     static int first_time = TRUE;
1992    
1993     LOG_PACKET_log_f_generic(in_channel,
1994     in_ts,
1995     in_pkts,
1996     in_npkts,
1997     in_lutblentry,
1998     in_mirror_to_console,
1999     &t_last_msg,
2000     &first_time);
2001     }
2002    
2003    
2004     static void LOG_PACKET_log_f_endisallrfmsgs(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2005     {
2006     static struct __timeb64 t_last_msg;
2007     static int first_time = TRUE;
2008    
2009     LOG_PACKET_log_f_generic(in_channel,
2010     in_ts,
2011     in_pkts,
2012     in_npkts,
2013     in_lutblentry,
2014     in_mirror_to_console,
2015     &t_last_msg,
2016     &first_time);
2017     }
2018    
2019    
2020     static void LOG_PACKET_log_f_ackendisallrfmsgs(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2021     {
2022     static struct __timeb64 t_last_msg;
2023     static int first_time = TRUE;
2024    
2025     LOG_PACKET_log_f_generic(in_channel,
2026     in_ts,
2027     in_pkts,
2028     in_npkts,
2029     in_lutblentry,
2030     in_mirror_to_console,
2031     &t_last_msg,
2032     &first_time);
2033     }
2034    
2035    
2036     static void LOG_PACKET_log_f_queryrxallrfmsgsstatus(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2037     {
2038     static struct __timeb64 t_last_msg;
2039     static int first_time = TRUE;
2040    
2041     LOG_PACKET_log_f_generic(in_channel,
2042     in_ts,
2043     in_pkts,
2044     in_npkts,
2045     in_lutblentry,
2046     in_mirror_to_console,
2047     &t_last_msg,
2048     &first_time);
2049     }
2050    
2051    
2052     static void LOG_PACKET_log_f_resprxallrfmsgsstatus(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2053     {
2054     static struct __timeb64 t_last_msg;
2055     static int first_time = TRUE;
2056    
2057     LOG_PACKET_log_f_generic(in_channel,
2058     in_ts,
2059     in_pkts,
2060     in_npkts,
2061     in_lutblentry,
2062     in_mirror_to_console,
2063     &t_last_msg,
2064     &first_time);
2065     }
2066    
2067    
2068     static void LOG_PACKET_log_f_endisrfacksretries(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2069     {
2070     static struct __timeb64 t_last_msg;
2071     static int first_time = TRUE;
2072    
2073     LOG_PACKET_log_f_generic(in_channel,
2074     in_ts,
2075     in_pkts,
2076     in_npkts,
2077     in_lutblentry,
2078     in_mirror_to_console,
2079     &t_last_msg,
2080     &first_time);
2081     }
2082    
2083     static void LOG_PACKET_log_f_ackendisrfacksretries(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2084     {
2085     static struct __timeb64 t_last_msg;
2086     static int first_time = TRUE;
2087    
2088     LOG_PACKET_log_f_generic(in_channel,
2089     in_ts,
2090     in_pkts,
2091     in_npkts,
2092     in_lutblentry,
2093     in_mirror_to_console,
2094     &t_last_msg,
2095     &first_time);
2096     }
2097    
2098    
2099     static void LOG_PACKET_log_f_queryrfacksretriesstatus(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2100     {
2101     static struct __timeb64 t_last_msg;
2102     static int first_time = TRUE;
2103    
2104     LOG_PACKET_log_f_generic(in_channel,
2105     in_ts,
2106     in_pkts,
2107     in_npkts,
2108     in_lutblentry,
2109     in_mirror_to_console,
2110     &t_last_msg,
2111     &first_time);
2112     }
2113    
2114    
2115     static void LOG_PACKET_log_f_resprfacksretriesstatus(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2116     {
2117     static struct __timeb64 t_last_msg;
2118     static int first_time = TRUE;
2119    
2120     LOG_PACKET_log_f_generic(in_channel,
2121     in_ts,
2122     in_pkts,
2123     in_npkts,
2124     in_lutblentry,
2125     in_mirror_to_console,
2126     &t_last_msg,
2127     &first_time);
2128     }
2129    
2130    
2131     static void LOG_PACKET_log_f_setradiofeaturesoptions(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2132     {
2133     static struct __timeb64 t_last_msg;
2134     static int first_time = TRUE;
2135    
2136     LOG_PACKET_log_f_generic(in_channel,
2137     in_ts,
2138     in_pkts,
2139     in_npkts,
2140     in_lutblentry,
2141     in_mirror_to_console,
2142     &t_last_msg,
2143     &first_time);
2144     }
2145    
2146    
2147     static void LOG_PACKET_log_f_acksetradiofeaturesoptions(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2148     {
2149     static struct __timeb64 t_last_msg;
2150     static int first_time = TRUE;
2151    
2152     LOG_PACKET_log_f_generic(in_channel,
2153     in_ts,
2154     in_pkts,
2155     in_npkts,
2156     in_lutblentry,
2157     in_mirror_to_console,
2158     &t_last_msg,
2159     &first_time);
2160     }
2161    
2162    
2163     static void LOG_PACKET_log_f_queryradiofeaturesoptions(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2164     {
2165     static struct __timeb64 t_last_msg;
2166     static int first_time = TRUE;
2167    
2168     LOG_PACKET_log_f_generic(in_channel,
2169     in_ts,
2170     in_pkts,
2171     in_npkts,
2172     in_lutblentry,
2173     in_mirror_to_console,
2174     &t_last_msg,
2175     &first_time);
2176     }
2177    
2178    
2179     static void LOG_PACKET_log_f_respradiofeaturesoptions(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2180     {
2181     static struct __timeb64 t_last_msg;
2182     static int first_time = TRUE;
2183    
2184     LOG_PACKET_log_f_generic(in_channel,
2185     in_ts,
2186     in_pkts,
2187     in_npkts,
2188     in_lutblentry,
2189     in_mirror_to_console,
2190     &t_last_msg,
2191     &first_time);
2192     }
2193    
2194    
2195     static void LOG_PACKET_log_f_querystatistics(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2196     {
2197     static struct __timeb64 t_last_msg;
2198     static int first_time = TRUE;
2199    
2200     LOG_PACKET_log_f_generic(in_channel,
2201     in_ts,
2202     in_pkts,
2203     in_npkts,
2204     in_lutblentry,
2205     in_mirror_to_console,
2206     &t_last_msg,
2207     &first_time);
2208     }
2209    
2210    
2211     static void LOG_PACKET_log_f_respstatistics(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2212     {
2213     static struct __timeb64 t_last_msg;
2214     static int first_time = TRUE;
2215    
2216     LOG_PACKET_log_f_generic(in_channel,
2217     in_ts,
2218     in_pkts,
2219     in_npkts,
2220     in_lutblentry,
2221     in_mirror_to_console,
2222     &t_last_msg,
2223     &first_time);
2224     }
2225    
2226    
2227     static void LOG_PACKET_log_f_clearstatistics(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2228     {
2229     static struct __timeb64 t_last_msg;
2230     static int first_time = TRUE;
2231    
2232     LOG_PACKET_log_f_generic(in_channel,
2233     in_ts,
2234     in_pkts,
2235     in_npkts,
2236     in_lutblentry,
2237     in_mirror_to_console,
2238     &t_last_msg,
2239     &first_time);
2240     }
2241    
2242    
2243     static void LOG_PACKET_log_f_ackclearstatistics(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2244     {
2245     static struct __timeb64 t_last_msg;
2246     static int first_time = TRUE;
2247    
2248     LOG_PACKET_log_f_generic(in_channel,
2249     in_ts,
2250     in_pkts,
2251     in_npkts,
2252     in_lutblentry,
2253     in_mirror_to_console,
2254     &t_last_msg,
2255     &first_time);
2256     }
2257    
2258    
2259     static void LOG_PACKET_log_f_settxpowerlevel(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2260     {
2261     static struct __timeb64 t_last_msg;
2262     static int first_time = TRUE;
2263    
2264     LOG_PACKET_log_f_generic(in_channel,
2265     in_ts,
2266     in_pkts,
2267     in_npkts,
2268     in_lutblentry,
2269     in_mirror_to_console,
2270     &t_last_msg,
2271     &first_time);
2272     }
2273    
2274    
2275     static void LOG_PACKET_log_f_acksettxpowerlevel(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2276     {
2277     static struct __timeb64 t_last_msg;
2278     static int first_time = TRUE;
2279    
2280     LOG_PACKET_log_f_generic(in_channel,
2281     in_ts,
2282     in_pkts,
2283     in_npkts,
2284     in_lutblentry,
2285     in_mirror_to_console,
2286     &t_last_msg,
2287     &first_time);
2288     }
2289    
2290    
2291     static void LOG_PACKET_log_f_querytxpowerlevel(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2292     {
2293     static struct __timeb64 t_last_msg;
2294     static int first_time = TRUE;
2295    
2296     LOG_PACKET_log_f_generic(in_channel,
2297     in_ts,
2298     in_pkts,
2299     in_npkts,
2300     in_lutblentry,
2301     in_mirror_to_console,
2302     &t_last_msg,
2303     &first_time);
2304     }
2305    
2306    
2307     static void LOG_PACKET_log_f_resptxpowerlevel(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2308     {
2309     static struct __timeb64 t_last_msg;
2310     static int first_time = TRUE;
2311    
2312     LOG_PACKET_log_f_generic(in_channel,
2313     in_ts,
2314     in_pkts,
2315     in_npkts,
2316     in_lutblentry,
2317     in_mirror_to_console,
2318     &t_last_msg,
2319     &first_time);
2320     }
2321    
2322    
2323     static void LOG_PACKET_log_f_savecfgnvm(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2324     {
2325     static struct __timeb64 t_last_msg;
2326     static int first_time = TRUE;
2327    
2328     LOG_PACKET_log_f_generic(in_channel,
2329     in_ts,
2330     in_pkts,
2331     in_npkts,
2332     in_lutblentry,
2333     in_mirror_to_console,
2334     &t_last_msg,
2335     &first_time);
2336     }
2337    
2338    
2339     static void LOG_PACKET_log_f_acksavecfgnvm(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2340     {
2341     static struct __timeb64 t_last_msg;
2342     static int first_time = TRUE;
2343    
2344     LOG_PACKET_log_f_generic(in_channel,
2345     in_ts,
2346     in_pkts,
2347     in_npkts,
2348     in_lutblentry,
2349     in_mirror_to_console,
2350     &t_last_msg,
2351     &first_time);
2352     }
2353    
2354    
2355     static void LOG_PACKET_log_f_queryfirmwareversion(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2356     {
2357     static struct __timeb64 t_last_msg;
2358     static int first_time = TRUE;
2359    
2360     LOG_PACKET_log_f_generic(in_channel,
2361     in_ts,
2362     in_pkts,
2363     in_npkts,
2364     in_lutblentry,
2365     in_mirror_to_console,
2366     &t_last_msg,
2367     &first_time);
2368     }
2369    
2370    
2371     static void LOG_PACKET_log_f_respfirmwareversion(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2372     {
2373     static struct __timeb64 t_last_msg;
2374     static int first_time = TRUE;
2375    
2376     LOG_PACKET_log_f_generic(in_channel,
2377     in_ts,
2378     in_pkts,
2379     in_npkts,
2380     in_lutblentry,
2381     in_mirror_to_console,
2382     &t_last_msg,
2383     &first_time);
2384     }
2385    
2386    
2387     static void LOG_PACKET_log_f_setlowpowermode(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2388     {
2389     static struct __timeb64 t_last_msg;
2390     static int first_time = TRUE;
2391    
2392     LOG_PACKET_log_f_generic(in_channel,
2393     in_ts,
2394     in_pkts,
2395     in_npkts,
2396     in_lutblentry,
2397     in_mirror_to_console,
2398     &t_last_msg,
2399     &first_time);
2400     }
2401    
2402    
2403     static void LOG_PACKET_log_f_acksetlowpowermode(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2404     {
2405     static struct __timeb64 t_last_msg;
2406     static int first_time = TRUE;
2407    
2408     LOG_PACKET_log_f_generic(in_channel,
2409     in_ts,
2410     in_pkts,
2411     in_npkts,
2412     in_lutblentry,
2413     in_mirror_to_console,
2414     &t_last_msg,
2415     &first_time);
2416     }
2417    
2418    
2419     static void LOG_PACKET_log_f_senddata(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2420     {
2421     int idx;
2422     int cspan;
2423     int mdelta;
2424     int packetid;
2425     int targetsender;
2426     int addressmode;
2427     int desttransad[8];
2428     static struct __timeb64 t_last_msg;
2429     static int first_time = TRUE;
2430     char buf[250];
2431    
2432     if (first_time)
2433     {
2434     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
2435     first_time = FALSE;
2436     }
2437    
2438     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
2439     mdelta = MISCFUNC_timb64_diff_bounded_ms(&t_last_msg, &(in_pkts[0].ts));
2440     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
2441    
2442     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
2443    
2444     LOG_write_ls(&(in_pkts[0].ts),
2445     LOG_MT_ROUTINE,
2446     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2447     buf);
2448    
2449     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
2450    
2451     LOG_write_ls(&(in_pkts[0].ts),
2452     LOG_MT_ROUTINE,
2453     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2454     buf);
2455    
2456     //The header.
2457     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2458     in_pkts,
2459     3,
2460     LOG_MT_ROUTINE,
2461     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2462     //The payload.
2463     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2464     in_pkts+3,
2465     in_npkts-5,
2466     LOG_MT_ROUTINE,
2467     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2468     //The trailer.
2469     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2470     in_pkts+in_npkts-2,
2471     2,
2472     LOG_MT_ROUTINE,
2473     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2474    
2475     packetid = ((int)in_pkts[3].c) & 0xFF;
2476     targetsender = ((int)in_pkts[4].c) & 0xFF;
2477     addressmode = ((int)in_pkts[5].c) & 0xFF;
2478    
2479     sprintf_s(buf, sizeof(buf), " PACKET_ID: 0x%02X, TARGET_SENDER: 0x%02X, ADDRESS_MODE: 0x%02X.",
2480     packetid,
2481     targetsender,
2482     addressmode
2483     );
2484    
2485     LOG_write_ls(&(in_pkts[0].ts),
2486     LOG_MT_ROUTINE,
2487     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2488     buf);
2489    
2490     //Flag a bad address mode if it exists.
2491     if ((addressmode != 0x00) && (addressmode != 0x10))
2492     {
2493     sprintf_s(buf, sizeof(buf), "CH%02d:ADDRESS_MODE error in %s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
2494    
2495     LOG_write_ls(&(in_pkts[0].ts),
2496     LOG_MT_ALERT,
2497     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
2498     buf);
2499    
2500     sprintf_s(buf, sizeof(buf), " ADDRESS_MODE: 0x%02X.", addressmode);
2501    
2502     LOG_write_ls(&(in_pkts[0].ts),
2503     LOG_MT_ALERT,
2504     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
2505     buf);
2506     }
2507    
2508     //Form up the destination address. It may be short or long.
2509     FillMemory(desttransad, sizeof(desttransad), 0);
2510    
2511     idx = 6;
2512     if (in_npkts > idx)
2513     {
2514     desttransad[7] = ((int)in_pkts[idx].c) & 0xFF;
2515     }
2516     idx++;
2517     if (in_npkts > idx)
2518     {
2519     desttransad[6] = ((int)in_pkts[idx].c) & 0xFF;
2520     }
2521     idx++;
2522    
2523     if (addressmode & 0xf0) //Long address.
2524     {
2525     if (in_npkts > idx)
2526     {
2527     desttransad[5] = ((int)in_pkts[idx].c) & 0xFF;
2528     }
2529     idx++;
2530     if (in_npkts > idx)
2531     {
2532     desttransad[4] = ((int)in_pkts[idx].c) & 0xFF;
2533     }
2534     idx++;
2535     if (in_npkts > idx)
2536     {
2537     desttransad[3] = ((int)in_pkts[idx].c) & 0xFF;
2538     }
2539     idx++;
2540     if (in_npkts > idx)
2541     {
2542     desttransad[2] = ((int)in_pkts[idx].c) & 0xFF;
2543     }
2544     idx++;
2545     if (in_npkts > idx)
2546     {
2547     desttransad[1] = ((int)in_pkts[idx].c) & 0xFF;
2548     }
2549     idx++;
2550     if (in_npkts > idx)
2551     {
2552     desttransad[0] = ((int)in_pkts[idx].c) & 0xFF;
2553     }
2554     idx++;
2555     }
2556    
2557     //If we've overshot the data area (and the assumption is made that there is at least one
2558     //byte of data), this means that the address modes were inconsistent with the message length.
2559     //This is an error.
2560     if (idx > (in_npkts - 3))
2561     {
2562     sprintf_s(buf, sizeof(buf), "CH%02d:ADDRESS_MODE and message length error in %s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
2563    
2564     LOG_write_ls(&(in_pkts[0].ts),
2565     LOG_MT_ALERT,
2566     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
2567     buf);
2568     }
2569    
2570     //Emit the destination transceiver address. There is some variability due
2571     //to the address mode.
2572     if (addressmode & 0xf0) //Destination transceiver long address.
2573     {
2574     sprintf_s(buf,
2575     sizeof(buf),
2576     " DST_TRANS_AD: 0x%02X%02X%02X%02X02X%02X%02X%02X.",
2577     ((int)desttransad[0]) & 0xFF,
2578     ((int)desttransad[1]) & 0xFF,
2579     ((int)desttransad[2]) & 0xFF,
2580     ((int)desttransad[3]) & 0xFF,
2581     ((int)desttransad[4]) & 0xFF,
2582     ((int)desttransad[5]) & 0xFF,
2583     ((int)desttransad[6]) & 0xFF,
2584     ((int)desttransad[7]) & 0xFF);
2585     }
2586     else
2587     {
2588     sprintf_s(buf,
2589     sizeof(buf),
2590     " DST_TRANS_AD: 0x%02X%02X.",
2591     ((int)desttransad[6]) & 0xFF,
2592     ((int)desttransad[7]) & 0xFF);
2593     }
2594    
2595     //And write the line to the log.
2596     LOG_write_ls(&(in_pkts[0].ts),
2597     LOG_MT_ROUTINE,
2598     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2599     buf);
2600    
2601     //Write the data bytes.
2602     LOG_write_ls(&(in_pkts[0].ts),
2603     LOG_MT_ROUTINE,
2604     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2605     " DATA:");
2606    
2607     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2608     in_pkts + idx,
2609     in_npkts - idx - 2,
2610     LOG_MT_ROUTINE,
2611     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2612     }
2613    
2614    
2615     static void LOG_PACKET_log_f_acksenddata(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2616     {
2617     int cspan;
2618     int mdelta;
2619     int packetid;
2620     int acknack;
2621     int nretries;
2622     static struct __timeb64 t_last_msg;
2623     static int first_time = TRUE;
2624     char buf[250];
2625    
2626     if (first_time)
2627     {
2628     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
2629     first_time = FALSE;
2630     }
2631    
2632     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
2633     mdelta = MISCFUNC_timb64_diff_bounded_ms(&t_last_msg, &(in_pkts[0].ts));
2634     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
2635    
2636     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
2637    
2638     LOG_write_ls(&(in_pkts[0].ts),
2639     LOG_MT_ROUTINE,
2640     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2641     buf);
2642    
2643     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
2644    
2645     LOG_write_ls(&(in_pkts[0].ts),
2646     LOG_MT_ROUTINE,
2647     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2648     buf);
2649    
2650     //The header.
2651     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2652     in_pkts,
2653     3,
2654     LOG_MT_ROUTINE,
2655     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2656     //The payload.
2657     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2658     in_pkts+3,
2659     in_npkts-5,
2660     LOG_MT_ROUTINE,
2661     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2662     //The trailer.
2663     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2664     in_pkts+in_npkts-2,
2665     2,
2666     LOG_MT_ROUTINE,
2667     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2668    
2669     packetid = ((int)in_pkts[ 3].c) & 0xFF;
2670     acknack = ((int)in_pkts[ 4].c) & 0xFF;
2671     nretries = ((int)in_pkts[ 5].c) & 0xFF;
2672    
2673     sprintf_s(buf, sizeof(buf), " PACKET_ID: 0x%02X, ACK_NACK: 0x%02X, NUM_RETRIES: 0x%02X.",
2674     packetid,
2675     acknack,
2676     nretries
2677     );
2678    
2679     LOG_write_ls(&(in_pkts[0].ts),
2680     LOG_MT_ROUTINE,
2681     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2682     buf);
2683    
2684     if (acknack != 0x01)
2685     {
2686     sprintf_s(buf, sizeof(buf), "CH%02d:ACK_NACK error in %s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
2687    
2688     LOG_write_ls(&(in_pkts[0].ts),
2689     LOG_MT_ALERT,
2690     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
2691     buf);
2692    
2693     sprintf_s(buf, sizeof(buf), " ACK_NACK: 0x%02X.", acknack);
2694    
2695     LOG_write_ls(&(in_pkts[0].ts),
2696     LOG_MT_ALERT,
2697     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
2698     buf);
2699     }
2700     }
2701    
2702    
2703     static void LOG_PACKET_log_f_rxeddata(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2704     {
2705     int idx;
2706     int cspan;
2707     int mdelta;
2708     int packetid;
2709     int targetsender;
2710     int lqi;
2711     int addressmode;
2712     int desttransad[8];
2713     int srctransad[8];
2714     static struct __timeb64 t_last_msg;
2715     static int first_time = TRUE;
2716     char buf[250];
2717    
2718     if (first_time)
2719     {
2720     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
2721     first_time = FALSE;
2722     }
2723    
2724     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
2725     mdelta = MISCFUNC_timb64_diff_bounded_ms(&t_last_msg, &(in_pkts[0].ts));
2726     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
2727    
2728     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
2729    
2730     LOG_write_ls(&(in_pkts[0].ts),
2731     LOG_MT_ROUTINE,
2732     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2733     buf);
2734    
2735     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
2736    
2737     LOG_write_ls(&(in_pkts[0].ts),
2738     LOG_MT_ROUTINE,
2739     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2740     buf);
2741    
2742     //The header.
2743     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2744     in_pkts,
2745     3,
2746     LOG_MT_ROUTINE,
2747     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2748     //The payload.
2749     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2750     in_pkts+3,
2751     in_npkts-5,
2752     LOG_MT_ROUTINE,
2753     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2754     //The trailer.
2755     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2756     in_pkts+in_npkts-2,
2757     2,
2758     LOG_MT_ROUTINE,
2759     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2760    
2761     packetid = ((int)in_pkts[3].c) & 0xFF;
2762     targetsender = ((int)in_pkts[4].c) & 0xFF;
2763     lqi = ((int)in_pkts[5].c) & 0xFF;
2764    
2765     sprintf_s(buf, sizeof(buf), " PACKET_ID: 0x%02X, TARGET_SENDER: 0x%02X, LQI: 0x%02X.",
2766     packetid,
2767     targetsender,
2768     lqi
2769     );
2770    
2771     LOG_write_ls(&(in_pkts[0].ts),
2772     LOG_MT_ROUTINE,
2773     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2774     buf);
2775    
2776     addressmode = ((int)in_pkts[6].c) & 0xFF;
2777    
2778     sprintf_s(buf, sizeof(buf), " ADDRESS_MODE: 0x%02X.",
2779     addressmode);
2780    
2781     LOG_write_ls(&(in_pkts[0].ts),
2782     LOG_MT_ROUTINE,
2783     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2784     buf);
2785    
2786     //Flag a bad address mode if it exists.
2787     if ((addressmode != 0x00) && (addressmode != 0x01) && (addressmode != 0x10) && (addressmode != 0x11))
2788     {
2789     sprintf_s(buf, sizeof(buf), "CH%02d:ADDRESS_MODE error in %s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
2790    
2791     LOG_write_ls(&(in_pkts[0].ts),
2792     LOG_MT_ALERT,
2793     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
2794     buf);
2795    
2796     sprintf_s(buf, sizeof(buf), " ADDRESS_MODE: 0x%02X.", addressmode);
2797    
2798     LOG_write_ls(&(in_pkts[0].ts),
2799     LOG_MT_ALERT,
2800     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
2801     buf);
2802     }
2803    
2804     //Form up the destination address. It may be short or long.
2805     FillMemory(desttransad, sizeof(desttransad), 0);
2806    
2807     idx = 7;
2808     if (in_npkts > idx)
2809     {
2810     desttransad[7] = ((int)in_pkts[idx].c) & 0xFF;
2811     }
2812     idx++;
2813     if (in_npkts > idx)
2814     {
2815     desttransad[6] = ((int)in_pkts[idx].c) & 0xFF;
2816     }
2817     idx++;
2818    
2819     if (addressmode & 0xf0) //Long address.
2820     {
2821     if (in_npkts > idx)
2822     {
2823     desttransad[5] = ((int)in_pkts[idx].c) & 0xFF;
2824     }
2825     idx++;
2826     if (in_npkts > idx)
2827     {
2828     desttransad[4] = ((int)in_pkts[idx].c) & 0xFF;
2829     }
2830     idx++;
2831     if (in_npkts > idx)
2832     {
2833     desttransad[3] = ((int)in_pkts[idx].c) & 0xFF;
2834     }
2835     idx++;
2836     if (in_npkts > idx)
2837     {
2838     desttransad[2] = ((int)in_pkts[idx].c) & 0xFF;
2839     }
2840     idx++;
2841     if (in_npkts > idx)
2842     {
2843     desttransad[1] = ((int)in_pkts[idx].c) & 0xFF;
2844     }
2845     idx++;
2846     if (in_npkts > idx)
2847     {
2848     desttransad[0] = ((int)in_pkts[idx].c) & 0xFF;
2849     }
2850     idx++;
2851     }
2852    
2853     //Form up the source address. It may be short or long.
2854     FillMemory(srctransad, sizeof(srctransad), 0);
2855    
2856     if (in_npkts > idx)
2857     {
2858     srctransad[7] = ((int)in_pkts[idx].c) & 0xFF;
2859     }
2860     idx++;
2861     if (in_npkts > idx)
2862     {
2863     srctransad[6] = ((int)in_pkts[idx].c) & 0xFF;
2864     }
2865     idx++;
2866    
2867     if (addressmode & 0x0f) //Long address.
2868     {
2869     if (in_npkts > idx)
2870     {
2871     srctransad[5] = ((int)in_pkts[idx].c) & 0xFF;
2872     }
2873     idx++;
2874     if (in_npkts > idx)
2875     {
2876     srctransad[4] = ((int)in_pkts[idx].c) & 0xFF;
2877     }
2878     idx++;
2879     if (in_npkts > idx)
2880     {
2881     srctransad[3] = ((int)in_pkts[idx].c) & 0xFF;
2882     }
2883     idx++;
2884     if (in_npkts > idx)
2885     {
2886     srctransad[2] = ((int)in_pkts[idx].c) & 0xFF;
2887     }
2888     idx++;
2889     if (in_npkts > idx)
2890     {
2891     srctransad[1] = ((int)in_pkts[idx].c) & 0xFF;
2892     }
2893     idx++;
2894     if (in_npkts > idx)
2895     {
2896     srctransad[0] = ((int)in_pkts[idx].c) & 0xFF;
2897     }
2898     idx++;
2899     }
2900    
2901     //If we've overshot the data area (and the assumption is made that there is at least one
2902     //byte of data), this means that the address modes were inconsistent with the message length.
2903     //This is an error.
2904     if (idx > (in_npkts - 3))
2905     {
2906     sprintf_s(buf, sizeof(buf), "CH%02d:ADDRESS_MODE and message length error in %s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
2907    
2908     LOG_write_ls(&(in_pkts[0].ts),
2909     LOG_MT_ALERT,
2910     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
2911     buf);
2912     }
2913    
2914     //Emit the destination transceiver and source transceiver address. There is some variability due
2915     //to the address mode.
2916     {
2917     char minibuf[250];
2918    
2919     strcpy_s(buf, sizeof(buf), " ");
2920    
2921     if (addressmode & 0xf0) //Destination transceiver long address.
2922     {
2923     sprintf_s(minibuf,
2924     sizeof(minibuf),
2925     "DST_TRANS_AD: 0x%02X%02X%02X%02X02X%02X%02X%02X,",
2926     ((int)desttransad[0]) & 0xFF,
2927     ((int)desttransad[1]) & 0xFF,
2928     ((int)desttransad[2]) & 0xFF,
2929     ((int)desttransad[3]) & 0xFF,
2930     ((int)desttransad[4]) & 0xFF,
2931     ((int)desttransad[5]) & 0xFF,
2932     ((int)desttransad[6]) & 0xFF,
2933     ((int)desttransad[7]) & 0xFF);
2934     }
2935     else
2936     {
2937     sprintf_s(minibuf,
2938     sizeof(minibuf),
2939     "DST_TRANS_AD: 0x%02X%02X,",
2940     ((int)desttransad[6]) & 0xFF,
2941     ((int)desttransad[7]) & 0xFF);
2942     }
2943    
2944     //Add in the string and some space.
2945     strcat_s(buf, sizeof(buf), minibuf);
2946     strcat_s(buf, sizeof(buf), " ");
2947    
2948     if (addressmode & 0x0f) //Source transceiver long address.
2949     {
2950     sprintf_s(minibuf,
2951     sizeof(minibuf),
2952     "SRC_TRANS_AD: 0x%02X%02X%02X%02X02X%02X%02X%02X.",
2953     ((int)srctransad[0]) & 0xFF,
2954     ((int)srctransad[1]) & 0xFF,
2955     ((int)srctransad[2]) & 0xFF,
2956     ((int)srctransad[3]) & 0xFF,
2957     ((int)srctransad[4]) & 0xFF,
2958     ((int)srctransad[5]) & 0xFF,
2959     ((int)srctransad[6]) & 0xFF,
2960     ((int)srctransad[7]) & 0xFF);
2961     }
2962     else
2963     {
2964     sprintf_s(minibuf,
2965     sizeof(minibuf),
2966     "SRC_TRANS_AD: 0x%02X%02X.",
2967     ((int)srctransad[6]) & 0xFF,
2968     ((int)srctransad[7]) & 0xFF);
2969     }
2970    
2971     //Add in the string.
2972     strcat_s(buf, sizeof(buf), minibuf);
2973    
2974     //And write the line to the log.
2975     LOG_write_ls(&(in_pkts[0].ts),
2976     LOG_MT_ROUTINE,
2977     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2978     buf);
2979     }
2980    
2981     //Write the data bytes.
2982     LOG_write_ls(&(in_pkts[0].ts),
2983     LOG_MT_ROUTINE,
2984     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
2985     " DATA:");
2986    
2987     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
2988     in_pkts + idx,
2989     in_npkts - idx - 2,
2990     LOG_MT_ROUTINE,
2991     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
2992     }
2993    
2994    
2995     static void LOG_PACKET_log_f_resetrequest(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
2996     {
2997     static struct __timeb64 t_last_msg;
2998     static int first_time = TRUE;
2999    
3000     LOG_PACKET_log_f_generic(in_channel,
3001     in_ts,
3002     in_pkts,
3003     in_npkts,
3004     in_lutblentry,
3005     in_mirror_to_console,
3006     &t_last_msg,
3007     &first_time);
3008     }
3009    
3010    
3011     static void LOG_PACKET_log_f_ackresetrequest(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3012     {
3013     static struct __timeb64 t_last_msg;
3014     static int first_time = TRUE;
3015    
3016     LOG_PACKET_log_f_generic(in_channel,
3017     in_ts,
3018     in_pkts,
3019     in_npkts,
3020     in_lutblentry,
3021     in_mirror_to_console,
3022     &t_last_msg,
3023     &first_time);
3024     }
3025    
3026    
3027     static void LOG_PACKET_log_f_sendmsgapp(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3028     {
3029     static struct __timeb64 t_last_msg;
3030     static int first_time = TRUE;
3031    
3032     LOG_PACKET_log_f_generic(in_channel,
3033     in_ts,
3034     in_pkts,
3035     in_npkts,
3036     in_lutblentry,
3037     in_mirror_to_console,
3038     &t_last_msg,
3039     &first_time);
3040     }
3041    
3042    
3043     static void LOG_PACKET_log_f_acksendmsgapp(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3044     {
3045     static struct __timeb64 t_last_msg;
3046     static int first_time = TRUE;
3047    
3048     LOG_PACKET_log_f_generic(in_channel,
3049     in_ts,
3050     in_pkts,
3051     in_npkts,
3052     in_lutblentry,
3053     in_mirror_to_console,
3054     &t_last_msg,
3055     &first_time);
3056     }
3057    
3058    
3059     static void LOG_PACKET_log_f_rxedmsgapp(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3060     {
3061     static struct __timeb64 t_last_msg;
3062     static int first_time = TRUE;
3063    
3064     LOG_PACKET_log_f_generic(in_channel,
3065     in_ts,
3066     in_pkts,
3067     in_npkts,
3068     in_lutblentry,
3069     in_mirror_to_console,
3070     &t_last_msg,
3071     &first_time);
3072     }
3073    
3074    
3075     static void LOG_PACKET_log_f_initfirmwaredownload(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3076     {
3077     static struct __timeb64 t_last_msg;
3078     static int first_time = TRUE;
3079    
3080     LOG_PACKET_log_f_generic(in_channel,
3081     in_ts,
3082     in_pkts,
3083     in_npkts,
3084     in_lutblentry,
3085     in_mirror_to_console,
3086     &t_last_msg,
3087     &first_time);
3088     }
3089    
3090    
3091     static void LOG_PACKET_log_f_ackinitfirmwaredownload(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3092     {
3093     static struct __timeb64 t_last_msg;
3094     static int first_time = TRUE;
3095    
3096     LOG_PACKET_log_f_generic(in_channel,
3097     in_ts,
3098     in_pkts,
3099     in_npkts,
3100     in_lutblentry,
3101     in_mirror_to_console,
3102     &t_last_msg,
3103     &first_time);
3104     }
3105    
3106    
3107     static void LOG_PACKET_log_f_transferfirmwareblock(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3108     {
3109     static struct __timeb64 t_last_msg;
3110     static int first_time = TRUE;
3111    
3112     LOG_PACKET_log_f_generic(in_channel,
3113     in_ts,
3114     in_pkts,
3115     in_npkts,
3116     in_lutblentry,
3117     in_mirror_to_console,
3118     &t_last_msg,
3119     &first_time);
3120     }
3121    
3122    
3123     static void LOG_PACKET_log_f_acktransferfirmwareblock(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3124     {
3125     static struct __timeb64 t_last_msg;
3126     static int first_time = TRUE;
3127    
3128     LOG_PACKET_log_f_generic(in_channel,
3129     in_ts,
3130     in_pkts,
3131     in_npkts,
3132     in_lutblentry,
3133     in_mirror_to_console,
3134     &t_last_msg,
3135     &first_time);
3136     }
3137    
3138    
3139     static void LOG_PACKET_log_f_terminatedownload(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3140     {
3141     static struct __timeb64 t_last_msg;
3142     static int first_time = TRUE;
3143    
3144     LOG_PACKET_log_f_generic(in_channel,
3145     in_ts,
3146     in_pkts,
3147     in_npkts,
3148     in_lutblentry,
3149     in_mirror_to_console,
3150     &t_last_msg,
3151     &first_time);
3152     }
3153    
3154    
3155     static void LOG_PACKET_log_f_ackterminatedownload(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3156     {
3157     static struct __timeb64 t_last_msg;
3158     static int first_time = TRUE;
3159    
3160     LOG_PACKET_log_f_generic(in_channel,
3161     in_ts,
3162     in_pkts,
3163     in_npkts,
3164     in_lutblentry,
3165     in_mirror_to_console,
3166     &t_last_msg,
3167     &first_time);
3168     }
3169    
3170    
3171     static void LOG_PACKET_log_f_setdigpincfg(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3172     {
3173     static struct __timeb64 t_last_msg;
3174     static int first_time = TRUE;
3175    
3176     LOG_PACKET_log_f_generic(in_channel,
3177     in_ts,
3178     in_pkts,
3179     in_npkts,
3180     in_lutblentry,
3181     in_mirror_to_console,
3182     &t_last_msg,
3183     &first_time);
3184     }
3185    
3186    
3187     static void LOG_PACKET_log_f_acksetdigpincfg(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3188     {
3189     static struct __timeb64 t_last_msg;
3190     static int first_time = TRUE;
3191    
3192     LOG_PACKET_log_f_generic(in_channel,
3193     in_ts,
3194     in_pkts,
3195     in_npkts,
3196     in_lutblentry,
3197     in_mirror_to_console,
3198     &t_last_msg,
3199     &first_time);
3200     }
3201    
3202    
3203     static void LOG_PACKET_log_f_querydigpincfg(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3204     {
3205     static struct __timeb64 t_last_msg;
3206     static int first_time = TRUE;
3207    
3208     LOG_PACKET_log_f_generic(in_channel,
3209     in_ts,
3210     in_pkts,
3211     in_npkts,
3212     in_lutblentry,
3213     in_mirror_to_console,
3214     &t_last_msg,
3215     &first_time);
3216     }
3217    
3218    
3219     static void LOG_PACKET_log_f_respdigpincfg(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3220     {
3221     static struct __timeb64 t_last_msg;
3222     static int first_time = TRUE;
3223    
3224     LOG_PACKET_log_f_generic(in_channel,
3225     in_ts,
3226     in_pkts,
3227     in_npkts,
3228     in_lutblentry,
3229     in_mirror_to_console,
3230     &t_last_msg,
3231     &first_time);
3232     }
3233    
3234    
3235     static void LOG_PACKET_log_f_setdigpinstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3236     {
3237     static struct __timeb64 t_last_msg;
3238     static int first_time = TRUE;
3239    
3240     LOG_PACKET_log_f_generic(in_channel,
3241     in_ts,
3242     in_pkts,
3243     in_npkts,
3244     in_lutblentry,
3245     in_mirror_to_console,
3246     &t_last_msg,
3247     &first_time);
3248     }
3249    
3250    
3251     static void LOG_PACKET_log_f_acksetdigpinstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3252     {
3253     static struct __timeb64 t_last_msg;
3254     static int first_time = TRUE;
3255    
3256     LOG_PACKET_log_f_generic(in_channel,
3257     in_ts,
3258     in_pkts,
3259     in_npkts,
3260     in_lutblentry,
3261     in_mirror_to_console,
3262     &t_last_msg,
3263     &first_time);
3264     }
3265    
3266    
3267     static void LOG_PACKET_log_f_querydigpinstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3268     {
3269     static struct __timeb64 t_last_msg;
3270     static int first_time = TRUE;
3271    
3272     LOG_PACKET_log_f_generic(in_channel,
3273     in_ts,
3274     in_pkts,
3275     in_npkts,
3276     in_lutblentry,
3277     in_mirror_to_console,
3278     &t_last_msg,
3279     &first_time);
3280     }
3281    
3282    
3283     static void LOG_PACKET_log_f_respdigpinstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3284     {
3285     static struct __timeb64 t_last_msg;
3286     static int first_time = TRUE;
3287    
3288     LOG_PACKET_log_f_generic(in_channel,
3289     in_ts,
3290     in_pkts,
3291     in_npkts,
3292     in_lutblentry,
3293     in_mirror_to_console,
3294     &t_last_msg,
3295     &first_time);
3296     }
3297    
3298    
3299     static void LOG_PACKET_log_f_queryanalogpinvalues(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3300     {
3301     static struct __timeb64 t_last_msg;
3302     static int first_time = TRUE;
3303    
3304     LOG_PACKET_log_f_generic(in_channel,
3305     in_ts,
3306     in_pkts,
3307     in_npkts,
3308     in_lutblentry,
3309     in_mirror_to_console,
3310     &t_last_msg,
3311     &first_time);
3312     }
3313    
3314    
3315     static void LOG_PACKET_log_f_respanalogpinvalues(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3316     {
3317     static struct __timeb64 t_last_msg;
3318     static int first_time = TRUE;
3319    
3320     LOG_PACKET_log_f_generic(in_channel,
3321     in_ts,
3322     in_pkts,
3323     in_npkts,
3324     in_lutblentry,
3325     in_mirror_to_console,
3326     &t_last_msg,
3327     &first_time);
3328     }
3329    
3330    
3331     static void LOG_PACKET_log_f_setanalogpinsleepstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3332     {
3333     static struct __timeb64 t_last_msg;
3334     static int first_time = TRUE;
3335    
3336     LOG_PACKET_log_f_generic(in_channel,
3337     in_ts,
3338     in_pkts,
3339     in_npkts,
3340     in_lutblentry,
3341     in_mirror_to_console,
3342     &t_last_msg,
3343     &first_time);
3344     }
3345    
3346    
3347     static void LOG_PACKET_log_f_acksetanalogpinsleepstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3348     {
3349     static struct __timeb64 t_last_msg;
3350     static int first_time = TRUE;
3351    
3352     LOG_PACKET_log_f_generic(in_channel,
3353     in_ts,
3354     in_pkts,
3355     in_npkts,
3356     in_lutblentry,
3357     in_mirror_to_console,
3358     &t_last_msg,
3359     &first_time);
3360     }
3361    
3362    
3363     static void LOG_PACKET_log_f_queryanalogpinsleepstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3364     {
3365     static struct __timeb64 t_last_msg;
3366     static int first_time = TRUE;
3367    
3368     LOG_PACKET_log_f_generic(in_channel,
3369     in_ts,
3370     in_pkts,
3371     in_npkts,
3372     in_lutblentry,
3373     in_mirror_to_console,
3374     &t_last_msg,
3375     &first_time);
3376     }
3377    
3378    
3379     static void LOG_PACKET_log_f_respanalogpinsleepstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3380     {
3381     static struct __timeb64 t_last_msg;
3382     static int first_time = TRUE;
3383    
3384     LOG_PACKET_log_f_generic(in_channel,
3385     in_ts,
3386     in_pkts,
3387     in_npkts,
3388     in_lutblentry,
3389     in_mirror_to_console,
3390     &t_last_msg,
3391     &first_time);
3392     }
3393    
3394    
3395     static void LOG_PACKET_log_f_setdigpinsleepstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3396     {
3397     static struct __timeb64 t_last_msg;
3398     static int first_time = TRUE;
3399    
3400     LOG_PACKET_log_f_generic(in_channel,
3401     in_ts,
3402     in_pkts,
3403     in_npkts,
3404     in_lutblentry,
3405     in_mirror_to_console,
3406     &t_last_msg,
3407     &first_time);
3408     }
3409    
3410    
3411     static void LOG_PACKET_log_f_acksetdigpinsleepstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3412     {
3413     static struct __timeb64 t_last_msg;
3414     static int first_time = TRUE;
3415    
3416     LOG_PACKET_log_f_generic(in_channel,
3417     in_ts,
3418     in_pkts,
3419     in_npkts,
3420     in_lutblentry,
3421     in_mirror_to_console,
3422     &t_last_msg,
3423     &first_time);
3424     }
3425    
3426    
3427     static void LOG_PACKET_log_f_querydigpinsleepstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3428     {
3429     static struct __timeb64 t_last_msg;
3430     static int first_time = TRUE;
3431    
3432     LOG_PACKET_log_f_generic(in_channel,
3433     in_ts,
3434     in_pkts,
3435     in_npkts,
3436     in_lutblentry,
3437     in_mirror_to_console,
3438     &t_last_msg,
3439     &first_time);
3440     }
3441    
3442    
3443     static void LOG_PACKET_log_f_respdigpinsleepstate(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3444     {
3445     static struct __timeb64 t_last_msg;
3446     static int first_time = TRUE;
3447    
3448     LOG_PACKET_log_f_generic(in_channel,
3449     in_ts,
3450     in_pkts,
3451     in_npkts,
3452     in_lutblentry,
3453     in_mirror_to_console,
3454     &t_last_msg,
3455     &first_time);
3456     }
3457    
3458    
3459     static void LOG_PACKET_log_f_setdebugmode(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3460     {
3461     static struct __timeb64 t_last_msg;
3462     static int first_time = TRUE;
3463    
3464     LOG_PACKET_log_f_generic(in_channel,
3465     in_ts,
3466     in_pkts,
3467     in_npkts,
3468     in_lutblentry,
3469     in_mirror_to_console,
3470     &t_last_msg,
3471     &first_time);
3472     }
3473    
3474    
3475     static void LOG_PACKET_log_f_acksetdebugmode(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3476     {
3477     static struct __timeb64 t_last_msg;
3478     static int first_time = TRUE;
3479    
3480     LOG_PACKET_log_f_generic(in_channel,
3481     in_ts,
3482     in_pkts,
3483     in_npkts,
3484     in_lutblentry,
3485     in_mirror_to_console,
3486     &t_last_msg,
3487     &first_time);
3488     }
3489    
3490    
3491     static void LOG_PACKET_log_f_setledfunctionality(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3492     {
3493     int cspan;
3494     int mdelta;
3495     int ledmode;
3496     static struct __timeb64 t_last_msg;
3497     static int first_time = TRUE;
3498     char buf[250];
3499    
3500     if (first_time)
3501     {
3502     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3503     first_time = FALSE;
3504     }
3505    
3506     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
3507     mdelta = MISCFUNC_timb64_diff_bounded_ms(&t_last_msg, &(in_pkts[0].ts));
3508     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3509    
3510     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
3511    
3512     LOG_write_ls(&(in_pkts[0].ts),
3513     LOG_MT_ROUTINE,
3514     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3515     buf);
3516    
3517     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
3518    
3519     LOG_write_ls(&(in_pkts[0].ts),
3520     LOG_MT_ROUTINE,
3521     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3522     buf);
3523    
3524     //The header.
3525     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3526     in_pkts,
3527     3,
3528     LOG_MT_ROUTINE,
3529     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3530     //The payload.
3531     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3532     in_pkts+3,
3533     in_npkts-5,
3534     LOG_MT_ROUTINE,
3535     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3536     //The trailer.
3537     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3538     in_pkts+in_npkts-2,
3539     2,
3540     LOG_MT_ROUTINE,
3541     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3542    
3543     ledmode = ((int)in_pkts[3].c) & 0xFF;
3544    
3545     sprintf_s(buf, sizeof(buf), " LED_MODE: 0x%02X.",
3546     ledmode);
3547    
3548     LOG_write_ls(&(in_pkts[0].ts),
3549     LOG_MT_ROUTINE,
3550     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3551     buf);
3552     if (ledmode & 0xF8) //Bits set in the mode that shouldn't be.
3553     {
3554     sprintf_s(buf, sizeof(buf), "CH%02d:LED_MODE error in %s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
3555    
3556     LOG_write_ls(&(in_pkts[0].ts),
3557     LOG_MT_ALERT,
3558     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
3559     buf);
3560    
3561     sprintf_s(buf, sizeof(buf), " LED_MODE: 0x%02X.", ledmode);
3562    
3563     LOG_write_ls(&(in_pkts[0].ts),
3564     LOG_MT_ALERT,
3565     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
3566     buf);
3567     }
3568     }
3569    
3570    
3571     static void LOG_PACKET_log_f_acksetledfunctionality(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3572     {
3573     static struct __timeb64 t_last_msg;
3574     static int first_time = TRUE;
3575    
3576     LOG_PACKET_log_f_generic(in_channel,
3577     in_ts,
3578     in_pkts,
3579     in_npkts,
3580     in_lutblentry,
3581     in_mirror_to_console,
3582     &t_last_msg,
3583     &first_time);
3584     }
3585    
3586    
3587     static void LOG_PACKET_log_f_rxbytesidtoid(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3588     {
3589     static struct __timeb64 t_last_msg;
3590     static int first_time = TRUE;
3591    
3592     LOG_PACKET_log_f_generic(in_channel,
3593     in_ts,
3594     in_pkts,
3595     in_npkts,
3596     in_lutblentry,
3597     in_mirror_to_console,
3598     &t_last_msg,
3599     &first_time);
3600     }
3601    
3602    
3603     static void LOG_PACKET_log_f_setprogrammablesettings(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3604     {
3605     int cspan;
3606     int mdelta;
3607     int panidlsb, panidmsb, panid;
3608     int rfchannel;
3609     int receive_all;
3610     int rfacksretries;
3611     int rfpowerlevel;
3612     int txcvrlongad[8];
3613     int txcvrshortad[2];
3614     static struct __timeb64 t_last_msg;
3615     static int first_time = TRUE;
3616     char buf[250];
3617    
3618     if (first_time)
3619     {
3620     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3621     first_time = FALSE;
3622     }
3623    
3624     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
3625     mdelta = MISCFUNC_timb64_diff_bounded_ms(&t_last_msg, &(in_pkts[0].ts));
3626     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3627    
3628     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
3629    
3630     LOG_write_ls(&(in_pkts[0].ts),
3631     LOG_MT_ROUTINE,
3632     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3633     buf);
3634    
3635     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
3636    
3637     LOG_write_ls(&(in_pkts[0].ts),
3638     LOG_MT_ROUTINE,
3639     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3640     buf);
3641    
3642     //The header.
3643     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3644     in_pkts,
3645     3,
3646     LOG_MT_ROUTINE,
3647     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3648     //The payload.
3649     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3650     in_pkts+3,
3651     in_npkts-5,
3652     LOG_MT_ROUTINE,
3653     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3654     //The trailer.
3655     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3656     in_pkts+in_npkts-2,
3657     2,
3658     LOG_MT_ROUTINE,
3659     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3660    
3661     panidlsb = ((int)in_pkts[3].c) & 0xFF;
3662     panidmsb = ((int)in_pkts[4].c) & 0xFF;
3663     panid = 256 * panidmsb + panidlsb;
3664    
3665     txcvrlongad[7] = ((int)in_pkts[ 5].c) & 0xFF;
3666     txcvrlongad[6] = ((int)in_pkts[ 6].c) & 0xFF;
3667     txcvrlongad[5] = ((int)in_pkts[ 7].c) & 0xFF;
3668     txcvrlongad[4] = ((int)in_pkts[ 8].c) & 0xFF;
3669     txcvrlongad[3] = ((int)in_pkts[ 9].c) & 0xFF;
3670     txcvrlongad[2] = ((int)in_pkts[10].c) & 0xFF;
3671     txcvrlongad[1] = ((int)in_pkts[11].c) & 0xFF;
3672     txcvrlongad[0] = ((int)in_pkts[12].c) & 0xFF;
3673    
3674     sprintf_s(buf, sizeof(buf), " PANID: 0x%04X, TXCVR_LONG_AD: 0x%02X%02X%02X%02X%02X%02X%02X%02X.",
3675     panid,
3676     txcvrlongad[0],
3677     txcvrlongad[1],
3678     txcvrlongad[2],
3679     txcvrlongad[3],
3680     txcvrlongad[4],
3681     txcvrlongad[5],
3682     txcvrlongad[6],
3683     txcvrlongad[7]
3684     );
3685    
3686     LOG_write_ls(&(in_pkts[0].ts),
3687     LOG_MT_ROUTINE,
3688     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3689     buf);
3690    
3691     txcvrshortad[1] = ((int)in_pkts[13].c) & 0xFF;
3692     txcvrshortad[0] = ((int)in_pkts[14].c) & 0xFF;
3693    
3694     rfchannel = ((int)in_pkts[15].c) & 0xFF;
3695    
3696     sprintf_s(buf, sizeof(buf), " TXCVR_SHORT_AD: 0x%02X%02X, RF_CHANNEL: 0x%02X.",
3697     txcvrshortad[0],
3698     txcvrshortad[1],
3699     rfchannel
3700     );
3701    
3702     LOG_write_ls(&(in_pkts[0].ts),
3703     LOG_MT_ROUTINE,
3704     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3705     buf);
3706    
3707     receive_all = ((int)in_pkts[16].c) & 0xFF;
3708     rfacksretries = ((int)in_pkts[17].c) & 0xFF;
3709    
3710     sprintf_s(buf, sizeof(buf), " RECEIVE_ALL: 0x%02X, RF_ACKS_RETRIES: 0x%02X.",
3711     receive_all,
3712     rfacksretries
3713     );
3714    
3715     LOG_write_ls(&(in_pkts[0].ts),
3716     LOG_MT_ROUTINE,
3717     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3718     buf);
3719    
3720     rfpowerlevel = ((int)in_pkts[18].c) & 0xFF;
3721    
3722     sprintf_s(buf, sizeof(buf), " RF_POWER_LEVEL: 0x%02X.",
3723     rfpowerlevel
3724     );
3725    
3726     LOG_write_ls(&(in_pkts[0].ts),
3727     LOG_MT_ROUTINE,
3728     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3729     buf);
3730     }
3731    
3732    
3733     static void LOG_PACKET_log_f_acksetprogrammablesettings(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3734     {
3735     int cspan;
3736     int mdelta;
3737     int acknack;
3738     int status;
3739     static struct __timeb64 t_last_msg;
3740     static int first_time = TRUE;
3741     char buf[250];
3742    
3743     if (first_time)
3744     {
3745     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3746     first_time = FALSE;
3747     }
3748    
3749     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
3750     mdelta = MISCFUNC_timb64_diff_bounded_ms(&t_last_msg, &(in_pkts[0].ts));
3751     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3752    
3753     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
3754    
3755     LOG_write_ls(&(in_pkts[0].ts),
3756     LOG_MT_ROUTINE,
3757     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3758     buf);
3759    
3760     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
3761    
3762     LOG_write_ls(&(in_pkts[0].ts),
3763     LOG_MT_ROUTINE,
3764     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3765     buf);
3766    
3767     //The header.
3768     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3769     in_pkts,
3770     3,
3771     LOG_MT_ROUTINE,
3772     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3773     //The payload.
3774     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3775     in_pkts+3,
3776     in_npkts-5,
3777     LOG_MT_ROUTINE,
3778     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3779     //The trailer.
3780     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3781     in_pkts+in_npkts-2,
3782     2,
3783     LOG_MT_ROUTINE,
3784     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3785    
3786     acknack = ((int)in_pkts[ 3].c) & 0xFF;
3787     status = ((int)in_pkts[ 4].c) & 0xFF;
3788    
3789     sprintf_s(buf, sizeof(buf), " ACK_NACK: 0x%02X, STATUS: 0x%02X.",
3790     acknack,
3791     status
3792     );
3793    
3794     LOG_write_ls(&(in_pkts[0].ts),
3795     LOG_MT_ROUTINE,
3796     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3797     buf);
3798    
3799     if (acknack != 0x01)
3800     {
3801     sprintf_s(buf, sizeof(buf), "CH%02d:ACK_NACK error in %s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
3802    
3803     LOG_write_ls(&(in_pkts[0].ts),
3804     LOG_MT_ALERT,
3805     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
3806     buf);
3807    
3808     sprintf_s(buf, sizeof(buf), " ACK_NACK: 0x%02X, STATUS: 0x%02X.", acknack, status);
3809    
3810     LOG_write_ls(&(in_pkts[0].ts),
3811     LOG_MT_ALERT,
3812     LOG_LI_PKT | LOG_LI_ALERT | LOG_LI_COMP | LOG_LI_STDOUT,
3813     buf);
3814     }
3815     }
3816    
3817    
3818     static void LOG_PACKET_log_f_queryprogrammablesettings(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3819     {
3820     int cspan;
3821     int mdelta;
3822     static struct __timeb64 t_last_msg;
3823     static int first_time = TRUE;
3824     char buf[250];
3825    
3826     if (first_time)
3827     {
3828     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3829     first_time = FALSE;
3830     }
3831    
3832     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
3833     mdelta = MISCFUNC_timb64_diff_bounded_ms(&t_last_msg, &(in_pkts[0].ts));
3834     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3835    
3836     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
3837    
3838     LOG_write_ls(in_ts,
3839     LOG_MT_ROUTINE,
3840     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3841     buf);
3842    
3843     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
3844    
3845     LOG_write_ls(in_ts,
3846     LOG_MT_ROUTINE,
3847     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3848     buf);
3849    
3850     //The header.
3851     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3852     in_pkts,
3853     3,
3854     LOG_MT_ROUTINE,
3855     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3856     //The payload.
3857     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3858     in_pkts+3,
3859     in_npkts-5,
3860     LOG_MT_ROUTINE,
3861     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3862     //The trailer.
3863     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3864     in_pkts+in_npkts-2,
3865     2,
3866     LOG_MT_ROUTINE,
3867     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3868     }
3869    
3870    
3871     static void LOG_PACKET_log_f_respprogrammablesettings(int in_channel, const struct __timeb64 *in_ts, QCHAR_TSE *in_pkts, int in_npkts, int in_lutblentry, int in_mirror_to_console)
3872     {
3873     int cspan;
3874     int mdelta;
3875     int panidlsb, panidmsb, panid;
3876     int rfchannel;
3877     int receive_all;
3878     int rfacksretries;
3879     int rfpowerlevel;
3880     int txcvrlongad[8];
3881     int txcvrshortad[2];
3882     static struct __timeb64 t_last_msg;
3883     static int first_time = TRUE;
3884     char buf[250];
3885    
3886     if (first_time)
3887     {
3888     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3889     first_time = FALSE;
3890     }
3891    
3892     cspan = MISCFUNC_timb64_diff_bounded_ms(&(in_pkts[0].ts), &(in_pkts[in_npkts-1].ts));
3893     mdelta = MISCFUNC_timb64_diff_bounded_ms(&t_last_msg, &(in_pkts[0].ts));
3894     memcpy(&t_last_msg, &(in_pkts[0].ts), sizeof(t_last_msg));
3895    
3896     sprintf_s(buf, sizeof(buf), "CH%02d:%s.", in_channel, LOG_PACKET_pkt_type_lut_a[in_lutblentry].tag_terse);
3897    
3898     LOG_write_ls(in_ts,
3899     LOG_MT_ROUTINE,
3900     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3901     buf);
3902    
3903     sprintf_s(buf, sizeof(buf), " cspan=%d, mdelta=%d.", cspan, mdelta);
3904    
3905     LOG_write_ls(in_ts,
3906     LOG_MT_ROUTINE,
3907     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3908     buf);
3909    
3910     //The header.
3911     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3912     in_pkts,
3913     3,
3914     LOG_MT_ROUTINE,
3915     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3916     //The payload.
3917     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3918     in_pkts+3,
3919     in_npkts-5,
3920     LOG_MT_ROUTINE,
3921     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3922     //The trailer.
3923     LOG_PACKET_log_bytes(&(in_pkts[0].ts),
3924     in_pkts+in_npkts-2,
3925     2,
3926     LOG_MT_ROUTINE,
3927     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP));
3928    
3929     panidlsb = ((int)in_pkts[3].c) & 0xFF;
3930     panidmsb = ((int)in_pkts[4].c) & 0xFF;
3931     panid = 256 * panidmsb + panidlsb;
3932    
3933     txcvrlongad[7] = ((int)in_pkts[ 5].c) & 0xFF;
3934     txcvrlongad[6] = ((int)in_pkts[ 6].c) & 0xFF;
3935     txcvrlongad[5] = ((int)in_pkts[ 7].c) & 0xFF;
3936     txcvrlongad[4] = ((int)in_pkts[ 8].c) & 0xFF;
3937     txcvrlongad[3] = ((int)in_pkts[ 9].c) & 0xFF;
3938     txcvrlongad[2] = ((int)in_pkts[10].c) & 0xFF;
3939     txcvrlongad[1] = ((int)in_pkts[11].c) & 0xFF;
3940     txcvrlongad[0] = ((int)in_pkts[12].c) & 0xFF;
3941    
3942     sprintf_s(buf, sizeof(buf), " PANID: 0x%04X, TXCVR_LONG_AD: 0x%02X%02X%02X%02X%02X%02X%02X%02X.",
3943     panid,
3944     txcvrlongad[0],
3945     txcvrlongad[1],
3946     txcvrlongad[2],
3947     txcvrlongad[3],
3948     txcvrlongad[4],
3949     txcvrlongad[5],
3950     txcvrlongad[6],
3951     txcvrlongad[7]
3952     );
3953    
3954     LOG_write_ls(in_ts,
3955     LOG_MT_ROUTINE,
3956     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3957     buf);
3958    
3959     txcvrshortad[1] = ((int)in_pkts[13].c) & 0xFF;
3960     txcvrshortad[0] = ((int)in_pkts[14].c) & 0xFF;
3961    
3962     rfchannel = ((int)in_pkts[15].c) & 0xFF;
3963    
3964     sprintf_s(buf, sizeof(buf), " TXCVR_SHORT_AD: 0x%02X%02X, RF_CHANNEL: 0x%02X.",
3965     txcvrshortad[0],
3966     txcvrshortad[1],
3967     rfchannel
3968     );
3969    
3970     LOG_write_ls(in_ts,
3971     LOG_MT_ROUTINE,
3972     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3973     buf);
3974    
3975     receive_all = ((int)in_pkts[16].c) & 0xFF;
3976     rfacksretries = ((int)in_pkts[17].c) & 0xFF;
3977    
3978     sprintf_s(buf, sizeof(buf), " RECEIVE_ALL: 0x%02X, RF_ACKS_RETRIES: 0x%02X.",
3979     receive_all,
3980     rfacksretries
3981     );
3982    
3983     LOG_write_ls(in_ts,
3984     LOG_MT_ROUTINE,
3985     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3986     buf);
3987    
3988     rfpowerlevel = ((int)in_pkts[18].c) & 0xFF;
3989    
3990     sprintf_s(buf, sizeof(buf), " RF_POWER_LEVEL: 0x%02X.",
3991     rfpowerlevel
3992     );
3993    
3994     LOG_write_ls(in_ts,
3995     LOG_MT_ROUTINE,
3996     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP),
3997     buf);
3998     }
3999    
4000    
4001     //Returns a pointer to a string describing an event. The string is made for announcing events
4002     //that can't be used for a particular intended purpose.
4003     //
4004     //This function is not thread-safe.
4005     //
4006     const char *LOG_PACKET_event_text_desc_a(const QCHAR_TSE *in_ev)
4007     {
4008     static char buf[250];
4009    
4010     switch (in_ev->ev)
4011     {
4012     case QCHAR_EV_CHAR:
4013     sprintf_s(buf, sizeof(buf), "Character: 0x%02X", ((int)in_ev->c) & 0xFF);
4014     break;
4015     case QCHAR_EV_BREAK:
4016     sprintf_s(buf, sizeof(buf), "Event: BREAK");
4017     break;
4018     case QCHAR_EV_FRAME:
4019     sprintf_s(buf, sizeof(buf), "Event: FRAMING_ERROR");
4020     break;
4021     case QCHAR_EV_OVERRUN:
4022     sprintf_s(buf, sizeof(buf), "Event: LOW_LEVEL_OVERRUN");
4023     break;
4024     case QCHAR_EV_RXOVER:
4025     sprintf_s(buf, sizeof(buf), "Event: RECEIVE_Q_OVERFLOW");
4026     break;
4027     case QCHAR_EV_RXPARITY:
4028     sprintf_s(buf, sizeof(buf), "Event: PARITY_ERROR");
4029     break;
4030     default:
4031     sprintf_s(buf, sizeof(buf), "Event: INTERNAL_SOFTWARE_ERROR");
4032     break;
4033     }
4034    
4035     return(buf);
4036     }
4037    
4038    
4039     //Discards events that can't be the start of a packet.
4040     //
4041     static void LOG_PACKET_non_start_discard(int in_channel, QCHAR_CCEQ *in_q, const struct __timeb64 *in_ts, int in_mirror_to_console)
4042     {
4043     int done = FALSE;
4044     QCHAR_TSE item;
4045    
4046     while (!done)
4047     {
4048     //Can't proceed if no elements in queue.
4049     if (! QCHAR_cceq_nelem(in_q))
4050     {
4051     done = TRUE;
4052     }
4053    
4054     //Peek at the first element.
4055     if (!done)
4056     QCHAR_cceq_peek(in_q, &item);
4057    
4058     //If the first element is invalid, discard it, else we're done.
4059     if (!done)
4060     {
4061     if ((item.ev != QCHAR_EV_CHAR) || (item.c != 0x01))
4062     {
4063     char buf[250];
4064    
4065     sprintf_s(buf, sizeof(buf), "CH%02d:Non-packet start event discarded: %s.", in_channel, LOG_PACKET_event_text_desc_a(&item));
4066    
4067     LOG_write_ls(&(item.ts),
4068     LOG_MT_ALERT,
4069     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4070     buf);
4071     QCHAR_cceq_get(in_q, &item);
4072     }
4073     else
4074     {
4075     //First element is apparently a start element. We're good.
4076     done = TRUE;
4077     }
4078     }
4079     }
4080     }
4081    
4082    
4083     //Resynchronizes by discarding an apparent start element that can't be used and then looking for another
4084     //start element.
4085     //
4086     static void LOG_PACKET_non_start_resync_discard(int in_channel, QCHAR_CCEQ *in_q, const struct __timeb64 *in_ts, int in_mirror_to_console)
4087     {
4088     QCHAR_TSE item;
4089    
4090     //Can't proceed if no elements in queue.
4091     if (! QCHAR_cceq_nelem(in_q))
4092     {
4093     return;
4094     }
4095    
4096     //Peek at the first element.
4097     QCHAR_cceq_peek(in_q, &item);
4098    
4099     //If the first element is a start element, discard it.
4100     if ((item.ev == QCHAR_EV_CHAR) && (item.c == 0x01))
4101     {
4102     char buf[250];
4103    
4104     sprintf_s(buf, sizeof(buf), "CH%02d:SOH start event discarded to resynchronize.", in_channel);
4105    
4106     LOG_write_ls(&(item.ts),
4107     LOG_MT_ALERT,
4108     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4109     buf);
4110     QCHAR_cceq_get(in_q, &item);
4111     }
4112    
4113     //Discard characters beyond the SOH that can't be the start.
4114     LOG_PACKET_non_start_discard(in_channel, in_q, in_ts, in_mirror_to_console);
4115     }
4116    
4117    
4118     //Figures out whether a range is all characters and what the checksum is. Note that end index is 1+.
4119     //
4120     static void LOG_PACKET_q_range_all_chars_cksum8(QCHAR_CCEQ *in_q, int in_sidx, int in_eidx, int *out_all_chars, int *out_cksum8)
4121     {
4122     int i;
4123     QCHAR_TSE item;
4124     int cksum8 = 0;
4125     int all_chars = TRUE;
4126    
4127     for (i=in_sidx; i<in_eidx; i++)
4128     {
4129     QCHAR_cceq_peek_n(in_q, i, &item);
4130    
4131     if (item.ev == QCHAR_EV_CHAR)
4132     {
4133     cksum8 += (((int)item.c) & 0xFF);
4134     cksum8 &= 0xFF;
4135     }
4136     else
4137     {
4138     all_chars = FALSE;
4139     }
4140     }
4141    
4142     *out_all_chars = all_chars;
4143     *out_cksum8 = cksum8;
4144     }
4145    
4146    
4147     static void LOG_PACKET_emit(int in_channel, QCHAR_CCEQ *in_q, const struct __timeb64 *in_ts, int in_mirror_to_console)
4148     {
4149     int lut_index;
4150     int declared_length;
4151     int declared_checksum;
4152     int nqueue;
4153     int must_resync = FALSE;
4154     int done = FALSE;
4155     int packet_found;
4156     QCHAR_TSE item_soh;
4157     QCHAR_TSE item_length;
4158     QCHAR_TSE item_type;
4159     QCHAR_TSE item_checksum;
4160     QCHAR_TSE item_endbyte;
4161     QCHAR_TSE event_buf[256];
4162     char buf[250];
4163    
4164     while (! done)
4165     {
4166     packet_found = FALSE;
4167     must_resync = FALSE;
4168    
4169     //All packets have to start with a character 0x01. Trash anything that is not a character and/or not
4170     //a 0x01.
4171     LOG_PACKET_non_start_discard(in_channel, in_q, in_ts, in_mirror_to_console);
4172    
4173     //If there is nothing left in the queue, we can't go further.
4174     nqueue = QCHAR_cceq_nelem(in_q);
4175     if (!nqueue)
4176     return;
4177    
4178     if (nqueue >= 3)
4179     //We can begin looking for anomalies as soon as 3 characters.
4180     {
4181     //Grab the presumed SOH.
4182     QCHAR_cceq_peek_n(in_q, 0, &item_soh);
4183    
4184     //Grab the presumed length.
4185     QCHAR_cceq_peek_n(in_q, 1, &item_length);
4186    
4187     //Grab the presumed type.
4188     QCHAR_cceq_peek_n(in_q, 2, &item_type);
4189    
4190     //If the SOH is not as expected, must resynchronize.
4191     if ((item_soh.ev != QCHAR_EV_CHAR) || (item_soh.c != 0x01))
4192     {
4193     sprintf_s(buf, sizeof(buf), "CH%02d:Expected: SOH. Actual: %s.", in_channel, LOG_PACKET_event_text_desc_a(&item_soh));
4194    
4195     LOG_write_ls(in_ts,
4196     LOG_MT_ALERT,
4197     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4198     buf);
4199    
4200     must_resync = TRUE;
4201     }
4202    
4203     //If the length is not a received character, must resynchronize.
4204     if (item_length.ev != QCHAR_EV_CHAR)
4205     {
4206     sprintf_s(buf, sizeof(buf), "CH%02d:Expected: Length. Actual: %s.", in_channel, LOG_PACKET_event_text_desc_a(&item_length));
4207    
4208     LOG_write_ls(in_ts,
4209     LOG_MT_ALERT,
4210     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4211     buf);
4212    
4213     must_resync = TRUE;
4214     }
4215    
4216     //If the type is not a received character, must resynchronize.
4217     if (item_type.ev != QCHAR_EV_CHAR)
4218     {
4219     sprintf_s(buf, sizeof(buf), "CH%02d:Expected: Type. Actual: %s.", in_channel, LOG_PACKET_event_text_desc_a(&item_type));
4220    
4221     LOG_write_ls(in_ts,
4222     LOG_MT_ALERT,
4223     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4224     buf);
4225    
4226     must_resync = TRUE;
4227     }
4228    
4229     //Try to look up the length and type and get a table index. This may result in an error.
4230     lut_index = LOG_PACKET_type_length_lookup_a(((int)item_type.c) & 0xFF, ((int)item_length.c) & 0xFF);
4231    
4232     if (lut_index < 0)
4233     {
4234     if (lut_index == -2)
4235     {
4236     //Type is invalid. Must resync.
4237     sprintf_s(buf, sizeof(buf), "CH%02d:Type byte has invalid value (0x%02X).", in_channel, ((int)item_type.c) & 0xFF);
4238    
4239     LOG_write_ls(in_ts,
4240     LOG_MT_ALERT,
4241     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4242     buf);
4243    
4244     must_resync = TRUE;
4245     }
4246     else if (lut_index == -1)
4247     {
4248     //Length is inconsistent with type.
4249     sprintf_s(buf,
4250     sizeof(buf),
4251     "CH%02d:Type is acceptable(0x%02X) but length is inconsistent (0x%02X).",
4252     in_channel,
4253     ((int)item_type.c) & 0xFF,
4254     ((int)item_length.c) & 0xFF);
4255    
4256     LOG_write_ls(in_ts,
4257     LOG_MT_ALERT,
4258     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4259     buf);
4260    
4261     must_resync = TRUE;
4262     }
4263     else
4264     {
4265     //Negative value but don't know why. This is an impossible internal software error.
4266     CCMFATAL_fatal("Unexpected internal software error.", __FILE__, __LINE__);
4267     }
4268     }
4269     else
4270     {
4271     //Index >= 0, so it is a valid table index.
4272     //
4273     //Look to see if we have at least as many characters as the declared length.
4274     declared_length = ((int)item_length.c) & 0xFF;
4275    
4276     if (nqueue >= declared_length)
4277     {
4278     //We have enough characters. Peek at the end byte. If it is wrong, can't continue.
4279     QCHAR_cceq_peek_n(in_q, declared_length-1, &item_endbyte);
4280    
4281     if ((item_endbyte.ev != QCHAR_EV_CHAR) || (item_endbyte.c != 0x04))
4282     {
4283     sprintf_s(buf, sizeof(buf), "CH%02d:Expected: 0x04 endbyte. Actual: %s.", in_channel, LOG_PACKET_event_text_desc_a(&item_endbyte));
4284    
4285     LOG_write_ls(in_ts,
4286     LOG_MT_ALERT,
4287     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4288     buf);
4289    
4290     must_resync = TRUE;
4291     }
4292     else
4293     {
4294     //Gotta look at checksum.
4295     QCHAR_cceq_peek_n(in_q, declared_length-2, &item_checksum);
4296    
4297     if (item_checksum.ev != QCHAR_EV_CHAR)
4298     {
4299     sprintf_s(buf, sizeof(buf), "CH%02d:Expected: checksum is character. Actual: %s.", in_channel, LOG_PACKET_event_text_desc_a(&item_checksum));
4300    
4301     LOG_write_ls(in_ts,
4302     LOG_MT_ALERT,
4303     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4304     buf);
4305    
4306     must_resync = TRUE;
4307     }
4308     else
4309     {
4310     int calculated_checksum;
4311     int all_chars;
4312    
4313     declared_checksum = ((int)item_checksum.c) & 0xFF;
4314    
4315     LOG_PACKET_q_range_all_chars_cksum8(in_q, 0, declared_length-2, &all_chars, &calculated_checksum);
4316    
4317     if (! all_chars)
4318     {
4319     //Not everything was a character. Must resync.
4320     sprintf_s(buf, sizeof(buf), "CH%02d:Some packet items not characters. Resynchronizing.", in_channel);
4321    
4322     LOG_write_ls(in_ts,
4323     LOG_MT_ALERT,
4324     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4325     buf);
4326    
4327     must_resync = TRUE;
4328     }
4329     else
4330     {
4331     if (calculated_checksum != declared_checksum)
4332     {
4333     //Checksum error. Must resync.
4334     sprintf_s(buf,
4335     sizeof(buf),
4336     "CH%02d:Packet checksum mismatch. Declared: 0x%02X. Actual: 0x%02X. Resynchronizing.",
4337     in_channel,
4338     declared_checksum,
4339     calculated_checksum);
4340    
4341     LOG_write_ls(in_ts,
4342     LOG_MT_ALERT,
4343     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4344     buf);
4345    
4346     must_resync = TRUE;
4347     }
4348     else
4349     {
4350     //Everything looks OK. Issue a warning if the packet type is inconsistent with what is allowed. By convention, channel 0 is the
4351     //line from the host micro to the RF module, and channel 1 is the one back.
4352     //
4353     if ((in_channel == 0) && (!LOG_PACKET_pkt_type_lut_a[lut_index].valid_from_host))
4354     {
4355     //Packet not allowed from host.
4356     sprintf_s(buf,
4357     sizeof(buf),
4358     "CH%02d:Packet type not allowed from host.",
4359     in_channel);
4360    
4361     LOG_write_ls(in_ts,
4362     LOG_MT_ALERT,
4363     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4364     buf);
4365     }
4366     else if ((in_channel == 1) && (!LOG_PACKET_pkt_type_lut_a[lut_index].valid_from_rf_mod))
4367     {
4368     //Packet not allowed from RF module.
4369     sprintf_s(buf,
4370     sizeof(buf),
4371     "CH%02d:Packet type not allowed from RF module.",
4372     in_channel);
4373    
4374     LOG_write_ls(in_ts,
4375     LOG_MT_ALERT,
4376     (in_mirror_to_console) ? (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT) : (LOG_LI_PKT | LOG_LI_COMP | LOG_LI_ALERT | LOG_LI_STDOUT),
4377     buf);
4378     }
4379    
4380     //We are in the green to call the function to handle the packet. At the same time we get the
4381     //characters ready for this function, we pull them from the queue.
4382     //
4383     {
4384     int i;
4385    
4386     //Be sure we're consistent. Everybody gets a clean copy.
4387     FillMemory(event_buf, sizeof(event_buf), 0);
4388    
4389     //Do the copy and queue removal.
4390     for (i=0; i<declared_length; i++)
4391     {
4392     QCHAR_cceq_get(in_q, &(event_buf[i]));
4393     }
4394    
4395     //Call the function to handle it.
4396     (*LOG_PACKET_pkt_type_lut_a[lut_index].logptr)(in_channel,
4397     in_ts,
4398     event_buf,
4399     declared_length,
4400     lut_index,
4401     in_mirror_to_console);
4402    
4403     //We did find a packet.
4404     packet_found = TRUE;
4405     }
4406     }
4407     }
4408    
4409     }
4410     }
4411     }
4412     }
4413     } //End if nqueue >= 3.
4414    
4415     //If the terminal event in the queue has aged out, must resync.
4416     nqueue = QCHAR_cceq_nelem(in_q);
4417     if (!nqueue)
4418     return;
4419    
4420     QCHAR_cceq_peek_n(in_q, nqueue-1, &item_endbyte);
4421     if (MISCFUNC_timb64_diff_bounded_ms(&(item_endbyte.ts), in_ts) > LOG_PACKET_CHAR_STRAGGLER_TIME)
4422     {
4423     must_resync = TRUE;
4424     }
4425    
4426     //Resync if requested.
4427     if (must_resync)
4428     {
4429     LOG_PACKET_non_start_resync_discard(in_channel, in_q, in_ts, in_mirror_to_console);
4430     }
4431    
4432     //We are not done if we found a packet or had to resync.
4433     if (!packet_found && !must_resync)
4434     done = TRUE;
4435     } //End while(! done)
4436     }
4437    
4438    
4439     void LOG_PACKET_advance(QCHAR_CCEQ *in_q0, QCHAR_CCEQ *in_q1, const struct __timeb64 *in_ts, int in_mirror_to_console)
4440     {
4441     //All we need to do is gather as many characters as we can and group them by timestamp. We need to do this
4442     //once for each channel.
4443     LOG_PACKET_emit(0, in_q0, in_ts, in_mirror_to_console);
4444     LOG_PACKET_emit(1, in_q1, in_ts, in_mirror_to_console);
4445     }
4446    
4447    
4448     const char *LOG_PACKET_cvcinfo(void)
4449     {
4450     return("$Header: /home/dashley/cvsrep/e3ft_gpl01/e3ft_gpl01/winprojs/scirfmmon/source/log_packet.c,v 1.24 2009/01/17 22:12:37 dashley Exp $");
4451     }
4452    
4453    
4454     const char *LOG_PACKET_hvcinfo(void)
4455     {
4456     return(LOG_PACKET_H_VERSION);
4457     }
4458    
4459    
4460     //**************************************************************************
4461     // $Log: log_packet.c,v $
4462     // Revision 1.24 2009/01/17 22:12:37 dashley
4463     // Issue where some errors not logged to console fixed.
4464     //
4465     // Revision 1.23 2009/01/16 17:56:16 dashley
4466     // 0xAB data presentation completed.
4467     //
4468     // Revision 1.22 2009/01/16 17:46:45 dashley
4469     // 0x03 data presentation completed.
4470     //
4471     // Revision 1.21 2009/01/16 17:33:39 dashley
4472     // 0x28 data presentation completed.
4473     //
4474     // Revision 1.20 2009/01/16 17:06:42 dashley
4475     // 0x94 data presentation completed.
4476     //
4477     // Revision 1.19 2009/01/16 05:19:25 dashley
4478     // 0x14 data presentation completed.
4479     //
4480     // Revision 1.18 2009/01/16 04:49:50 dashley
4481     // 0x95 data presentation completed.
4482     //
4483     // Revision 1.17 2009/01/15 21:43:11 dashley
4484     // Edits.
4485     //
4486     // Revision 1.16 2009/01/15 20:11:58 dashley
4487     // Edits.
4488     //
4489     // Revision 1.15 2009/01/15 19:14:38 dashley
4490     // Edits.
4491     //**************************************************************************
4492     // End of $RCSfile: log_packet.c,v $.

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25