aboutsummaryrefslogtreecommitdiffstats
path: root/asm/jo_r_loop.asm
blob: 987f68f21a77182bdb1fd6537b570218bd891f45 (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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                                                      ;;
;;  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