source: npl/mediabox/lcdproc_edwin/src/docs/netstuff.txt @ c5c522c

gcc484ntopperl-5.22
Last change on this file since c5c522c was c5c522c, checked in by Edwin Eefting <edwin@datux.nl>, 8 years ago

initial commit, transferred from cleaned syn3 svn tree

  • Property mode set to 100644
File size: 9.1 KB
Line 
1LCDproc client/server protocol
2---------------------------------------------
3
4
5QUICKSTART
6----------
7 - Open a socket to the LCDproc port (usually 13666).
8 - say "hello"
9 - the server will notify you of a good connection, and some info
10   on the type of display available.
11 - Identify yourself.  "client_set name some_sort_of_name"
12 - Add a new screen.  "screen_add my_screen"
13 - Put a widget on the screen. 
14   "widget_add my_screen my_widget string"
15 - Now, update the widget whenever your status info changes...
16   "widget_set my_screen my_widget 1 1 Booger!"
17
18 - When you're done, just close the socket.
19 - You probably want to read on for more information, once you've
20   gotten the LCDproc server to display something.  :)
21
22
23
24DETAILS
25-------
26
27There are two parts to the spec:
28        A language for client/server to interact with.
29        A protocol guiding interactions.
30
31=================== The protocol ==================================
32
33The protocol is context-free.  So, no commands require responses; and
34responses are simply commands.
35
36The client may send updated info at any time, and the server decides
37whether to display it.  An ideal communication may flow like this:
38        client->server          server->client
39        ------------------      -------------------
40         (idle)                  (nothing)
41         (idle)                 "I'm listening"
42        new stats...             (nothing; displays updated stats)
43        new stats...             (nothing...)
44        new stats...             (nothing...)
45        new stats...            "Okay, be quiet"
46         (idle)                  (nothing; displays new screen)
47        ...                     ...
48         (idle)                 "Your slider moved up"
49        Set slider value: 43    (nothing; displays updated slider)
50         (idle)                 (nothing)
51        ...                     ...
52But the client could safely continue to send new stats, knowing that
53the server isn't listening and won't display it.  Also, the client could
54ignore the slider change, and the slider onscreen simply wouldn't move.
55
56
57=================== The syntax ==================================
58
59The language is ascii-based, so a human can telnet to a port and talk
60to the server.  This helps with development and debugging.
61
62With that in mind, a commandline-like syntax seems good:
63
64        function arg1 arg2 arg3 ...
65
66The syntax dictates that the first word is a function name, and the
67rest of the line is passed to that function as an argument.
68String-type arguments should always come last.  So, for example:
69
70        set_label 23 3 2 Hey, booger.  What's up?
71
72The first argument is a label id number, the 2nd and 3rd are x,y
73coordinates onscreen, and the rest of the line is a string.
74
75
76=================== The command set ==================================
77
78The naming convention dictates that function names are lower-case,
79with underscores ("_"'s) between words.
80
81The naming convention also requires that function-name words go in
82descending order.  So, "screen_set_priority" would be okay, but
83"set_screen_priority" would not.
84
85Id's are strings.  (the "#id" things)
86
87In general, we're trying to keep the command set small.  Especially the
88server->client functions, so that clients won't have to handle a lot of
89different types of input.
90
91Now, the function list:
92
93client->server functions
94-------------------------
95hello
96        Client init.  You must send this before the server will pay
97        any attention to you.  You'll get some info about the server
98        in return...  (a "connect" string)
99
100
101client_set [name #id]
102        Set client's name and other info
103
104client_add_key #id
105        Tells the server the client can handle keypresses of type #id.
106        #id is probably just "A", "B", and so on...
107        All keypresses are disabled by default, so you'll have to tell
108        the server which ones you want to accept...
109
110client_del_key #id
111        Tells the server to never send that keypress.
112        All keypresses are disabled by default.
113
114
115screen_add #id
116        Add a new screen
117
118screen_del #id
119        Remove a screen
120
121screen_set #id [priority integer] [name "my_name"] [duration integer]
122           [wid width] [hgt height]
123        Initialize a screen, or reset its data.
124        Priority values are as follows:
125            0   You feel like getting kicked off the server, don't you?
126            1   The world is about to explode
127           16   Emergency priority
128           32   Very high priority (important)
129           64   High priority (normal)
130          128   Normal (recommended)
131          192   Low priority (normal)
132          224   Very low priority (very unimportant)
133          240   Boring as hell
134          255   This screen won't show up very much even if there are
135                no other screens queued...
136        An example of using priorities is as follows.
137
138           Imagine you're making an mp3 player for LCDproc.  When the
139           song changes, it's nice to display the new name immediately.
140           So, you could set your screen's priority to 64, wait for
141           the server to display (or ignore) your screen, then set the
142           screen back to 128.  This would cause the mp3 screen to
143           show up as soon as the one onscreen was finished, then
144           return to normal priority afterward.
145
146           Or, let's say your client monitors the health of hospital
147           patients.  If one of the patients has a heart attack, you
148           could set the screen priority to 16 (emergency), and it
149           would be displayed immediately.  It wouldn't even wait for
150           the previous screen to finish.  ... And it would stay there
151           most of the time until the user did something about it.
152
153           A priority of 1 would stay onscreen permanently, with
154           flashing lights and other visual cues if possible.
155           ... Please *don't* use this priority.  :)
156
157        The duration can be either a positive number, or -1.  A
158        positive number indicates how many display frames the screen
159        should last for.  A 0 or -1 means that the server should use
160        "auto" duration, which is probably a good idea.  This will be
161        whatever the user wants.  It defaults to 4 seconds (32
162        frames), or will be calculated for things such as scrollers.
163
164widget_add #screen #id type [-in #id]
165        Add something onscreen
166        Widget types can be any of the following:  "string", "hbar",
167        "vbar", "title", "icon", "scroller", "frame", ... more later?
168        Widgets are drawn in the order you create them.
169
170        You can put a widget inside a frame by adding "-in #id", where
171        #id is the name of a frame.
172
173widget_del #screen #id
174        Kill something onscreen
175
176widget_set #screen #id data
177        Set (reset) widget's data
178        Note that the "string" type should be used for frame buffers.
179        Strings should not be bigger than the screen.
180        The widgets take these arguments for data:
181
182                string          x y text
183
184                hbar            x y length_in_pixels
185
186                vbar            x y length_in_pixels
187
188                icon            x y binary_data
189
190                title           text
191
192                scroller        left top right bottom direction speed text
193
194                        A scroller is a string which scrolls.
195                        This is useful for things such as the disk
196                        usage screen, which may be very tall.
197                        The speed is how many display frames to delay
198                        between scrolling.  Each display frame is
199                        1/8th of a second, by default.
200                        Direction must be "h" or "v".
201                        Positive speeds indicate frames per movement.
202                        Negative speeds indicate movements per frame.
203
204                frame            left top right bottom wid hgt dir speed
205
206                        Frames occupy the area (left, top)-(right,bottom)
207                        onscreen, and the inside area is wid x hgt.
208                        The inside may be bigger than the actual size,
209                        so that the frame will scroll.
210
211
212server->client functions
213-------------------------
214connect args
215        Verifies connection; gives info about the LCD, etc...
216
217bye
218        Notifies the client of a server shutdown.
219
220huh? [info]
221        Notifies the client of a request error.
222
223listen [#screen [#widget [#widgets...]]]
224        Notifies client that "server is listening for data".
225
226ignore [#screen [#widget [#widgets...]]]
227        Tells the client "shut up".
228
229key #id
230        Sends a keypress to the client.
231
232
233
234
235--- Not implemented yet ---
236The functions below are planned but not completed.
237
238
239client->server functions
240-------------------------
241menu_add #id
242        Add a new menu. 
243
244menu_del #id
245        Get rid of a menu.
246
247menu_set [top] [name my_menu_name]
248        if (top) Gets added to "Client Menus".
249        else Client must insert it into its own menu heirarchy.
250
251menu_item_add #menu #id
252        Add a new, blank menu item.
253
254menu_item_del #menu #id
255        Delete a menu item.
256
257menu_item_set #menu #id type [value] text
258        (re)Set the menu item's data.
259        If type is "checkbox" or "slider" or "menu", [value] should
260        contain appropriate info.  (like true, 43, or #menuid)
261
262
263backlight [on] [off] [blink] [flash] [toggle]
264        Requests that the backlight be toggled...  The backlight
265        command will likely be ignored, but users can enable it if
266        desired.
267
268        The LCDproc server has [will have] several backlight modes:
269            On      Stays on all the time
270            Off     Stays off all the time
271            Load?   Turns off when the load average is low
272            Shell?  Controlled by a user-supplied shell script
273            Open    Can be controlled by all clients
274            Vis     Controlled by the currently visible client
275
276
277driver_add #id? type args
278        Start up a new output driver.
279        Nice if you want to check on your machine remotely with the
280        curses driver.
281
282driver_del #id? (or type)
283        Stop a running output driver.
284        Good for reclaiming your joystick when you want to play games...
285
286
287
288
289server->client functions
290-------------------------
291menu #menu #item #action
292        Tells the client that a menu item was selected/used/etc...
293        The action can be "click", "up", or "down".  The client should
294        handle this according to what type of menu item has been
295        activated, and should probably send the server a new item
296        definition if the item was a checkbox or slider.
297
298
Note: See TracBrowser for help on using the repository browser.