examples in C

pull/141/head
Tom Early 2024-09-14 12:04:12 -07:00
parent d136dcaa86
commit d593d9b2bc
2 changed files with 171 additions and 185 deletions

Binary file not shown.

View File

@ -11,16 +11,16 @@
\usepackage{float}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows.meta}
\tikzstyle{textonly} = [rectangle,
minimum width=1cm,
\tikzstyle{textonly} = [rectangle,
minimum width=1cm,
minimum height=1cm,
text centered,
text centered,
draw=white]
\tikzstyle{whrectround} = [rectangle, rounded corners,
minimum width=1cm,
minimum height=1cm,
text centered,
text width=2cm,
minimum width=1cm,
minimum height=1cm,
text centered,
text width=2cm,
draw=black]
\usepackage{amstext}
\usepackage{array,calc}
@ -34,21 +34,21 @@ draw=black]
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
\lstdefinestyle{codestyle}{
backgroundcolor=\color{backcolour},
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
keywordstyle=\color{magenta},
numberstyle=\tiny\color{codegray},
stringstyle=\color{codepurple},
basicstyle=\ttfamily\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
showtabs=false,
tabsize=2
}
\lstset{style=codestyle}
@ -230,7 +230,7 @@ is sent first. For example, the four dibits contained in the byte \texttt{0xB4}
\node (rrc) [whrectround, right of=up, xshift=1cm] {RRC Filter};
\node (fm) [whrectround, right of=rrc, xshift=1cm] {Frequency Modulation};
\node (out) [textonly, right of=fm, xshift=1cm] {4FSK Output};
\draw [-latex](in) -- (sym);
\draw [-latex](sym) -- (up);
\draw [-latex](up) -- (rrc);
@ -323,7 +323,7 @@ CSMA may be used to minimize collisions on a shared radio frequency by having th
\node (rrc) [whrectround, below of=up] {rrc filter};
\node (fm) [whrectround, below of=rrc] {frequency modulation};
\node (fsk) [whrectround, below of=fm] {4FSK RF};
\draw [-latex](payload) -- (rand);
\draw [-latex](rand) -- (sync);
\draw [-latex](sync) -- (cd);
@ -386,7 +386,7 @@ utilized will be indicated for each frame type.
\node (cont) [whrectround] {Data Link Layer Contents};
\node (ecc) [whrectround, right of=cont, xshift=2.5cm] {ECC/FEC Encode};
\node (payload) [whrectround, right of=ecc, xshift=2.5cm] {Payload};
\draw [-latex](cont) -- node [midway, above] {Type 1 bits} (ecc);
\draw [-latex](ecc) -- node [midway, above] {Type 4 bits} (payload);
\end{tikzpicture}
@ -399,7 +399,7 @@ utilized will be indicated for each frame type.
\node (payload) [whrectround] {Payload};
\node (ecc) [whrectround, right of=payload, xshift=2.5cm] {ECC/FEC Decode};
\node (cont) [whrectround, right of=ecc, xshift=2.5cm] {Data Link Layer Contents};
\draw [-latex](payload) -- node [midway, above] {Type 4 bits} (ecc);
\draw [-latex](ecc) -- node [midway, above] {Type 1 bits} (cont);
\end{tikzpicture}
@ -1540,7 +1540,7 @@ M17 uses 48-bit (6-byte) addresses. Callsigns and special purpose addresses are
\texttt{0xF46109000000 - 0xFFFFFFFFFFFE} & Reserved & \texttt{12,777,376,710,655} & for application use \\
\hline
\texttt{0xFFFFFFFFFFFF} & Broadcast & \texttt{1} & Valid only for destination \\
\hline[2pt]
\hline[2pt]
\end{tblr}
\caption{M17 Addresses}
\end{table}
@ -1584,10 +1584,10 @@ The final address encoded into the 6-byte LSF/LICH field would be \texttt{0$\tim
\section{Encoding Reserved Addresses}
Reserved addresses can be encoded by prepending an 8 character callsign with a hash character, \texttt{\#}. The hash
indicates that \texttt{$40^9$} is added to the encoded value of the eight character subfield. Thus, a lone hash
Reserved addresses can be encoded by prepending an 8 character callsign with a hash character, \texttt{\#}. The hash
indicates that \texttt{$40^9$} is added to the encoded value of the eight character subfield. Thus, a lone hash
symbol encodes to \texttt{0$\times$EE6B28000000},
while \texttt{\#A} is \texttt{0$\times$EE6B28000001} and so on.
while \texttt{\#A} is \texttt{0$\times$EE6B28000001} and so on.
Using this scheme, the last hash encodable special address, a hash followed by eight dots, is
\texttt{0$\times$F46108FFFFFF}.
@ -1603,60 +1603,46 @@ be documented here. Developers can register the hash address(es) by submitting a
\pagebreak
\section{C++ Encoder Example}
\section{Encoder Example}
\begin{lstlisting}[language=C++]
#include <string>
#include <cassert>
#include <cstdint>
\begin{lstlisting}[language=C,numbers=none]
#include <stddef.h>
#include <stdint.h>
#include <string.h>
const std::string m17chars(" ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-/.");
// Input callsign is assumed to be in uppercase
void Encode(const std::string& callsign, uint8_t* pUChar)
void Encode(const char *callsign, uint8_t *pUChar)
{
assert(NULL != pUChar);
uint64_t address = 0; // the calculate address in host byte order
std::string cs(callsign);
cs.resize(9, ' '); // truncate or fill to 9 characters
uint64_t address = 0;
if (0 == cs.compare("ALL "))
if (pUChar && callsign && *callsign) // quick check the input
{
address = 0xffffffffffffu; // handle the broadcast
}
else
{
bool isReserved = false;
// is this a reserved callsign?
if ('#' == cs.at(0))
const char *p = callsign;
// find the last char
while (*p++ && (p-callsign < 9)) ;
// process each char from the end to the beginning
for (p--; p>=callsign; p--)
{
isReserved = true;
cs.erase(0, 1);
unsigned val = 0; // the default value of the character
if ('A' <= *p && *p <= 'Z') val = *p - 'A' + 1;
else if ('0' <= *p && *p <= '9') val = *p - '0' + 27;
else if ('-' == *p) val = 37;
else if ('/' == *p) val = 38;
else if ('.' == *p) val = 39;
else if ('a' <= *p && *p <= 'z') val = *p - 'a' + 1;
if (p == callsign && '#' == *p) // is this a hashed address?
address += 0xee6b28000000ull;
else
address = 40u * address + val; // increment and add
}
// calculate the address, in host byte order
for (int i = cs.size() - 1; i >= 0; i--)
{
auto pos = m17chars.find(cs.at(i));
if (pos == std::string::npos)
{
pos = 0; // not in the M17 character set, use a space
}
address *= 40;
address += pos;
}
if (isReserved)
{
// offset the address if there was a leading '#'
address += 0xee6b28000000u;
}
if (0x4ce1ull == address) // is this "ALL"?
address = 0xffffffffffffull;
}
// store the address in network byte order
for (int i = 5; i >= 0; i--)
for (int i=5; i>=0; i--) // put it in network byte order
{
pUChar[i] = address & 0xffu;
address /= 0x100u;
@ -1666,49 +1652,49 @@ void Encode(const std::string& callsign, uint8_t* pUChar)
\pagebreak
\section{C++ Decoder Example}
\section{Decoder Example}
\begin{lstlisting}[language=C++]
#include <string>
#include <cassert>
#include <cstdint>
\begin{lstlisting}[language=C,numbers=none]
#include <stddef.h>
#include <stdint.h>
#include <string.h>
std::string Decode(const uint8_t* pUChar)
char *Decode(const uint8_t* pUChar)
{
assert(NULL != pUChar);
static char cs[10];
strcpy(cs, " ");
if (NULL == pUChar)
return cs;
const char *m17chars = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-/.";
// calculate the address in host byte order
uint64_t address = 0;
for (int i=0; i<6; i++)
address = address * 0x100u + pUChar[i];
// is this the broadcast address?
if (address == 0xffffffffffffu)
if (address == 0xffffffffffffu) // is this the broadcast address?
return "ALL ";
if (address >= 0xf4610a000000u) // is it in the decodable range?
return cs;
unsigned i = 0; // start decoding
if (address > 0xee6b27ffffffu) // is this a reserved address?
{
return std::string("ALL ");
cs[i++] = '#';
address -= 0xee6b28000000u;
}
std::string callsign;
// is it in the decodable range?
if (address < 0xf4610a000000u)
while (address) // get the characters
{
// is this a reserved address
if (address > 0xee6b27ffffffu)
{
callsign.assign("#");
address -= 0xee6b28000000u;
}
while (address)
{
callsign.append(1, m17chars[address % 40u]);
address /= 40u;
}
cs[i++] = m17chars[address % 40u];
address /= 40u;
}
callsign.resize(9, ' '); // fill to 9 characters
return callsign;
return cs;
}
\end{lstlisting}
@ -1866,7 +1852,7 @@ This is equivalent to 0xC75 in hexadecimal notation. Both the generating matrix
\begin{align}
G = [I_{12}|P] = \left[
\begin{array}{cr}
I_{12} \begin{matrix}
I_{12} \begin{matrix}
1&1&0&0&0&1&1&1&0&1&0&1 \\
0&1&1&0&0&0&1&1&1&0&1&1 \\
1&1&1&1&0&1&1&0&1&0&0&0 \\
@ -1928,7 +1914,7 @@ Sample MATLAB/Octave code snippet for generating $G$ and $H$ matrices is shown b
\begin{lstlisting}[language=Matlab]
P = hex2poly('0xC75');
[H,G] = cyclgen(23, P);
G_P = G(1:12, 1:11);
I_K = eye(12);
G = [I_K G_P P.'];
@ -1985,7 +1971,7 @@ The linearized representations are:
P1 = [1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1,
1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1,
0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1]
P2 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
\end{verbatim}
@ -2006,9 +1992,9 @@ The linearized representation is:
\chapter{Interleaving}
For interleaving a Quadratic Permutation Polynomial (QPP) is used. The polynomial
For interleaving a Quadratic Permutation Polynomial (QPP) is used. The polynomial
$\pi(x)=(45x+92x^2)\mod 368$
$\pi(x)=(45x+92x^2)\mod 368$
is used for a 368 bit interleaving pattern QPP.
@ -2186,9 +2172,9 @@ The reason for this is that it allows for easier synchronization. This is equiva
static constexpr uint16_t MASK = 0x1FF;
static constexpr uint8_t TAP_1 = 8; // Bit 9
static constexpr uint8_t TAP_2 = 4; // Bit 5
uint16_t state = 1;
public:
bool generate()
{
@ -2320,7 +2306,7 @@ Short for ``Keep it simple, stupid''. A simplified TNC protocol designed to move
\subsection{type indicator}
A one byte code at the beginning of a KISS frame which indicates the TNC \textbf{port} and KISS \textbf{command}.
A one byte code at the beginning of a KISS frame which indicates the TNC \textbf{port} and KISS \textbf{command}.
\subsection{port}
@ -2643,7 +2629,7 @@ dev -\textgreater{} rrc -\textgreater{} bin -\textgreater{} aud
\section{To-Do}
File formats for packet and voice + data streams.
File formats for packet and voice + data streams.
\section{References}
@ -2661,18 +2647,18 @@ Raised Cosine}
%\label{label_fdl}
\begin{center}
Version 1.3, 3 November 2008
Copyright \copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
\bigskip
\texttt{<https://fsf.org/>}
\bigskip
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
\end{center}
@ -2786,7 +2772,7 @@ A section ``\textbf{Entitled XYZ}'' means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
specific section name mentioned below, such as ``\textbf{Acknowledgements}'',
``\textbf{Dedications}'', ``\textbf{Endorsements}'', or ``\textbf{History}''.)
``\textbf{Dedications}'', ``\textbf{Endorsements}'', or ``\textbf{History}''.)
To ``\textbf{Preserve the Title}''
of such a section when you modify the Document means that it remains a
section ``Entitled XYZ'' according to this definition.
@ -2876,43 +2862,43 @@ and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified Version:
\begin{itemize}
\item[A.]
\item[A.]
Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document). You may use the same title as a previous version
if the original publisher of that version gives permission.
\item[B.]
List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.
\item[C.]
State on the Title page the name of the publisher of the
Modified Version, as the publisher.
\item[D.]
Preserve all the copyright notices of the Document.
\item[E.]
Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
\item[F.]
Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.
\item[G.]
Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
\item[H.]
Include an unaltered copy of this License.
\item[I.]
Preserve the section Entitled ``History'', Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
@ -2921,7 +2907,7 @@ of it. In addition, you must do these things in the Modified Version:
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
\item[J.]
Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
@ -2930,26 +2916,26 @@ of it. In addition, you must do these things in the Modified Version:
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
\item[K.]
For any section Entitled ``Acknowledgements'' or ``Dedications'',
Preserve the Title of the section, and preserve in the section all
the substance and tone of each of the contributor acknowledgements
and/or dedications given therein.
\item[L.]
Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
\item[M.]
Delete any section Entitled ``Endorsements''. Such a section
may not be included in the Modified Version.
\item[N.]
Do not retitle any existing section to be Entitled ``Endorsements''
or to conflict in title with any Invariant Section.
\item[O.]
Preserve any Warranty Disclaimers.
\end{itemize}
@ -3220,15 +3206,15 @@ to permit their use in free software.
\begin{center}
{\parindent 0in
Copyright \copyright\ 1989, 1991 Free Software Foundation, Inc.
\bigskip
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\bigskip
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
}
@ -3293,11 +3279,11 @@ modification follow.
%\renewcommand{\theenumi}{\alpha{enumi}}
\begin{enumerate}
\addtocounter{enumi}{-1}
\item
\item
This License applies to any program or other work which contains a notice
placed by the copyright holder saying it may be distributed under the
terms of this General Public License. The ``Program'', below, refers to
@ -3307,45 +3293,45 @@ modification follow.
modifications and/or translated into another language. (Hereinafter,
translation is included without limitation in the term ``modification''.)
Each licensee is addressed as ``you''.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
\item You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you conspicuously
and appropriately publish on each copy an appropriate copyright notice
and disclaimer of warranty; keep intact all the notices that refer to
this License and to the absence of any warranty; and give any other
recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you
may at your option offer warranty protection in exchange for a fee.
\item
You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
\begin{enumerate}
\item
\item
You must cause the modified files to carry prominent notices stating that
you changed the files and the date of any change.
\item
You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
\item
If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
@ -3357,10 +3343,10 @@ modification follow.
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
\end{enumerate}
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@ -3370,50 +3356,50 @@ modification follow.
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
\item
You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
\begin{enumerate}
\item
Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
\item
Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
\item
Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
\end{enumerate}
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
@ -3424,13 +3410,13 @@ modification follow.
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
\item
You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
@ -3439,7 +3425,7 @@ modification follow.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
\item
You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
@ -3449,7 +3435,7 @@ modification follow.
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
\item
Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
@ -3458,7 +3444,7 @@ modification follow.
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
\item
If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
@ -3472,12 +3458,12 @@ modification follow.
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
@ -3488,10 +3474,10 @@ modification follow.
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
\item
If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
@ -3500,13 +3486,13 @@ modification follow.
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
\item
The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and ``any
later version'', you have the option of following the terms and conditions
@ -3514,7 +3500,7 @@ modification follow.
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
\item
If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
@ -3523,13 +3509,13 @@ modification follow.
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
\begin{center}
{\Large\sc
No Warranty
}
\end{center}
\item
{\sc Because the program is licensed free of charge, there is no warranty
for the program, to the extent permitted by applicable law. Except when
@ -3540,7 +3526,7 @@ modification follow.
to the quality and performance of the program is with you. Should the
program prove defective, you assume the cost of all necessary servicing,
repair or correction.}
\item
{\sc In no event unless required by applicable law or agreed to in writing
will any copyright holder, or any other party who may modify and/or
@ -3551,7 +3537,7 @@ modification follow.
you or third parties or a failure of the program to operate with any other
programs), even if such holder or other party has been advised of the
possibility of such damages.}
\end{enumerate}
@ -3577,17 +3563,17 @@ the exclusion of warranty; and each file should have at least the
\begin{quote}
one line to give the program's name and a brief idea of what it does. \\
Copyright (C) yyyy name of author \\
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@ -3619,7 +3605,7 @@ necessary. Here is a sample; alter the names:
\begin{quote}
Yoyodyne, Inc., hereby disclaims all copyright interest in the program \\
`Gnomovision' (which makes passes at compilers) written by James Hacker. \\
signature of Ty Coon, 1 April 1989 \\
Ty Coon, President of Vice
\end{quote}