aboutsummaryrefslogtreecommitdiffstats
path: root/projects/lowbat.html
blob: 7539ec3f5ba3b8a9dc9c47c3e0b797f58108f599 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
<!--
 * ========================
 * =====    ===============
 * ======  ================
 * ======  ================
 * ======  ====   ====   ==
 * ======  ===     ==  =  =
 * ======  ===  =  ==     =
 * =  ===  ===  =  ==  ====
 * =  ===  ===  =  ==  =  =
 * ==     =====   ====   ==
 * ========================
 *
 * jozan.org: projects/lowbat.html
 * Mon Apr 18 18:23:21 CEST 2022
 * Joe
-->

<style type="text/css">
 <!--/*--><![CDATA[/*><!--*/
  .title  { text-align: center;
             margin-bottom: .2em; }
  .subtitle { text-align: center;
              font-size: medium;
              font-weight: bold;
              margin-top:0; }
  .todo   { font-family: monospace; color: red; }
  .done   { font-family: monospace; color: green; }
  .priority { font-family: monospace; color: orange; }
  .tag    { background-color: #eee; font-family: monospace;
            padding: 2px; font-size: 80%; font-weight: normal; }
  .timestamp { color: #bebebe; }
  .timestamp-kwd { color: #5f9ea0; }
  .org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }
  .org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }
  .org-center { margin-left: auto; margin-right: auto; text-align: center; }
  .underline { text-decoration: underline; }
  #postamble p, #preamble p { font-size: 90%; margin: .2em; }
  p.verse { margin-left: 3%; }
  pre {
    border: 1px solid #ccc;
    box-shadow: 3px 3px 3px #eee;
    padding: 8pt;
    font-family: monospace;
    overflow: auto;
    margin: 1.2em;
  }
  pre.src {
    position: relative;
    overflow: visible;
    padding-top: 1.2em;
  }
  pre.src:before {
    display: none;
    position: absolute;
    background-color: white;
    top: -10px;
    right: 10px;
    padding: 3px;
    border: 1px solid black;
  }
  pre.src:hover:before { display: inline;}
  /* Languages per Org manual */
  pre.src-asymptote:before { content: 'Asymptote'; }
  pre.src-awk:before { content: 'Awk'; }
  pre.src-C:before { content: 'C'; }
  /* pre.src-C++ doesn't work in CSS */
  pre.src-clojure:before { content: 'Clojure'; }
  pre.src-css:before { content: 'CSS'; }
  pre.src-D:before { content: 'D'; }
  pre.src-ditaa:before { content: 'ditaa'; }
  pre.src-dot:before { content: 'Graphviz'; }
  pre.src-calc:before { content: 'Emacs Calc'; }
  pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
  pre.src-fortran:before { content: 'Fortran'; }
  pre.src-gnuplot:before { content: 'gnuplot'; }
  pre.src-haskell:before { content: 'Haskell'; }
  pre.src-hledger:before { content: 'hledger'; }
  pre.src-java:before { content: 'Java'; }
  pre.src-js:before { content: 'Javascript'; }
  pre.src-latex:before { content: 'LaTeX'; }
  pre.src-ledger:before { content: 'Ledger'; }
  pre.src-lisp:before { content: 'Lisp'; }
  pre.src-lilypond:before { content: 'Lilypond'; }
  pre.src-lua:before { content: 'Lua'; }
  pre.src-matlab:before { content: 'MATLAB'; }
  pre.src-mscgen:before { content: 'Mscgen'; }
  pre.src-ocaml:before { content: 'Objective Caml'; }
  pre.src-octave:before { content: 'Octave'; }
  pre.src-org:before { content: 'Org mode'; }
  pre.src-oz:before { content: 'OZ'; }
  pre.src-plantuml:before { content: 'Plantuml'; }
  pre.src-processing:before { content: 'Processing.js'; }
  pre.src-python:before { content: 'Python'; }
  pre.src-R:before { content: 'R'; }
  pre.src-ruby:before { content: 'Ruby'; }
  pre.src-sass:before { content: 'Sass'; }
  pre.src-scheme:before { content: 'Scheme'; }
  pre.src-screen:before { content: 'Gnu Screen'; }
  pre.src-sed:before { content: 'Sed'; }
  pre.src-sh:before { content: 'shell'; }
  pre.src-sql:before { content: 'SQL'; }
  pre.src-sqlite:before { content: 'SQLite'; }
  /* additional languages in org.el's org-babel-load-languages alist */
  pre.src-forth:before { content: 'Forth'; }
  pre.src-io:before { content: 'IO'; }
  pre.src-J:before { content: 'J'; }
  pre.src-makefile:before { content: 'Makefile'; }
  pre.src-maxima:before { content: 'Maxima'; }
  pre.src-perl:before { content: 'Perl'; }
  pre.src-picolisp:before { content: 'Pico Lisp'; }
  pre.src-scala:before { content: 'Scala'; }
  pre.src-shell:before { content: 'Shell Script'; }
  pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
  /* additional language identifiers per "defun org-babel-execute"
       in ob-*.el */
  pre.src-cpp:before  { content: 'C++'; }
  pre.src-abc:before  { content: 'ABC'; }
  pre.src-coq:before  { content: 'Coq'; }
  pre.src-groovy:before  { content: 'Groovy'; }
  /* additional language identifiers from org-babel-shell-names in
     ob-shell.el: ob-shell is the only babel language using a lambda to put
     the execution function name together. */
  pre.src-bash:before  { content: 'bash'; }
  pre.src-csh:before  { content: 'csh'; }
  pre.src-ash:before  { content: 'ash'; }
  pre.src-dash:before  { content: 'dash'; }
  pre.src-ksh:before  { content: 'ksh'; }
  pre.src-mksh:before  { content: 'mksh'; }
  pre.src-posh:before  { content: 'posh'; }
  /* Additional Emacs modes also supported by the LaTeX listings package */
  pre.src-ada:before { content: 'Ada'; }
  pre.src-asm:before { content: 'Assembler'; }
  pre.src-caml:before { content: 'Caml'; }
  pre.src-delphi:before { content: 'Delphi'; }
  pre.src-html:before { content: 'HTML'; }
  pre.src-idl:before { content: 'IDL'; }
  pre.src-mercury:before { content: 'Mercury'; }
  pre.src-metapost:before { content: 'MetaPost'; }
  pre.src-modula-2:before { content: 'Modula-2'; }
  pre.src-pascal:before { content: 'Pascal'; }
  pre.src-ps:before { content: 'PostScript'; }
  pre.src-prolog:before { content: 'Prolog'; }
  pre.src-simula:before { content: 'Simula'; }
  pre.src-tcl:before { content: 'tcl'; }
  pre.src-tex:before { content: 'TeX'; }
  pre.src-plain-tex:before { content: 'Plain TeX'; }
  pre.src-verilog:before { content: 'Verilog'; }
  pre.src-vhdl:before { content: 'VHDL'; }
  pre.src-xml:before { content: 'XML'; }
  pre.src-nxml:before { content: 'XML'; }
  /* add a generic configuration mode; LaTeX export needs an additional
     (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
  pre.src-conf:before { content: 'Configuration File'; }

  table { border-collapse:collapse; }
  caption.t-above { caption-side: top; }
  caption.t-bottom { caption-side: bottom; }
  td, th { vertical-align:top;  }
  th.org-right  { text-align: center;  }
  th.org-left   { text-align: center;   }
  th.org-center { text-align: center; }
  td.org-right  { text-align: right;  }
  td.org-left   { text-align: left;   }
  td.org-center { text-align: center; }
  dt { font-weight: bold; }
  .footpara { display: inline; }
  .footdef  { margin-bottom: 1em; }
  .figure { padding: 1em; }
  .figure p { text-align: center; }
  .inlinetask {
    padding: 10px;
    border: 2px solid gray;
    margin: 10px;
    background: #ffffcc;
  }
  #org-div-home-and-up
   { text-align: right; font-size: 70%; white-space: nowrap; }
  textarea { overflow-x: auto; }
  .linenr { font-size: smaller }
  .code-highlighted { background-color: #ffff00; }
  .org-info-js_info-navigation { border-style: none; }
  #org-info-js_console-label
    { font-size: 10px; font-weight: bold; white-space: nowrap; }
  .org-info-js_search-highlight
    { background-color: #ffff00; color: #000000; font-weight: bold; }
  .org-svg { width: 90%; }
  /*]]>*/-->
</style>
<!DOCTYPE html>
<html lang="en">
	<head>
		<title>Joe's project: lowbat</title>
		<meta charset="UTF-8">
		<meta name="robots" content="index, follow">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<meta name="description" content="Blog and Internet personnal space">
		<meta name="keywords" content="developper, dev, sysadmin, sys-admin, blog, articles, tech, tips, UNIX, BSD, FreeBSD, shell, low-level, c, c++, assembly">
		<meta name="author" content="Joe Zhan <rrbo@proton.me>">
		<link rel="stylesheet" type="text/css" href="../css/site.css">
	</head>
	<body>
		<div class="fullpage">
			<header>
				<h1><a href="../index.html">Joe's project: lowbat</a></h1>
			</header>
			<div class="sidebar">
				<ul>
					<li><a href="../index.html">home</a></li>
					<li><a href="../projects.html">projects</a></li>
					<li><a href="../shit.html">shit</a></li>
					<li><a href="../music.html">music</a></li>
					<li><a href="../thoughts.html">thoughts</a></li>
					<li><a href="../links.html">links</a></li>
				</ul>
					<hr>
				<ul>
					<li><a href="http://gitjoe.xyz/">GitJoe</a></li>
				</ul>
			</div>
			<div class="body-contents">
				<h1 class="title">lowbat - lightweight low battery notifier</h1>
				<div id="table-of-contents">
					<h2>Table of Contents</h2>
					<div id="text-table-of-contents">
						<ul>
							<li><a href="#orgfe852df">1. Why lowbat?</a></li>
							<li><a href="#orgf2afc19">2. History of lowbat</a></li>
							<li><a href="#org89620d6">3. How it works</a>
								<ul>
									<li><a href="#org6b0c50b">3.1. libnotify lowbat</a></li>
									<li><a href="#orgbd041b0">3.2. espeak lowbat</a></li>
									<li><a href="#org3a44c6a">3.3. unknown lowbat</a></li>
								</ul>
							</li>
							<li><a href="#org4bfb234">4. Links to lowbat</a></li>
						</ul>
					</div>
				</div>

				<div id="outline-container-orgfe852df" class="outline-2">
					<h2 id="orgfe852df"><span class="section-number-2">1</span> Why lowbat?</h2>
					<div class="outline-text-2" id="text-1">
						<p>
							I've been using minimalist OS installations for work, personnal computing
							and playing video games for a while now. I used <a href="https://www.archlinux.org/" target="_blank">Arch Linux</a>, I still use
							<a href="https://gentoo.org/" target="_blank">Gentoo Linux</a> - which is by far my favorite Linux distribution - as a desktop
							OS, and now I am using <a href="https://www.freebsd.org/" target="_blank">FreeBSD</a> on my workstation.
						</p>

						<p>
							Those operating systems and distributions basically come with a kernel,
							coreutils, a shell and that's pretty much it. Everything else has to be
							installed manually. I love this philosophy, the simplicity behind it and the
							fact that you know exactly what's on your system at any moment.
						</p>

						<p>
							As window managers, I used <a href="http://dwm.suckless.org/" target="_blank">dwm</a> for a while, and I am now using <a href="https://github.com/baskerville/bspwm" target="_blank">bspwm</a>. They
							are ultra-fast, very lightweight and do not bring extra bloatware to my systems.
							I do not use a status bar as well, I like my applications to use the full screen
							space available.
						</p>

						<p>
							A big problem for me with this setup for me was that they do not come with some
							kind of warning or notification system, like fancier desktop environments would,
							when my laptop battery is low. That also was before I started using <b>Emacs</b>,
							discovering the battery level indicator in the modeline. Ultimatly the
							frustration was too important when the computer kept shutting down in
							the middle of important work too many time. Then I decided to create <b>lowbat</b>
							to cure this issue.
						</p>
					</div>
				</div>

				<div id="outline-container-orgf2afc19" class="outline-2">
					<h2 id="orgf2afc19"><span class="section-number-2">2</span> History of lowbat</h2>
					<div class="outline-text-2" id="text-2">
						<p>
							It started as a very short <code>dash</code> shell (get <a href="https://github.com/tklauser/dash" target="_blank">dash</a> here) script that was
							working fine but I wanted to experiment a little bit with this. It turned into
							a <code>C++</code> program, which is still the case for the GNU/Linux version.
							Switching to FreeBSD, I exerimented again by turning it into an
							<code>x64 assembly</code> program, following the <b>Intel</b> syntax. In that way <b>lowbat</b> is
							even more lightweight and consumes less battery power.
							These days, I am rewriting it in the <b>AT&amp;T</b> syntax.
						</p>
					</div>
				</div>

				<div id="outline-container-org89620d6" class="outline-2">
					<h2 id="org89620d6"><span class="section-number-2">3</span> How it works</h2>
					<div class="outline-text-2" id="text-3">
					</div>
					<div id="outline-container-org6b0c50b" class="outline-3">
						<h3 id="org6b0c50b"><span class="section-number-3">3.1</span> libnotify lowbat</h3>
						<div class="outline-text-3" id="text-3-1">
							<p>
								The principle of <b>lowbat</b> is rather simple. When it's running in the
								background, it checks every 4 minutes whether your battery is above 15%.
								If that is the case, it sleeps for another 4 minutes. When your battery runs
								bellow 15%, <b>lowbat</b> checks your battery level every 20 seconds as well as
								sending you a <b>notification</b> using <code>libnotify</code>. You can display live
								notifications on your desktop using <code>dunst</code> for example, as well as many
								other I'm sure.
							</p>


							<div id="org89a6eb3" class="figure">
								<p><img src="../img/projects/lowbat-01.webp" alt="lowbat-01.webp">
								</p>
								<p><span class="figure-number">Figure 1: </span>A notification generated by lowbat, displayed by dunst</p>
							</div>
						</div>
					</div>

					<div id="outline-container-orgbd041b0" class="outline-3">
						<h3 id="orgbd041b0"><span class="section-number-3">3.2</span> espeak lowbat</h3>
						<div class="outline-text-3" id="text-3-2">
							<p>
								<b>lowbat</b> also has an option to send a custom voice message to the use
								using <code>espeak</code>. Very handy if you are not in front of your computer or
								if you want to bring joy to this dramatic event.
							</p>
						</div>
					</div>

					<div id="outline-container-org3a44c6a" class="outline-3">
						<h3 id="org3a44c6a"><span class="section-number-3">3.3</span> unknown lowbat</h3>
						<div class="outline-text-3" id="text-3-3">
							<p>
								Sadly, I wasn't able to test lowbat on machines with more that one
								battery. My call is that it will only warn you for the <i>first</i> battery,
								but I can't be sure. Try it and tell me!
							</p>
						</div>
					</div>
				</div>
				<div id="outline-container-org4bfb234" class="outline-2">
					<h2 id="org4bfb234"><span class="section-number-2">4</span> Links to lowbat</h2>
					<div class="outline-text-2" id="text-4">
						<p>
							<ul class="org-ul">
								<li>GNU/Linux: <a href="https://github.com/JozanLeClerc/lowbat" target="_blank">lowbat's GitHub GNU/Linux repository</a></li>
								<li>BSD: <a href="https://github.com/JozanLeClerc/lowbat-bsd" target="_blank">lowbat's GitHub BSD repository</a></li>
							</ul>
						</p>
					</div>
				</div>
			</div>
			<footer>
				<p>
					Copyright &copy; 2020-2022, Joe -
					see <a href="../license.html">LICENSE</a> -
					this website does not use cookies or php or js
				</p>
			</footer>
		</div>
	</body>
</html>