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
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; File : jo_r_loop.asm /_________/ ;;
;; Author : Joe | ;;
;; Date : 04/2020 | ;;
;; Info : The main loop | ;;
;; / | ;;
;; \ / ;;
;; \_____/ ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; jo_r_loop(speak (0-1), *argv[])
;; -------------------------------
section .text
extern sleep
extern jo_f_percent
extern jo_f_status
extern jo_n_speak
extern jo_n_notify
extern jo_r_cpyhead
global jo_r_loop
jo_r_loop:
push rbp
push rbx
mov rbx, rsi
mov ebp, edi
jmp bigloop
bigloop:
call jo_f_status ; check the status
cmp rax, 0xfe ; in case we couldn't read
je err
cmp rax, 0x3
je sleepalot
call jo_f_percent ; check the capacity
cmp rax, 0xfe ; in case we couldn't read
je err
cmp rax, 0xf
jge sleepalot
mov rdi, rax
call jo_r_cpyhead
mov rdi, rax
mov rsi, n_body ; notification body
mov rdx, 0x3 ; ciritcal notification
mov rcx, 0x3a98 ; 15000ms notification timeout
call jo_n_notify ; jo_n_notify(head: rdi, body: rsi,
; urgency: rdx, timeout: rcx)
speak:
cmp ebp, 0x1
jne sleepabit
mov rdi, [rbx + 0x8 * 0x2]
call jo_n_speak
sleepabit:
mov rdi, 0x14
call sleep ; sleep 20 seconds before next check/notification
jmp bigloop
sleepalot:
mov rdi, 0xf0
call sleep ; sleep 240s (4m) if it's fine
jmp bigloop
return:
xor rax, rax
retq
err:
mov rdi, 0x2 ; stderr
lea rsi, [rel errmsg]
mov rdx, errlen
mov rax, 0x4
syscall ; write error message on stderr
xor rax, rax
retq
section .data
n_body: db "Please plug in computer", 0x0
fmt: db "%s", 0xa, 0x0
errmsg: db "Failed to read battery informations", 0xa, 0x0
errlen: equ $ - errmsg
|