# HG changeset patch # User Louis Opter # Date 1485813748 -3600 # Node ID b11374d8b7459022f1e8974a1359f612a00b96a6 # Parent f8d1c74a24c4831901ce0796c1a2c1e4d77055b3 wip fosdem diff -r f8d1c74a24c4 -r b11374d8b745 add_slides.patch --- a/add_slides.patch Sun Jan 29 13:39:55 2017 +0100 +++ b/add_slides.patch Mon Jan 30 23:02:28 2017 +0100 @@ -1704,7 +1704,7 @@ new file mode 100644 --- /dev/null +++ b/slides/fosdem_2017/fosdem_2017.tex -@@ -0,0 +1,813 @@ +@@ -0,0 +1,1261 @@ +\documentclass[utf8x,xcolor={usenames,svgnames}]{beamer} + +\usepackage{tikz} @@ -1770,39 +1770,253 @@ +\subsection{About me} + +\begin{frame}{\LARGE{\texttt{\$ whoami}}} -+\onslide<1->{% +Hello, my name is Louis (Opter) and I:\vspace{1em} +\begin{itemize} -+\item am a good software engineer, a bad computer scientist; -+\item am (distributed) systems oriented; -+\item do hella C, Python and devops, use FOSS since '05; ++\item am a decent software engineer; +\item \emph{do not really know anything about hardware.} +\end{itemize} +\vspace{1em} -+} -+\onslide<2>{Anyway, it doesn't matter, let's get started!} ++Anyway, it doesn't really matter, let's get started! ++\end{frame} ++ ++\subsection{Plan} ++ ++\begin{frame}{Agenda} ++Two related projects to talk about: ++\vspace{1em} ++\begin{description} ++\item[monolight] An UI for a 128 buttons matrix and lightsd; ++\item[lightsd] A daemon to easily control LIFX light bulbs. ++\end{description} ++\pause ++\vspace{2em} ++Outline: ++\vspace{1em} ++\begin{itemize} ++\item monolight: explanation, demo, implementation, ideas; ++\item lightsd: API demo, implementation, ideas, about LIFX; ++\item Q\&A, discussion. ++\end{itemize} +\end{frame} + -+\section{Monolight} ++\begin{frame}{High-level architecture} ++\begin{center} ++\begin{tikzpicture}[overlay] ++\coordinate (Origin) at (0,0); ++ ++\fill[controlpt] (Origin) circle (0.1); ++ ++\node[box] (monolight) at (3.5,0.75) {monolight}; ++\node[box] (lightsd) at (0.5,-2) {lightsd}; ++\draw[ultra thick] (-1.46, 1.5) -| (monolight); ++\node (monome) at (-3.5,1.5) {\begin{tikzpicture}[scale=0.5] ++\coordinate (NW) at (-4, 1.75); ++\coordinate (SE) at (3.86, -2.11); ++ ++\fill[color=case,rounded corners=2pt] ($(NW) + (-0.18,0.18)$) rectangle ($(SE) + (0.18,-0.18)$); ++\fill[color=plate,rounded corners=2pt] ($(NW) + (-0.10,0.10)$) rectangle ($(SE) + (0.10,-0.10)$); ++ ++\foreach \x in {-4,-3.5,...,3.5} ++\foreach \y in {1.75,1.25,...,-1.75} ++\fill[mbuttoff] (\x, \y) rectangle +(0.36, -0.36); ++\end{tikzpicture}}; ++\node (bulbh) at (-4.2,-1.1) {% ++\colorlet{LightColor}{LightSlateBlue} ++\begin{tikzpicture}[scale=0.19,rotate=90] ++% main body ++\fill[color=BodyColor] ++ (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) -- ++ ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle; ++% main body light ++\draw[line width=1.5mm,line cap=round,rounded corners=1pt,color=BodyColor!80!white] ++ (-16mm,0.5mm) .. controls (0,-0.4mm) .. (16mm,0.5mm); ++\draw[line width=2mm,rounded corners=1pt,color=BodyColor!80!white] ++ (16.5mm,32mm) -- ++(0,-32mm) -- ++(-15mm,-22mm); ++ ++% led - body separator ++\fill[color=BodyColor!90!black] (-20mm,32mm) -- ++(0,2.5mm) -- ++(40mm,0) -- ++(0,-2.5mm) -- cycle; ++ ++% led part ++\fill[color=LightColor] ++ (-28mm,34.5mm) -- ++(0,14mm) ++ .. controls ++(28mm,1mm) .. ++(56mm,0) ++ -- ++(0,-14mm) -- cycle; ++ ++% lower body ++\fill[color=BodyColor!90!black] ++ (-14mm,-18mm) -- ++(0,-18mm) -- ++ ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm) ++ -- ++(0,18mm); ++ ++% socket ++\fill[color=SocketColor] ++ (-10mm,-38mm) -- ++(0,-4mm) ++ decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)} ++ -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm) ++ decorate[screw] {(10mm,-52mm) -- ++(0,10mm)} ++ -- (10mm,-38mm) -- ++(-20mm,0) -- ++(0,-4mm) -- cycle; ++\draw[thin,color=SocketColor] (-10mm,-42mm) -- (10mm,-52mm); ++ ++% socket light ++\draw[line width=1mm,line cap=round,rounded corners=1pt,color=SocketColor!90!white] ++ (4.5mm,-38mm) -- ++(0,-14mm) -- ++(-4mm,-2.5mm); ++ ++% lower body light ++\draw[line width=1.8mm,color=BodyColor] ++ (5mm,-18mm) -- ++(0,-20mm); ++ ++% led - body separator light ++\draw[line width=1.6mm, color=BodyColor] (16mm,32mm) -- ++(0,2.5mm); ++% led - body separator shade ++\draw[thin, color=BodyColor!80!black] (-20mm,32mm) -- ++(0,2.5mm); ++\draw[thin, color=BodyColor!80!black] (20mm,32mm) -- ++(0,2.5mm); ++ ++% socket shade ++\draw[color=SocketColor!80!black] ++ (-10mm,-38mm) -- ++(0,-4mm) ++ decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)} ++ -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm) ++ decorate[screw] {(10mm,-52mm) -- ++(0,10mm)} ++ -- (10mm,-38mm); ++\draw[color=fgcolor] ++ (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm); ++\draw[rounded corners=1pt,color=SocketColor!80!black] ++ (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm); ++ ++% lower body shade ++\draw[rounded corners=1pt,color=BodyColor!50!black] ++ (-14mm,-18mm) -- ++(0,-18mm) -- ++ ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm) ++ -- ++(0,18mm); ++ ++% body shade ++\draw[thick,rounded corners=1pt,color=BodyColor!60!black] ++ (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) -- ++ ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle; ++ ++% led shade ++\draw[thick,rounded corners=1pt,color=LightColor!70!white] ++ (-28mm,34.5mm) -- ++(0,14mm) ++ .. controls ++(28mm,1mm) .. ++(56mm,0) ++ -- ++(0,-14mm) -- cycle; ++\end{tikzpicture}}; ++\node (bulbl) at (-4.2,-2.9) {% ++\colorlet{LightColor}{IndianRed} ++\begin{tikzpicture}[scale=0.19,rotate=90] ++% main body ++\fill[color=BodyColor] ++ (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) -- ++ ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle; ++% main body light ++\draw[line width=1.5mm,line cap=round,rounded corners=1pt,color=BodyColor!80!white] ++ (-16mm,0.5mm) .. controls (0,-0.4mm) .. (16mm,0.5mm); ++\draw[line width=2mm,rounded corners=1pt,color=BodyColor!80!white] ++ (16.5mm,32mm) -- ++(0,-32mm) -- ++(-15mm,-22mm); ++ ++% led - body separator ++\fill[color=BodyColor!90!black] (-20mm,32mm) -- ++(0,2.5mm) -- ++(40mm,0) -- ++(0,-2.5mm) -- cycle; ++ ++% led part ++\fill[color=LightColor] ++ (-28mm,34.5mm) -- ++(0,14mm) ++ .. controls ++(28mm,1mm) .. ++(56mm,0) ++ -- ++(0,-14mm) -- cycle; ++ ++% lower body ++\fill[color=BodyColor!90!black] ++ (-14mm,-18mm) -- ++(0,-18mm) -- ++ ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm) ++ -- ++(0,18mm); ++ ++% socket ++\fill[color=SocketColor] ++ (-10mm,-38mm) -- ++(0,-4mm) ++ decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)} ++ -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm) ++ decorate[screw] {(10mm,-52mm) -- ++(0,10mm)} ++ -- (10mm,-38mm) -- ++(-20mm,0) -- ++(0,-4mm) -- cycle; ++\draw[thin,color=SocketColor] (-10mm,-42mm) -- (10mm,-52mm); ++ ++% socket light ++\draw[line width=1mm,line cap=round,rounded corners=1pt,color=SocketColor!90!white] ++ (4.5mm,-38mm) -- ++(0,-14mm) -- ++(-4mm,-2.5mm); ++ ++% lower body light ++\draw[line width=1.8mm,color=BodyColor] ++ (5mm,-18mm) -- ++(0,-20mm); ++ ++% led - body separator light ++\draw[line width=1.6mm, color=BodyColor] (16mm,32mm) -- ++(0,2.5mm); ++% led - body separator shade ++\draw[thin, color=BodyColor!80!black] (-20mm,32mm) -- ++(0,2.5mm); ++\draw[thin, color=BodyColor!80!black] (20mm,32mm) -- ++(0,2.5mm); ++ ++% socket shade ++\draw[color=SocketColor!80!black] ++ (-10mm,-38mm) -- ++(0,-4mm) ++ decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)} ++ -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm) ++ decorate[screw] {(10mm,-52mm) -- ++(0,10mm)} ++ -- (10mm,-38mm); ++\draw[color=fgcolor] ++ (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm); ++\draw[rounded corners=1pt,color=SocketColor!80!black] ++ (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm); ++ ++% lower body shade ++\draw[rounded corners=1pt,color=BodyColor!50!black] ++ (-14mm,-18mm) -- ++(0,-18mm) -- ++ ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm) ++ -- ++(0,18mm); ++ ++% body shade ++\draw[thick,rounded corners=1pt,color=BodyColor!60!black] ++ (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) -- ++ ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle; ++ ++% led shade ++\draw[thick,rounded corners=1pt,color=LightColor!70!white] ++ (-28mm,34.5mm) -- ++(0,14mm) ++ .. controls ++(28mm,1mm) .. ++(56mm,0) ++ -- ++(0,-14mm) -- cycle; ++\end{tikzpicture}}; ++ ++\draw[ultra thick] (lightsd) -| (monolight); ++\draw[wifipath] (bulbh.east) -- (-2.2,-1.15); ++\draw[wifipath] (lightsd.west) -- (-1.1,-2); ++\draw[wifipath] (bulbl.east) -- (-2.2,-2.85); ++\onslide<2->{% ++\draw[ultra thick,dashed] (-6,-0.2) -- (6,-0.2); ++\draw (0,-0.2) node[above] {\emph{Talk part 1 (monolight)}} ++ node[below] {\emph{part 2 (lightsd)}}; ++\fill[white,opacity=0.7] (-6,-6) rectangle (6,-0.2); ++} ++\end{tikzpicture} ++\end{center} ++\end{frame} ++ ++\section{monolight} + +\subsection{Controller UI} + -+\begin{frame}{What are we looking at?} ++\begin{frame}{monolight} +A controller (Monome grid 128 varibright): +\begin{itemize} +\item A matrix of 128 programmable button; -+\item 16 levels of brightness per button. ++\item 16 levels of brightness per button; ++\item Serial/RS232 (FTDI) connection. +\end{itemize} +\pause +\vspace{1em} +Controlling a "smart" bulb (LIFX Original 1000): +\begin{itemize} -+\item A 1000 lumens programmable light bulb; -+\item Nice colors, nice range of whites. ++\item A \textasciitilde1000 lumens programmable light bulb; ++\item Nice colors, nice range of whites; ++\item Wi-Fi 802.11bgn, 2.4gHz. +\end{itemize} +\pause +\vspace{1em} -+An uncomfortable amount of code. ++\emph{Let's have a look at the controller UI.} +\end{frame} + +\begin{frame}{The grid} @@ -2021,12 +2235,11 @@ + +\subsection{Demo} + -+\begin{frame}{Live} ++\begin{frame}{monolight live} +\begin{itemize} +\item Controls; -+\item CLI interface to lightsd; +\item UI feedback; -+\item Monolight layer definitions. ++\item monolight layer definitions. +\end{itemize} +\vspace{1em} +\pause @@ -2035,7 +2248,7 @@ + +\subsection{One last idea} + -+\begin{frame}{Timer/Repeat} ++\begin{frame}{Timer/Alert effect} +\begin{center} +\begin{tikzpicture}[overlay,scale=1.2] +\onslide<1->{% @@ -2089,9 +2302,9 @@ +\draw (caption) node[right] {Let's add two more functions:}; + +\node (timer) [below=0.5cm of b117] {timer}; -+\node (repeat) [below=0.9cm of b118] {repeat}; ++\node (alert) [below=0.9cm of b118] {alert}; +\draw[arrow] (timer) -- (b117); -+\draw[arrow] (repeat) -- (b118); ++\draw[arrow] (alert) -- (b118); +} +\onslide<2>{% +\draw (caption) node[right] {Time selection (1 lit button = 1 unit of time):}; @@ -2121,10 +2334,10 @@ +\node (timectl) [below=0.5cm of b121] {dec/inc time unit}; +} +\onslide<3>{% -+\draw (caption) node[right] {Target selection, optional repeat selection:}; ++\draw (caption) node[right] {Target and alert selection:}; + -+\node (repeat) [below=0.5cm of b118] {[repeat]}; -+\draw[arrow] (repeat) -- (b118); ++\node (alert) [below=0.5cm of b118] {alert}; ++\draw[arrow] (alert) -- (b118); + +\node[rectangle,opacity=0] (b0) at (-3.82,1.57) {B}; +\node[rectangle,opacity=0] (b4) at (-1.82,1.57) {B}; @@ -2144,16 +2357,38 @@ +\fill[mbutton] (-3.5, 1.75) rectangle +(0.36, -0.36); + +\node[rectangle] (b1) at (-3.32,1.57) {}; -+\node (feedback) [above=0.5cm of b1] {Activity feedback}; -+\draw[arrow] (feedback) -- (b1); ++\node (feedback) [above right=0.5cm of b1] {Timer activity feedback}; ++\draw[arrow] (feedback) -| (b1); +} +\end{tikzpicture} +\end{center} +\end{frame} + -+\section{Implementation details} ++\subsection{Implementation details} + -+\subsection{Architecture} ++\begin{frame}{monolight implementation} ++High-level details: ++\begin{itemize} ++\item Python ≥ 3.5 (pondering ≥ 3.6); ++\item Fully async (using \emph{asyncio} with the stream API); ++\item Fully typed, it's great; ++\item Very slow, no tests \Neutrey; ++\item Uses Artem Popov's \emph{pymonome/aiosc} libraries; ++\item 2/3 months of work, GPLv3. ++\end{itemize} ++\pause ++\vspace{1em} ++As we've seen, lot of fun stuff left: ++\begin{itemize} ++\item More UI features; ++\item UI animations; ++\item Control other things. ++\end{itemize} ++\end{frame} ++ ++\section{lightsd} ++ ++\subsection{Intro} + +\begin{frame}{High-level architecture} +\begin{center} @@ -2162,8 +2397,367 @@ + +\fill[controlpt] (Origin) circle (0.1); + -+\node[box] (serialoscd) at (0.5,1.5) {serialoscd}; -+\draw[ultra thick] (-1.46, 2.2) -| node[above, pos=0.4] {RS232 \small{(FTDI)}} (serialoscd); ++\node[box] (monolight) at (3.5,0.75) {monolight}; ++\node[box] (lightsd) at (0.5,-2) {lightsd}; ++\draw[ultra thick] (-1.46, 1.5) -| (monolight); ++\node (monome) at (-3.5,1.5) {\begin{tikzpicture}[scale=0.5] ++\coordinate (NW) at (-4, 1.75); ++\coordinate (SE) at (3.86, -2.11); ++ ++\fill[color=case,rounded corners=2pt] ($(NW) + (-0.18,0.18)$) rectangle ($(SE) + (0.18,-0.18)$); ++\fill[color=plate,rounded corners=2pt] ($(NW) + (-0.10,0.10)$) rectangle ($(SE) + (0.10,-0.10)$); ++ ++\foreach \x in {-4,-3.5,...,3.5} ++\foreach \y in {1.75,1.25,...,-1.75} ++\fill[mbuttoff] (\x, \y) rectangle +(0.36, -0.36); ++\end{tikzpicture}}; ++\node (bulbh) at (-4.2,-1.1) {% ++\colorlet{LightColor}{LightSlateBlue} ++\begin{tikzpicture}[scale=0.19,rotate=90] ++% main body ++\fill[color=BodyColor] ++ (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) -- ++ ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle; ++% main body light ++\draw[line width=1.5mm,line cap=round,rounded corners=1pt,color=BodyColor!80!white] ++ (-16mm,0.5mm) .. controls (0,-0.4mm) .. (16mm,0.5mm); ++\draw[line width=2mm,rounded corners=1pt,color=BodyColor!80!white] ++ (16.5mm,32mm) -- ++(0,-32mm) -- ++(-15mm,-22mm); ++ ++% led - body separator ++\fill[color=BodyColor!90!black] (-20mm,32mm) -- ++(0,2.5mm) -- ++(40mm,0) -- ++(0,-2.5mm) -- cycle; ++ ++% led part ++\fill[color=LightColor] ++ (-28mm,34.5mm) -- ++(0,14mm) ++ .. controls ++(28mm,1mm) .. ++(56mm,0) ++ -- ++(0,-14mm) -- cycle; ++ ++% lower body ++\fill[color=BodyColor!90!black] ++ (-14mm,-18mm) -- ++(0,-18mm) -- ++ ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm) ++ -- ++(0,18mm); ++ ++% socket ++\fill[color=SocketColor] ++ (-10mm,-38mm) -- ++(0,-4mm) ++ decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)} ++ -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm) ++ decorate[screw] {(10mm,-52mm) -- ++(0,10mm)} ++ -- (10mm,-38mm) -- ++(-20mm,0) -- ++(0,-4mm) -- cycle; ++\draw[thin,color=SocketColor] (-10mm,-42mm) -- (10mm,-52mm); ++ ++% socket light ++\draw[line width=1mm,line cap=round,rounded corners=1pt,color=SocketColor!90!white] ++ (4.5mm,-38mm) -- ++(0,-14mm) -- ++(-4mm,-2.5mm); ++ ++% lower body light ++\draw[line width=1.8mm,color=BodyColor] ++ (5mm,-18mm) -- ++(0,-20mm); ++ ++% led - body separator light ++\draw[line width=1.6mm, color=BodyColor] (16mm,32mm) -- ++(0,2.5mm); ++% led - body separator shade ++\draw[thin, color=BodyColor!80!black] (-20mm,32mm) -- ++(0,2.5mm); ++\draw[thin, color=BodyColor!80!black] (20mm,32mm) -- ++(0,2.5mm); ++ ++% socket shade ++\draw[color=SocketColor!80!black] ++ (-10mm,-38mm) -- ++(0,-4mm) ++ decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)} ++ -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm) ++ decorate[screw] {(10mm,-52mm) -- ++(0,10mm)} ++ -- (10mm,-38mm); ++\draw[color=fgcolor] ++ (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm); ++\draw[rounded corners=1pt,color=SocketColor!80!black] ++ (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm); ++ ++% lower body shade ++\draw[rounded corners=1pt,color=BodyColor!50!black] ++ (-14mm,-18mm) -- ++(0,-18mm) -- ++ ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm) ++ -- ++(0,18mm); ++ ++% body shade ++\draw[thick,rounded corners=1pt,color=BodyColor!60!black] ++ (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) -- ++ ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle; ++ ++% led shade ++\draw[thick,rounded corners=1pt,color=LightColor!70!white] ++ (-28mm,34.5mm) -- ++(0,14mm) ++ .. controls ++(28mm,1mm) .. ++(56mm,0) ++ -- ++(0,-14mm) -- cycle; ++\end{tikzpicture}}; ++\node (bulbl) at (-4.2,-2.9) {% ++\colorlet{LightColor}{IndianRed} ++\begin{tikzpicture}[scale=0.19,rotate=90] ++% main body ++\fill[color=BodyColor] ++ (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) -- ++ ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle; ++% main body light ++\draw[line width=1.5mm,line cap=round,rounded corners=1pt,color=BodyColor!80!white] ++ (-16mm,0.5mm) .. controls (0,-0.4mm) .. (16mm,0.5mm); ++\draw[line width=2mm,rounded corners=1pt,color=BodyColor!80!white] ++ (16.5mm,32mm) -- ++(0,-32mm) -- ++(-15mm,-22mm); ++ ++% led - body separator ++\fill[color=BodyColor!90!black] (-20mm,32mm) -- ++(0,2.5mm) -- ++(40mm,0) -- ++(0,-2.5mm) -- cycle; ++ ++% led part ++\fill[color=LightColor] ++ (-28mm,34.5mm) -- ++(0,14mm) ++ .. controls ++(28mm,1mm) .. ++(56mm,0) ++ -- ++(0,-14mm) -- cycle; ++ ++% lower body ++\fill[color=BodyColor!90!black] ++ (-14mm,-18mm) -- ++(0,-18mm) -- ++ ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm) ++ -- ++(0,18mm); ++ ++% socket ++\fill[color=SocketColor] ++ (-10mm,-38mm) -- ++(0,-4mm) ++ decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)} ++ -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm) ++ decorate[screw] {(10mm,-52mm) -- ++(0,10mm)} ++ -- (10mm,-38mm) -- ++(-20mm,0) -- ++(0,-4mm) -- cycle; ++\draw[thin,color=SocketColor] (-10mm,-42mm) -- (10mm,-52mm); ++ ++% socket light ++\draw[line width=1mm,line cap=round,rounded corners=1pt,color=SocketColor!90!white] ++ (4.5mm,-38mm) -- ++(0,-14mm) -- ++(-4mm,-2.5mm); ++ ++% lower body light ++\draw[line width=1.8mm,color=BodyColor] ++ (5mm,-18mm) -- ++(0,-20mm); ++ ++% led - body separator light ++\draw[line width=1.6mm, color=BodyColor] (16mm,32mm) -- ++(0,2.5mm); ++% led - body separator shade ++\draw[thin, color=BodyColor!80!black] (-20mm,32mm) -- ++(0,2.5mm); ++\draw[thin, color=BodyColor!80!black] (20mm,32mm) -- ++(0,2.5mm); ++ ++% socket shade ++\draw[color=SocketColor!80!black] ++ (-10mm,-38mm) -- ++(0,-4mm) ++ decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)} ++ -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm) ++ decorate[screw] {(10mm,-52mm) -- ++(0,10mm)} ++ -- (10mm,-38mm); ++\draw[color=fgcolor] ++ (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm); ++\draw[rounded corners=1pt,color=SocketColor!80!black] ++ (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm); ++ ++% lower body shade ++\draw[rounded corners=1pt,color=BodyColor!50!black] ++ (-14mm,-18mm) -- ++(0,-18mm) -- ++ ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm) ++ -- ++(0,18mm); ++ ++% body shade ++\draw[thick,rounded corners=1pt,color=BodyColor!60!black] ++ (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) -- ++ ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle; ++ ++% led shade ++\draw[thick,rounded corners=1pt,color=LightColor!70!white] ++ (-28mm,34.5mm) -- ++(0,14mm) ++ .. controls ++(28mm,1mm) .. ++(56mm,0) ++ -- ++(0,-14mm) -- cycle; ++\end{tikzpicture}}; ++ ++\draw[ultra thick] (lightsd) -| (monolight); ++\draw[wifipath] (bulbh.east) -- (-2.2,-1.15); ++\draw[wifipath] (lightsd.west) -- (-1.1,-2); ++\draw[wifipath] (bulbl.east) -- (-2.2,-2.85); ++\draw[ultra thick,dashed] (-6,-0.2) -- (6,-0.2); ++\draw (0,-0.2) node[above] {\emph{part 1 (monolight)}} ++ node[below] {\emph{Talk part 2 (lightsd)}}; ++\fill[white,opacity=0.7] (-6,3) rectangle (6,-0.2); ++\end{tikzpicture} ++\end{center} ++\end{frame} ++ ++\subsection{Demo} ++ ++\begin{frame}{lightsd API live} ++\begin{itemize} ++\item get\_light\_state; ++\item power\_toggle, targeting; ++\item set\_light\_from\_hsbk; ++\item set\_waveform. ++\end{itemize} ++\end{frame} ++ ++\subsection{Implementation details} ++ ++\begin{frame}{lightsd} ++\only<1>{% ++The ``parent'' project: ++\vspace{1em} ++\begin{itemize} ++\item C99, libevent2, CMake --- that's all; ++\item Daemon, low memory footprint, fast enough\footnote{A bit of a CPU consumer.}; ++\item 32/64 bits, big/little endian, FPU optional; ++\item Runs on nearly everything but Windows\footnote{LXSS will fix that though?}; ++\item First PoC in 2014, mostly written through 2015. ++\end{itemize} ++} ++\only<2>{% ++Original ideas: ++\vspace{1em} ++\begin{itemize} ++\item Remove discovery delays and glitches; ++\item While exposing a high-level \emph{vendor agnostic} API; ++\item While offering network isolation; ++\item No cloud nor Internet required; ++\item GPLv3 with non-GPL users in mind; ++\item ``Accessible'': pretty good C, unit-tests, good docs. ++\end{itemize} ++} ++\only<3>{% ++Implementation details: ++\vspace{1em} ++\begin{itemize} ++\item Uses LIFX's faster and \emph{harder} LAN API; ++\item Proxies all communications to the bulb; ++\item Keeps track of the \emph{current} state of the bulbs (sampling); ++\item High-level API in JSON-RPC over TCP, Unix sockets or a named ``command'' pipe\footnote{The pipe is unidirectional: only usable to send commands.}. ++\end{itemize} ++} ++\end{frame} ++ ++\begin{frame}{The {\LARGE\texttt{(\Walley\hspace{-1ex}|\Laughey)}} parts} ++\setlength{\arrayrulewidth}{1.5pt} ++In no particular order: ++\vspace{1em} ++\begin{center} ++\begin{tabular}{c|c} ++{\LARGE\Walley\hspace{-1ex}} & {\LARGE\Laughey} \\ ++\hline ++C & C \\ ++asyncio tasks cleanup & Python 3.5+ \\ ++Buildbot & Continuous integration \\ ++Portability & ``Stack position'' \\ ++Wi-Fi & Playing with the lights \\ ++Reverse engineering\ldots & in reasonable amounts \\ ++Firmwares bugs & User feedback \\ ++OS Packaging & \\ ++\end{tabular} ++\end{center} ++\end{frame} ++ ++\begin{frame}{``Stack position''} ++One thing I really like: ++\vspace{1em} ++\begin{center} ++\setlength{\tabcolsep}{15pt} ++\begin{tabular}{ccc} ++\textbf{LIFX} & \textbf{lightsd} & \textbf{monolight} \\ ++\hline ++hardware & daemon & GUI \\ ++\hline ++embedded & C & Python \\ ++\end{tabular} ++\begin{tikzpicture} ++\fill[controlpt] (0,0) circle (0.1); ++\draw[arrow] (0,0) -- node[below,pos=0.6] {Lower-level} (-4.5,0); ++\draw[arrow] (0,0) -- node[below,pos=0.6] {Higher-level} (4.5,0); ++\fill[controlpt] (0,0.3) circle (0.1); ++\end{tikzpicture} ++\end{center} ++\pause ++\emph{lightsd opens-up to a wide range of topics.} ++\end{frame} ++ ++\begin{frame}{Notes on the LIFX bulbs} ++\begin{itemize} ++\item Get them on sale; ++\item Best brightness/colors (AFAIK); ++\item Standby power consumption; ++\item Cool LAN API, hope they keep it; ++\item Only Gen 1 (EOLed in 2015) doesn't crash for me; ++\pause ++\item \large{\emph{Binary blobs suck.}} ++\end{itemize} ++\end{frame} ++ ++\subsection{Next} ++ ++\begin{frame}{``My Roadmap''} ++Things I wanna do: ++\vspace{1em} ++\begin{itemize} ++\item Time based releases; ++\item Better CI/automation; ++\item ``State-enforcement''; ++\item Effects API and effects plugins. ++\end{itemize} ++\end{frame} ++ ++\begin{frame}{Not on my roadmap} ++Things I wanna have: ++\vspace{1em} ++\begin{itemize} ++\item JSON-RPC extensions: streaming, auth, server notifs; ++\item A reversed-engineered LIFX firmware; ++\item A firmware that doesn't crash; ++\item Support for other brands (Hue?); ++\item Color calibration; ++\item LIFX stripe support. ++\end{itemize} ++\end{frame} ++ ++\section{Thanks} ++ ++{\setbeamertemplate{headline}{} ++\begin{frame} ++\begin{center}\Huge{Thanks}\end{center} ++\vspace{1em} ++\begin{center}\Large{\emph{Time for Q\&A and discussion}}\end{center} ++\vspace{1em} ++\begin{itemize} ++\item \Large{\href{https://twitter.com/1opter}{@1opter}} ++\item \Large{\emph{\#lightsd} on IRC (\emph{chat.freenode.net})} ++\item \Large{\url{https://www.lightsd.io/}} ++\end{itemize} ++\end{frame}} ++ ++\section{Extras} ++ ++\begin{frame}{Links} ++\begin{description}[pymonome] ++\item[LIFX] \href{https://www.lifx.com/}{website}, \href{https://community.lifx.com/}{forum}, \href{https://github.com/lifx}{github}; ++\item[lightsd] \href{https://docs.lightsd.io/current/}{docs}, \href{https://github.com/lopter/lightsd/}{sources}, \href{https://downloads.lightsd.io/}{downloads}; ++\item[monolight] \href{https://github.com/lopter/lightsd/tree/master/apps/monolight}{sources}; ++\item[monome] \href{http://www.monome.org/}{website}, \href{http://llllllll.co/}{forum}, \href{https://github.com/monome}{github}; ++\item[pymonome] \href{https://github.com/artfwo/pymonome}{sources}. ++\end{description} ++\end{frame} ++ ++\begin{frame}{Questions for you!} ++\begin{itemize} ++\item Hardware hacks? ++\item UX with other projects and products? ++\item ``Education'' opportunities opinions? ++\end{itemize} ++\end{frame} ++ ++\begin{frame}{Detailed architecture} ++\begin{center} ++\begin{tikzpicture}[overlay] ++\coordinate (Origin) at (0,0); ++ ++\fill[controlpt] (Origin) circle (0.1); ++ ++\node[box,color=black] (serialoscd) at (0.5,1.5) {serialoscd}; ++\draw[ultra thick] (-1.46, 2.2) -| node[above, pos=0.4] {Serial \small{(FTDI)}} (serialoscd); +\node (monome) at (-3.5,1.5) {\begin{tikzpicture}[scale=0.5] +\coordinate (NW) at (-4, 1.75); +\coordinate (SE) at (3.86, -2.11); @@ -2338,161 +2932,17 @@ + -- ++(0,-14mm) -- cycle; +\end{tikzpicture}}; + -+\draw[ultra thick] (serialoscd) -| node[above left] {UDP} (monolight); -+\draw[ultra thick] (lightsd) -| node[above,pos=0.25] {TCP/Unix} (monolight); ++\draw[ultra thick] (serialoscd) -| node[above,pos=0.25] {OSC} node[below,pos=0.25] {\small{(UDP)}} (monolight); ++\draw[ultra thick] (lightsd) -| node[above,pos=0.25] {JSON-RPC} node[below,pos=0.25] {\small{(TCP/Unix)}} (monolight); +\draw[wifipath] (bulbh.east) -- (-2.2,-1.15); +\draw[wifipath] (lightsd.west) -- (-1.1,-2); +\draw[wifipath] (bulbl.east) -- (-2.2,-2.85); -+\node (wifi) at (-2.3,-2.25) {\small{(2.4gHz Wi-Fi)}}; -+\draw ($(wifi.north) + (0,0.2)$) node {UDP}; ++\node (wifi) at (-2.1,-2.25) {\small{(UDP)}}; ++\draw ($(wifi.north) + (0,0.2)$) node {LIFX-LAN}; +\end{tikzpicture} +\end{center} +\end{frame} + -+\subsection{About monolight} -+ -+\begin{frame}{Monolight implementation} -+High-level details: -+\begin{itemize} -+\item Python ≥ 3.5 (pondering ≥ 3.6); -+\item Fully async (using \emph{asyncio} with the stream API); -+\item Fully typed, it's great; -+\item Very slow, no tests \Neutrey; -+\item Uses Artem Popov's \emph{pymonome} library; -+\item 2/3 months of work, GPLv3. -+\end{itemize} -+\pause -+\vspace{1em} -+It's really just the beginning, lot of fun stuff: -+\begin{itemize} -+\item More UI features; -+\item UI animations; -+\item Control other things. -+\end{itemize} -+\end{frame} -+ -+\subsection{About lightsd} -+ -+\begin{frame}{lightsd implementation} -+\only<1>{% -+The ``parent'' project: -+\vspace{1em} -+\begin{itemize} -+\item C99, libevent2, CMake --- that's all; -+\item Daemon, low memory footprint, fast enough\footnote{A bit of a CPU consumer.}; -+\item 32/64 bits, big/little endian, FPU optional; -+\item Runs on nearly everything but Windows\footnote{LXSS will fix that though?}; -+\item First PoC in 2014, mostly written through 2015; -+\item GPLv3 with non-GPL users in mind. -+\end{itemize} -+} -+\only<2>{% -+Original ideas: -+\vspace{1em} -+\begin{itemize} -+\item Remove discovery delays and glitches; -+\item While exposing a high-level \emph{vendor agnostic} API; -+\item While offering network isolation; -+\item No cloud nor Internet required; -+\item ``Accessible''. -+\end{itemize} -+} -+\only<3>{% -+Implementation details: -+\vspace{1em} -+\begin{itemize} -+\item Uses LIFX's faster and \emph{harder} LAN API; -+\item Proxies all communications to the bulb; -+\item Keeps track of the \emph{current} state of the bulbs (sampling); -+\item High-level API in JSON-RPC over TCP, Unix sockets or a named ``command'' pipe\footnote{The pipe is unidirectional: only usable to send commands.}; -+\item Very good modular C, unit-tests, good docs. -+\end{itemize} -+} -+\end{frame} -+ -+\begin{frame}{The {\LARGE\texttt{(\Walley\hspace{-1ex}|\Laughey)}} parts} -+\setlength{\arrayrulewidth}{1.5pt} -+In no particular order: -+\vspace{1em} -+\begin{center} -+\begin{tabular}{c|c} -+{\LARGE\Walley\hspace{-1ex}} & {\LARGE\Laughey} \\ -+\hline -+C & C \\ -+asyncio tasks cleanup & Python 3.5+ \\ -+Buildbot & Continuous integration \\ -+Portability & ``Stack position'' \\ -+Wi-Fi & Playing with the lights \\ -+Reverse engineering\ldots & in reasonable amounts \\ -+Firmwares bugs & User feedback \\ -+OS Packaging & \\ -+\end{tabular} -+\end{center} -+\end{frame} -+ -+\begin{frame}{Notes on the LIFX bulbs} -+\begin{itemize} -+\item Get them on sale; -+\item Best brightness/colors; -+\item Standby power consumption; -+\item Cool LAN API, hope they keep it; -+\item Only Gen 1 (EOLed in 2015) doesn't crash for me; -+\pause -+\item \large{\emph{Binary blobs suck.}} -+\end{itemize} -+\end{frame} -+ -+\subsection{Next} -+ -+\begin{frame}{``My Roadmap''} -+Things I wanna do: -+\vspace{1em} -+\begin{itemize} -+\item Time based releases; -+\item Better CI/automation; -+\item ``State-enforcement''; -+\item Effects API and effects plugins. -+\end{itemize} -+\end{frame} -+ -+\begin{frame}{Not on my roadmap} -+Things I wanna have: -+\vspace{1em} -+\begin{itemize} -+\item JSON-RPC extensions: streaming, auth, server notifs; -+\item A reversed-engineered LIFX firmware; -+\item A firmware that doesn't crash; -+\item Support for other brands (Hue?); -+\item Color calibration; -+\item LIFX stripe support. -+\end{itemize} -+\end{frame} -+ -+\section{Thanks} -+ -+\setbeamertemplate{headline}{} -+ -+\begin{frame} -+\begin{center}\Huge{Thanks}\end{center} -+\vspace{1em} -+\begin{center}\Large{\emph{Time for Q\&A and discussion}}\end{center} -+\vspace{1em} -+\begin{itemize} -+\item \Large{\url{https://www.lightsd.io/}} -+\item \Large{\emph{\#lightsd} on IRC (\emph{chat.freenode.net})} -+\end{itemize} -+\end{frame} -+ -+\section{Extras} -+ -+\begin{frame}{Questions for you!} -+\begin{itemize} -+\item Hardware hacks? -+\item UX with other projects and products? -+\item ``Education'' opportunities opinions? -+\end{itemize} -+\end{frame} -+ +\begin{frame}{LIFX products tables} +\begin{tabular}{lll} +\textbf{Generation} & \textbf{Models} & \textbf{Available} \\ @@ -2503,13 +2953,11 @@ +\hline +Gen 3 & A19, BR30, Z (stripe) & Yes \\ +\end{tabular} -+ +\par\vspace{2em} -+ +\begin{tabular}{ll} +\textbf{Generation} & \textbf{Notes} \\ +\hline -+Gen 1 & Has 802.15.4 \\ ++Gen 1 & Has 802.11 and (unused) 802.15.4 \\ +\hline +Gen 2 & QCA 4002, AllJoyn, \emph{crashes} \\ +\hline diff -r f8d1c74a24c4 -r b11374d8b745 docker_images.patch --- a/docker_images.patch Sun Jan 29 13:39:55 2017 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -# HG changeset patch -# Parent 598584f3f664456ec33a7a8baac2d1dc3be3b1b0 -Add a release command to generate Docker images - -diff --git a/dist/docker/Dockerfile b/dist/docker/Dockerfile -new file mode 100644 ---- /dev/null -+++ b/dist/docker/Dockerfile -@@ -0,0 +1,15 @@ -+FROM lopter/openwrt_designated_driver_{{ isa }} -+MAINTAINER Louis Opter -+ -+ADD https://downloads.lightsd.io/openwrt/designated_driver_trunk/{{ isa }}/lightsd_{{ version }}_{{ isa }}.ipk /tmp/ -+ -+RUN opkg update \ -+ && opkg install \ -+ libevent2-core \ -+ /tmp/lightsd_{{ version }}_{{ isa }}.ipk \ -+ && rm -rf /tmp/* -+ -+# TODO: figure out user creation and networking -+ -+USER lightsd -+ENTRYPOINT /usr/bin/lightsd -v warning -t -s /var/run/lightsd/socket -c /var/run/lightsd/pipe diff -r f8d1c74a24c4 -r b11374d8b745 series --- a/series Sun Jan 29 13:39:55 2017 +0100 +++ b/series Mon Jan 30 23:02:28 2017 +0100 @@ -2,7 +2,6 @@ fix_xcode_8_build.patch add_monolight.patch add_slides.patch -docker_images.patch add_power_transition.patch #+future open_gateway_on_any_bulb_response.patch #+future make_gateway_write_callbacks_low_priority.patch #+future