From dd96de7379d68659eed8b4c795da1e4b57d3e734 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Tue, 10 Apr 2018 09:27:22 +0800 Subject: Hopefully fixed some segmentation faults. Added init script for OpenRC. Fixed compiler warnings. --- CMakeLists.txt | 9 +++++++++ ChangeLog | 5 +++++ README.md | 11 ++++++++--- brightness_ctrl.cpp | 6 +++++- lightsd.openrc | 18 ++++++++++++++++++ main.cpp | 38 +++++++++++++++++++++++++------------- sensors.cpp | 9 +++++++-- sensors.hpp | 2 +- utils.cpp | 8 ++++---- utils.hpp | 13 +++++++------ 10 files changed, 89 insertions(+), 30 deletions(-) create mode 100755 lightsd.openrc diff --git a/CMakeLists.txt b/CMakeLists.txt index e8733c0..8b5e17e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,3 +7,12 @@ find_package(Threads REQUIRED) add_executable(${PROJECT_NAME} ${SOURCES}) target_link_libraries(${PROJECT_NAME} stdc++fs) target_link_libraries(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT}) +install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) +find_package(PkgConfig) +pkg_check_modules(OPENRC "openrc") +install(FILES lightsd.conf DESTINATION /etc COMPONENT config) +if(OPENRC_FOUND) + #configure_file(lightsd.openrc ) + install(PROGRAMS lightsd.openrc DESTINATION /etc/init.d RENAME lightsd + COMPONENT config) +endif() diff --git a/ChangeLog b/ChangeLog index 3d69246..b32a3f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2018-04-10 0.0.2 +Hopefully fixed some segmentation faults. +Added init script for OpenRC. +Fixed compiler warnings. + 2018-04-09 0.0.1 First public version. Almost feature complete. Only works for me though. diff --git a/README.md b/README.md index facdd2d..35d6ae2 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,18 @@ This service watches the readings from the ambient light sensor and control the backlight of the screen and keyboard. It also creates a fifo so that you can adjust relative brightness of the lcd. +It only supports sensors using the industrial I/O bus. It has a generic +class for working with most types of iio devices though. + The project also demostrates how damn stupid a C++ program could look like. +Hopefully it does not yet hog the CPU. + # Warning WIP. Does not yet do any kind of input sanitation. May segmentation fault at any time. The author uses Gentoo. _Very_ shitty code. -AS A DAEMON, IT ONLY RUNS AS ROOT! +As this daemon manipulates sysfs, IT ONLY RUNS AS ROOT! # Building Building _requires_ C++17. Just `mkdir build && cd build && cmake .. && make`. @@ -23,9 +28,9 @@ Building _requires_ C++17. Just `mkdir build && cd build && cmake .. && make`. None. The code documentes itself. ## fifo usage -- `u ` +- `u [x=5,0` +- `d [x=5,0` Set relative brightness of lcd. diff --git a/brightness_ctrl.cpp b/brightness_ctrl.cpp index 3a57c0d..7ad2277 100644 --- a/brightness_ctrl.cpp +++ b/brightness_ctrl.cpp @@ -21,7 +21,10 @@ void BrightnessControl::_brightness_slide(int p) void BrightnessControl::init(float initv,SensorALS *s) { - cur=std::upper_bound(thresh.begin(),thresh.end(),(int)roundf(initv))-thresh.begin(); + cur=std::upper_bound(thresh.begin(),thresh.end(),(int)roundf(initv)) + -thresh.begin(); + if(thresh.size()+1!=value.size())LOG('W', + "Size of threshold array should be one more than size of value array",0); als=s;set_offset(0,0); } void BrightnessControl::set_path(filesystem::path p) @@ -75,6 +78,7 @@ void BrightnessControl::brightness_slide(int p) } void BrightnessControl::worker() { + if(cpath.empty())return; while(1) { std::unique_locklock_thresh(threshnotify_m); diff --git a/lightsd.openrc b/lightsd.openrc new file mode 100755 index 0000000..2d1e0d7 --- /dev/null +++ b/lightsd.openrc @@ -0,0 +1,18 @@ +#!/sbin/openrc-run +#init script of lightsd for OpenRC +depend() +{ + need sysfs dev-mount +} +start() +{ + ebegin "Starting lightsd" + start-stop-daemon -S -b -m -p /run/lightsd.pid -x /usr/bin/lightsd + eend $? +} +stop() +{ + ebegin "Stopping lightsd" + start-stop-daemon -s SIGTERM -p /run/lightsd.pid -x /usr/bin/lightsd + eend $? +} diff --git a/main.cpp b/main.cpp index df3af34..4f20be5 100644 --- a/main.cpp +++ b/main.cpp @@ -40,7 +40,7 @@ void load_config() char* buf=new char[1024]; while(!feof(cfgf)) { - fgets(buf,1024,cfgf); + ignore_result(fgets(buf,1024,cfgf)); if(buf[0]=='#')continue; std::string sb=trim(buf); std::vector sv; @@ -94,7 +94,7 @@ int get_gid(std::string group) char* buf=new char[1024]; while(!feof(grpf)) { - fgets(buf,1024,grpf); + ignore_result(fgets(buf,1024,grpf)); std::vector sv; split(buf,':',sv); if(sv[0]==group) @@ -110,27 +110,38 @@ int get_gid(std::string group) } void setup_fifo() { - if(!fifo_path.string().length())return; - unlink(fifo_path.c_str()); - mkfifo(fifo_path.c_str(),0620); - chown(fifo_path.c_str(),0,get_gid("video")); - chmod(fifo_path.c_str(),0620); + if(fifo_path.empty())return; + int ret=0; + ret|=unlink(fifo_path.c_str()); + ret|=mkfifo(fifo_path.c_str(),0620); + ret|=chown(fifo_path.c_str(),0,get_gid("video")); + ret|=chmod(fifo_path.c_str(),0620); + if(ret)LOG('W',"Failed to create fifo.",0); } void command_thread() { + if(fifo_path.empty())return; fifo_f=fopen(fifo_path.c_str(),"r"); char cmdbuf[256]; while(1) { - fgets(cmdbuf,256,fifo_f); + ignore_result(fgets(cmdbuf,256,fifo_f)); printf("got command: "); puts(trim(cmdbuf).c_str()); std::vector cav; split(trim(cmdbuf),' ',cav); if(cav.size()>=1) { - if(cav[0]=="u")if(cav.size()>1)lcd.set_offset(1,atoi(cav[1].c_str())); - if(cav[0]=="d")if(cav.size()>1)lcd.set_offset(-1,atoi(cav[1].c_str())); + if(cav[0]=="u") + { + if(cav.size()>1)lcd.set_offset(1,atoi(cav[1].c_str())); + else lcd.set_offset(1,5); + } + if(cav[0]=="d") + { + if(cav.size()>1)lcd.set_offset(-1,atoi(cav[1].c_str())); + else lcd.set_offset(-1,5); + } if(cav[0]=="s")if(cav.size()>1)lcd.set_offset(0,atoi(cav[1].c_str())); if(cav[0]=="r")lcd.set_offset(0,0); } @@ -140,17 +151,18 @@ void command_thread() } void sigterm_handler(int) { - exit(0); + als.quit_worker(); + _exit(0); } int main() { signal(SIGTERM,sigterm_handler); als_id=SensorBase::detect_sensor("als"); if(!~als_id)return puts("No ALS found!"),1; - als.init(als_id,"in_intensity"); + if(als.init(als_id,"in_intensity"))return puts("Failed to initialize sensor."),1; als.set_reader_callback(als_callback); float init_val=als.get_value(); - printf("initial value: %f lx\n",init_val); + //printf("initial value: %f lx\n",init_val); load_config(); setup_fifo(); lcd.init(init_val,&als); diff --git a/sensors.cpp b/sensors.cpp index 8817528..3b6b1e0 100644 --- a/sensors.cpp +++ b/sensors.cpp @@ -103,7 +103,7 @@ void SensorBase::enable_scan_element(std::string elem) ),std::make_tuple(idx,elem_base,st) ); } -void SensorBase::init(int id,std::string _sensor_basename) +bool SensorBase::init(int id,std::string _sensor_basename) { sysfspath=IIODEV_SYSFS_PATH_BASE+std::to_string(id); devbufpath=DEV_PATH+std::to_string(id); @@ -123,7 +123,12 @@ void SensorBase::init(int id,std::string _sensor_basename) update_values(); enable_buffer(); devfd=open(devbufpath.c_str(),O_RDONLY); - if(!~devfd)LOG('E',"failed to open the iio buffer device: %s",devbufpath.c_str()); + if(!~devfd) + { + LOG('E',"failed to open the iio buffer device: %s",devbufpath.c_str()); + return 1; + } + return 0; } void SensorBase::deinit() { diff --git a/sensors.hpp b/sensors.hpp index 7d7da31..86ff6a1 100644 --- a/sensors.hpp +++ b/sensors.hpp @@ -46,7 +46,7 @@ class SensorBase virtual void update_values()=0; public: virtual ~SensorBase(){} - void init(int id,std::string _sensor_basename); + bool init(int id,std::string _sensor_basename); void deinit(); void reset(); void worker(); diff --git a/utils.cpp b/utils.cpp index 8dc5f5a..a661794 100644 --- a/utils.cpp +++ b/utils.cpp @@ -8,7 +8,7 @@ int readint(const char* path) FILE* f=fopen(path,"r"); if(!f)return LOG('W',"failed to open %s for reading: %d",path,errno),0; char buf[16]; - fgets(buf,16,f); + ignore_result(fgets(buf,16,f)); buf[15]=0; fclose(f); return atoi(buf); @@ -18,7 +18,7 @@ float readfloat(const char* path) FILE* f=fopen(path,"r"); if(!f)return LOG('W',"failed to open %s for reading: %d",path,errno),0; char buf[16]; - fgets(buf,16,f); + ignore_result(fgets(buf,16,f)); buf[15]=0; fclose(f); return atof(buf); @@ -28,7 +28,7 @@ std::string readstr(const char* path) FILE* f=fopen(path,"r"); if(!f)return LOG('W',"failed to open %s for reading: %d",path,errno),""; char buf[256]; - fgets(buf,256,f); + ignore_result(fgets(buf,256,f)); buf[255]=0; fclose(f); return std::string(buf); @@ -37,7 +37,7 @@ void writeint(const char* path,int v) { FILE* f=fopen(path,"w"); if(!f){LOG('W',"failed to open %s for writing",path);return;} - fprintf(f,"%d",v); + ignore_result(fprintf(f,"%d",v)); fclose(f); } std::string trim(std::string s) diff --git a/utils.hpp b/utils.hpp index 055201d..eac0c8f 100644 --- a/utils.hpp +++ b/utils.hpp @@ -3,10 +3,11 @@ #include #include #define LOG(type,format,...) fprintf(stderr,"%c: " format "\n",type,__VA_ARGS__) -extern int readint(const char* path); -extern float readfloat(const char* path); -extern std::string readstr(const char* path); -extern void writeint(const char* path,int v); -extern std::string trim(std::string s); -extern void split(std::string s,char c,std::vector& v); +int readint(const char* path); +float readfloat(const char* path); +std::string readstr(const char* path); +void writeint(const char* path,int v); +std::string trim(std::string s); +void split(std::string s,char c,std::vector& v); +templatevoid ignore_result(T){} #endif -- cgit v1.2.3