/****************************************************************************************/ /* */ /* File : r_loop.asm /_________/ */ /* Author : Joe | */ /* Date : 04/2020 | */ /* Info : The main loop | */ /* / | */ /* \ / */ /* \_____/ */ /* */ /****************************************************************************************/ /***********************************/ /* jo_r_loop(speak (0-1), *argv[]) */ /* ------------------------------- */ /***********************************/ .text .extern sleep .extern f_percent .extern f_status .extern n_speak .extern n_notify .extern r_cpyhead .globl r_loop r_loop: pushq %rbp pushq %rbx movq %rsi, %rbx movq %edi, %ebp jmp bigloop bigloop: callq f_status /* check the status */ cmp $0xfe, %rax /* if sys_open/sys_read failed */ je err cmp $0x3, %rax je sleepalot callq f_percent /* check the capacity */ cmp $0xfe, %rax /* if sys_open/sys_read failed */ je err cmp $0xf, %rax jge sleepalot movq %rax, %rdi callq r_cpyhead /* notification head */ movq %rax, %rdi movq $n_body, %rsi /* notification body */ movq $0x3, %rdx /* critical notification */ movq $0x3a98, %rcx /* 15000ms notification timeout */ callq n_notify /* n_notify(head: rdi, body: rsi, */ /* urgency: rdx, timeout: rcx */ speak: cmp $0x1, %ebp jne sleepabit movq (%rbx,0x8,0x2), %rdi callq n_speak ;; 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