\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}
