diff options
author | Joe <bousset.rudy@gmail.com> | 2019-12-03 20:21:09 +0100 |
---|---|---|
committer | Joe <bousset.rudy@gmail.com> | 2019-12-03 20:21:09 +0100 |
commit | 89737ad005f4c066234a5282a1a46eb68b2c1ace (patch) | |
tree | 7b521091227050c84dca220715e20bf1347c39d3 | |
parent | README update (diff) | |
download | lowbat-gnu-89737ad005f4c066234a5282a1a46eb68b2c1ace.tar.gz lowbat-gnu-89737ad005f4c066234a5282a1a46eb68b2c1ace.tar.bz2 lowbat-gnu-89737ad005f4c066234a5282a1a46eb68b2c1ace.tar.xz lowbat-gnu-89737ad005f4c066234a5282a1a46eb68b2c1ace.tar.zst lowbat-gnu-89737ad005f4c066234a5282a1a46eb68b2c1ace.zip |
cpp mode
-rw-r--r-- | Makefile | 27 | ||||
-rw-r--r-- | inc/jo_lowbat.hpp | 22 | ||||
-rw-r--r-- | src/jo_exec.cpp | 15 | ||||
-rw-r--r-- | src/jo_notify.cpp | 26 | ||||
-rw-r--r-- | src/main.cpp | 35 |
5 files changed, 125 insertions, 0 deletions
@@ -1,5 +1,32 @@ .POSIX: +default: all + +SHELL +SRCS_DIR = src/ +INCS_DIR = inc/ +OBJS_DIR = obj/ + +SRCS = ${SRCS_DIR}main.cpp +SRCS += ${SRCS_DIR}jo_exec.cpp +SRCS += ${SRCS_DIR}jo_notify.cpp + +INCS = ${INCS_DIR}jo_lowbat.hpp + +OBJS = $(patsubst ${SRCS_DIR}%.cpp,${OBJS_DIR}%.o,${SRCS}) + +CC = g++ +CFLAGS = -Wall +CFLAGS += -Wextra +CFLAGS += -Werror + +DEBUG = -g3 +FSANITIZE = -fsanitize=address + +OPTIMIZE = -O2 + +TARGET = lowbat + OS = $(shell uname -s) ifeq ($(OS), Darwin) PREFIX = /usr/local diff --git a/inc/jo_lowbat.hpp b/inc/jo_lowbat.hpp new file mode 100644 index 0000000..2269902 --- /dev/null +++ b/inc/jo_lowbat.hpp @@ -0,0 +1,22 @@ +#ifndef JO_LOWBAT_HPP +#define JO_LOWBAT_HPP + +#include <iostream> +#include <cstring> +#include <string> +#include <stream> +#include <thread> +#include <chrono> +#include <memory> +#include <stdexcept> +#include <array> + +using namespace std; +using namespace this_thread; +using namespace chrono; + +void jo_notify(const string); +void jo_speak (const string); +string jo_exec (const char*); + +#endif diff --git a/src/jo_exec.cpp b/src/jo_exec.cpp new file mode 100644 index 0000000..a97012c --- /dev/null +++ b/src/jo_exec.cpp @@ -0,0 +1,15 @@ +#include <jo_lowbat.hpp> + +string +jo_exec(const char* cmd) { + array<char, 128> buffer; + string result; + unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd, "r"), pclose); + if (!pipe) { + throw runtime_error("popen() failed!"); + } + while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) { + result += buffer.data(); + } + return result; +} diff --git a/src/jo_notify.cpp b/src/jo_notify.cpp new file mode 100644 index 0000000..1683871 --- /dev/null +++ b/src/jo_notify.cpp @@ -0,0 +1,26 @@ +#include <jo_lowbat.hpp> + +void +jo_notify(const string batlvl) { + string str = nullptr; + const char *cmd = nullptr; + + str = "notify-send \""; + str += batlvl; + str += "%\" \"Please plug in computer\" -u critical -t 15000"; + + cmd = str.c_str(); + system(cmd); +} + +void +jo_speak(const string msg) { + string str = nullptr; + const char *cmd = nullptr; + + str = "echo \""; + str += msg; + str += "\" | espeak"; + cmd = str.c_str(); + system(cmd); +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..2fe6063 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,35 @@ +#include <jo_lowbat.hpp> + +int main(int argc, const char *argv[]) { + string msg = nullptr; + string acstat = nullptr; + string batlvl = nullptr; + stringstream battoint = nullptr; + int batlvlint = 0; + + if (memcmp(argv[1], "--say", strlen(argv[1]))) + msg = "beep beep - low battery"; + else + msg = argv[2]; + + while (true) { + acstat = jo_exec("acpi | awk '{print $3}' | rev | cut -c 2- | rev"); + batlvl = jo_exec("acpi | awk '{print $4}' | rev | cut -c 3- | rev"); + battoint = batlvl; + battoint >> batlvlint; + if (batlvlint < 15) { + while (!memcmp(acstat, "Discharging", strlen(acstat))) { + jo_notify(batlvl); + if (memcmp(argv[1], "--silent", strlen(argv[1]))) + jo_speak(msg); + sleep_for(seconds(20)); + acstat = jo_exec("acpi | awk '{print $3}' | rev | cut -c 2- | rev"); + batlvl = jo_exec("acpi | awk '{print $4}' | rev | cut -c 3- | rev"); + if (!memcmp(acstat, "Charging", strlen(acstat))) + break ; + } + } + sleep_for(seconds(240)); + } + return 0; +} |