aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2018-04-10 09:27:22 +0800
committerGravatar Chris Xiong <chirs241097@gmail.com> 2018-04-10 09:27:22 +0800
commitdd96de7379d68659eed8b4c795da1e4b57d3e734 (patch)
tree9a5cad0c413402bb2fdde627f9dc81f29ee1f371
parent6bdb9028af9a5256fbb47b942843e49aef7e3aa1 (diff)
downloadlightsd-dd96de7379d68659eed8b4c795da1e4b57d3e734.tar.xz
Hopefully fixed some segmentation faults.
Added init script for OpenRC. Fixed compiler warnings.
-rw-r--r--CMakeLists.txt9
-rw-r--r--ChangeLog5
-rw-r--r--README.md11
-rw-r--r--brightness_ctrl.cpp6
-rwxr-xr-xlightsd.openrc18
-rw-r--r--main.cpp38
-rw-r--r--sensors.cpp9
-rw-r--r--sensors.hpp2
-rw-r--r--utils.cpp8
-rw-r--r--utils.hpp13
10 files changed, 89 insertions, 30 deletions
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 <x,0<x<=100>`
+- `u [x=5,0<x<=100]`
Makes lcd x% brighter.
-- `d <x,0<x<=100>`
+- `d [x=5,0<x<=100]`
Makes lcd x% darker.
- `s <x,-100<=x<=100>`
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_lock<std::mutex>lock_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<std::string> 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<std::string> 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<std::string> 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 <string>
#include <vector>
#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<std::string>& 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<std::string>& v);
+template<typename T>void ignore_result(T){}
#endif