\documentclass[11pt,a4paper,usenames,dvipsnames]{article}



\usepackage{../tikz-osci}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage[most]{tcolorbox}
\usepackage{hyperref}
\title{TikZ Oscilloscope Package}
\author{Thibault Giauffret}
\def\version{0.4.0}

% Use sans serif font
\renewcommand{\familydefault}{\sfdefault}

% Remove paragraph indentation
\setlength{\parindent}{0pt}

% Listings
\newtcblisting{listing}{
   listing only,
   hbox,
   listing options={
           basicstyle=\small\ttfamily,
           breaklines=true,
           columns=fullflexible
       },
}

\begin{document}

\begin{tcolorbox}
   \begin{center}
       \vspace{0.3cm}
       {\huge \textbf{TikZ Oscilloscope Package}}\\[0.3cm]
       {\Large Thibault Giauffret}\\[0.3cm]
       \textit{Version \version\ of \today}\\[0.3cm]
       \vspace{0.3cm}
   \end{center}
\end{tcolorbox}

\section{Introduction}

\begin{minipage}{0.5\linewidth}
   \begin{center}
       \osci[%
           scale=0.7,
           sample rate=500,
           func one=1.78*sin(2*180/0.020*x),
           horizontal cursor one=-1.78,
           horizontal cursor two=1.78,
       ]
   \end{center}
\end{minipage}
\begin{minipage}{0.5\linewidth}
   \begin{center}
       \osci[%
           scale=0.7,
           second channel=1,
           screen offset one=2,
           screen offset two=-2,
           time div=10,
           voltage div one=4,
           voltage div two=1,
           sample rate=400,
           xy mode=0,
           func one=(sin(2*180*x/0.02)>0?6:-6),
           func two=1*sin(2*180/0.020*x)+0.2*sin(2*180/0.040*x),
           indicators=0,
           color one=FAC356,
           color two=C18FFA,
           color text one = 000000,
           color text two = 000000,
           graph back color=3C4A66,
           info back color=333333,
           info text color=FFFFFF,
           main axis color=DDDDDD,
           grid color=CCCCCC,
       ]
   \end{center}
\end{minipage}

\vspace*{0.5cm}


This package is a modest alternative to the \texttt{pst-osci} package (not maintained anymore). It allows you to draw oscilloscope "screen shots" with \LaTeX{}, TikZ and pgfplots.

\subsection*{Contact}

Some features are not implemented yet, but the package is already usable for basic representations. I'm doing this for fun and still learning how to make \LaTeX{} packages. Therefore, I'm open to any suggestion or contribution :

\begin{center}
   \texttt{
       contact at ensciences dot fr
   }
\end{center}

\subsection*{Issues tracker}

An issues tracker is available at :
\begin{center}
   \url{https://framagit.org/ThibGiauffret/latex_packages/-/issues}.
\end{center}

Feel free to report any bug you find or send suggestions.\\

\textbf{Important note :} Please indicate the concerned package name in the title of the issue. For example, if you want to report an issue about this package, please use the following title : \texttt{[tikz-osci] My issue report title}.

\section{Usage}

The package is loaded with the command \verb|\usepackage{tikz-osci}|. It defines a single command, \verb|\osci|, which takes a list of options as argument. The options allow you to configure and customize the oscilloscope screen view :

\begin{tcolorbox}[enhanced,breakable,colback=white,colframe=black,width=\textwidth,left=0mm,right=0mm,top=0mm,bottom=0mm,boxsep=0mm]
   \begin{tabular}{p{0.2\textwidth}|p{0.47\textwidth}|p{0.255\textwidth}}
       \texttt{scale}                 & Scale of the oscilloscope (with \texttt{scalebox}).                                                                    & Default: \texttt{1}                                             \\\hline
       \texttt{rounded corners}       & Radius of the oscilloscope corners (in pt).                                                                            & Default: \texttt{10}                                            \\\hline
       \texttt{second channel}        & 1 if the second channel is enabled, 0 otherwise.                                                                       & Default: \texttt{0}                                             \\\hline
       \texttt{screen offset one}     & Vertical screen offset of the first channel.                                                                           & Default: \texttt{0}                                             \\\hline
       \texttt{screen offset two}     & Vertical screen offset of the second channel.                                                                          & Default: \texttt{0}                                             \\\hline
       \texttt{time div}              & Time division (in ms).                                                                                                 & Default: \texttt{20}                                            \\\hline
       \texttt{voltage div one}       & Voltage division of the first channel (in V).                                                                          & Default: \texttt{1}                                             \\\hline
       \texttt{voltage div two}       & Voltage division of the second channel (in V).                                                                         & Default: \texttt{1}                                             \\\hline
       \texttt{sample rate}           & Sample rate.                                                                                                           & Default: \texttt{200}                                           \\\hline
       \texttt{xy mode}               & 1 if the oscilloscope is in XY mode (Lissajous curve), 0 otherwise.                                                    & Default : 0                                                     \\\hline
       \texttt{math mode}             & 1 for addition, 2 for subtraction, 3 for multiplication, 4 for division, 0 otherwise. xy mode option must be set to 0. & Default: \texttt{0}                                             \\\hline
       \texttt{math mode hide source} & 0 to display channels CH1 and CH2 with the third channel, 1 to hide them.                                              & Default : \texttt{0}                                            \\\hline
       \texttt{func one}              & Expression of the first channel (pgf maths format). Trigonometric functions are defined in degrees.                    & Default: \texttt{2*sin(2*180/0.020*x)}                          \\\hline
       \texttt{func two}              & Expression of the second channel (pgf maths format). Trigonometric functions are defined in degrees.                   & Default: \texttt{1*sin(2*180/0.020*x) + 0.2*sin(2*180/0.040*x)} \\\hline
       \texttt{indicators}            & 1 if the channel indicators are enabled, 0 otherwise.                                                                  & Default: \texttt{1}                                             \\\hline
       \texttt{horizontal cursor one} & Horizontal position of the first cursor (between -4 and 4). \texttt{false} to disable.                                 & Default: \texttt{false}                                         \\\hline
       \texttt{horizontal cursor two} & Horizontal position of the second cursor (between -4 and 4). \texttt{false} to disable.                                & Default: \texttt{false}                                         \\\hline
       \texttt{vertical cursor one}   & Vertical position of the first cursor (between -4 and 4). \texttt{false} to disable.                                   & Default: \texttt{false}                                         \\\hline
       \texttt{vertical cursor two}   & Vertical position of the second cursor (between -4 and 4). \texttt{false} to disable.                                  & Default: \texttt{false}                                         \\\hline
       \texttt{cursor precision}      & Number of digits after the decimal point for the cursor values.                                                        & Default: \texttt{1}                                             \\\hline
       \texttt{color one}             & Color of the first channel (in hexadecimal).                                                                           & Default: \texttt{D62626}                                        \\\hline
       \texttt{color text one}        & Text color of the first channel (in hexadecimal).                                                                      & Default: \texttt{FFFFFF}                                        \\\hline
       \texttt{color two}             & Color of the second channel (in hexadecimal).                                                                          & Default: \texttt{1053AF}                                        \\\hline
       \texttt{color text two}        & Text color of the second channel (in hexadecimal).                                                                     & Default: \texttt{FFFFFF}                                        \\\hline
       \texttt{color three}           & Color of the XY mode and the math mode (in hexadecimal).                                                               & Default: \texttt{2E8B73}                                        \\\hline
       \texttt{color text three}      & Text color of the XY mode and the math mode (in hexadecimal).                                                          & Default: \texttt{FFFFFF}                                        \\\hline
       \texttt{graph back color}      & Background color of the graph (in hexadecimal).                                                                        & Default: \texttt{FFFFFF}                                        \\\hline
       \texttt{info back color}       & Background color of the information box (in hexadecimal).                                                              & Default: \texttt{D6D6D6}                                        \\\hline
       \texttt{info text color}       & Text color of the information box (in hexadecimal).                                                                    & Default: \texttt{000000}                                        \\\hline
       \texttt{main axis color}       & Color of the main axis (in hexadecimal).                                                                               & Default: \texttt{000000}                                        \\\hline
       \texttt{grid color}            & Color of the grid (in hexadecimal).                                                                                    & Default: \texttt{CCCCCC}
   \end{tabular}
\end{tcolorbox}


\begin{tcolorbox}[enhanced,breakable,colback=white,colframe=black,width=\textwidth,left=0mm,right=0mm,top=0mm,bottom=0mm,boxsep=0mm]
   \begin{tabular}{p{0.2\textwidth}|p{0.47\textwidth}|p{0.255\textwidth}}

       \texttt{horizontal cursor color} & Color of the horizontal cursor (in hexadecimal). & Default: \texttt{FFA500} \\\hline
       \texttt{vertical cursor color}   & Color of the vertical cursor (in hexadecimal).   & Default: \texttt{800080}\\\hline
       \texttt{smooth one}                      & 1 to smooth the first channel, 0 otherwise.                                                                            & Default: \texttt{0}\\\hline
       \texttt{smooth two}                      & 1 to smooth the second channel, 0 otherwise.                                                                           & Default: \texttt{0}\\\hline
       \texttt{smooth three}                    & 1 to smooth the third channel, 0 otherwise.                                                                            & Default: \texttt{0}
   \end{tabular}
\end{tcolorbox}


A quick documentation in french is available here :

\begin{center}
   \url{https://www.ensciences.fr/read.php?article=1220}
\end{center}


\section{Examples}

For more examples, see the \texttt{tikz-osci-example.tex} file.

\begin{tcblisting}{enhanced,colback=white,colframe=black,width=\textwidth, title=\bfseries Two channels plot with custom background color, sidebyside}
\osci[%
   scale=0.7,
   second channel=1,
   screen offset one=2,
   screen offset two=-2,
   time div=20,
   voltage div one=4,
   voltage div two=1,
   sample rate=200,
   xy mode=0,
   func one=2*sin(2*180/0.020*x),
   func two=1*sin(2*180/0.020*x) + 0.2*sin(2*180/0.040*x),
   color one=D62626,
   color two=1053AF,
   graph back color=669966,
   info back color=D6D6D6,
   grid color=CCCCCC
]
\end{tcblisting}

\begin{tcblisting}{enhanced,colback=white,colframe=black,width=\textwidth, title=\bfseries Lissajous curve (XY mode) and no rounded corner, sidebyside}
\osci[%
   scale=0.7,
   rounded corners=0,
   second channel=1,
   time div=300,
   voltage div one=1,
   voltage div two=0.5,
   sample rate=500,
   xy mode=1,
   func one=sin(7*x),
   func two=sin(2*x),
   indicators=1,
   graph back color=FFFFFF,
   info back color=D6D6D6,
   info text color=000000,
   main axis color=000000,
   grid color=CCCCCC,
]
\end{tcblisting}

\begin{tcblisting}{enhanced,colback=white,colframe=black,width=\textwidth, title=\bfseries Math mode (multiply) with hidden sources and dark mode, sidebyside}
\osci[%
   scale=0.7,
   second channel=1,
   time div=10,
   voltage div one=2,
   voltage div two=2,
   sample rate=500,
   xy mode=0,
   math mode=3,
   math mode hide source=1,
   func one=2*sin(2*180/0.040*x),
   func two=3*sin(2*180/0.005*x),
   indicators=0,
   color three=F0DE25,
   color text three=000000,
   graph back color=777799,
   info back color=333333,
   info text color=FFFFFF,
   main axis color=DDDDDD,
   grid color=CCCCCC,
]
\end{tcblisting}

\begin{tcblisting}{enhanced,colback=white,colframe=black,width=\textwidth, title=\bfseries Common periodic signals,sidebyside}
% Square wave function
\pgfmathdeclarefunction{square}{4}{%
\pgfmathparse{(sin(2*180*x/#2+#4) + #3>0?#1:-#1)}%
}

% Triangle wave function
\pgfmathdeclarefunction{triangle}{4}{%
\pgfmathparse{#1*asin(sin(2*180/#2*x + #4))/90}%
}

\osci[%
   scale=0.7,
   second channel=1,
   sample rate=1000,
   time div=100,
   func one={triangle(2,0.2,0,0)},
   func two={square(2,0.2,0,0)},
   smooth one = 1,
   smooth two = 0,
]
\end{tcblisting}

\begin{tcblisting}{enhanced,colback=white,colframe=black,width=\textwidth, title=\bfseries Vertical and horizontal cursors (values displayed with two digits),sidebyside}
\osci[%
   scale=0.7,
   second channel=0,
   time div=100,
   voltage div one=1,
   sample rate=200,
   func one={sin(2*180*x)},
   vertical cursor one=-2.5,
   vertical cursor two=2.5,
   horizontal cursor one=1,
   horizontal cursor two=-1,
   cursor precision=2
]
\end{tcblisting}

\section{License}

This package is distributed under the terms of the \textbf{LaTeX Project Public License} (LPPL), version 1.3c or later. The latest version of this license is available at \url{http://www.latex-project.org/lppl.txt}.

\section{Credits}

This package requires the following packages :
\begin{itemize}
   \item \texttt{xcolor} maintained by the \textit{LaTeX3 Project}  (license LPPL 1.3c) ;
   \item tikz maintained by the \textit{TikZ and PGF Project} (license LPPL 1.3c) ;
   \item pgfkeys maintained by the \textit{Till Tantau} (license LPPL) ;
   \item pgfplots maintained by the \textit{Christian Feuersänger} (license LPPL).
\end{itemize}

\section{Changelog}

\begin{itemize}
   \item \textbf{0.4.0} (2023/10/24) :
         \subitem Added cursor and smooth options.
         \subitem Added square and triangle plot examples.
         \subitem Fixed the pgf keys declaration.
   \item \textbf{0.3.0} (2023/10/08) :
         \subitem Implemented XY mode and math (add, subtract, multiply, divide) functionalities.
   \item \textbf{0.2.0} (2023/10/07) :
         \subitem Added \texttt{color text one}, \texttt{color text two} and \texttt{color text xy} options.
         \subitem Added \texttt{indicators} option.
         \subitem Added \texttt{rounded corners} option.
         \subitem Fixed the main axis color not being applied.
         \subitem Reworded the documentation and the example file.
   \item \textbf{0.1.1} (2023/10/06) :
         \subitem Renamed \texttt{sub axis color} to \texttt{grid color}.
         \subitem Renamed \texttt{expr one} and \texttt{expr two} to \texttt{func one} and \texttt{func two}.
         \subitem Updated package files names.
   \item \textbf{0.1.0} (2023/10/06) : Initial release. XY mode not implemented yet.
\end{itemize}

\end{document}