commit f8e45147139fdf6ef42b23c8a8be4ed1dfffdb79
parent cc02190335a6465cfa1be235ba12f61502fa0bc0
Author: Dominik Schmidt <das1993@hotmail.com>
Date: Fri, 8 Jun 2018 14:17:38 +0000
Implement polling instead of ISRs
This prevents preemption of our worker thread and hence assures that we don't get a lot of timing variance.
We used to run into that problem because when the time required to charge the capacitor was high, we would have a huge variance.
Diffstat:
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/src/laundrysorcery.c b/src/laundrysorcery.c
@@ -131,19 +131,24 @@ void edge(void) {
rising_edge();
}
+unsigned long microseconds_since(struct timespec ts){
+ struct timespec now;
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ return (unsigned long)(now.tv_sec - ts.tv_sec)*1000000 + (unsigned long)(now.tv_nsec - ts.tv_nsec)/1000;
+}
+
int main(int argc, char **argv)
{
wiringPiSetup () ;
pinMode (0, OUTPUT) ;
- //pinMode (1, INPUT) ;
+ pinMode (1, INPUT) ;
if(argc != 2){
printf("Usage: %s </path/to/onfile>\n", argv[0]);
return 0;
}
on_file=argv[1];
- wiringPiISR(1, INT_EDGE_BOTH, &edge);
digitalWrite (0, LOW);
delay(5);
digitalWrite (0, HIGH);
@@ -152,10 +157,23 @@ int main(int argc, char **argv)
char buffer[512];
const char* arr[]={buffer};
+ struct timespec secondtimer;
+ clock_gettime(CLOCK_MONOTONIC, &secondtimer);
while(1) {
- delay(1000);
- snprintf(buffer,sizeof(buffer),"%lu:%e:%e:%e:%e:%e:%d",(unsigned long)time(NULL),running_mean,g_off.mean,g_off.variance,g_on.mean,g_on.variance,on);
- rrd_update_r("database.rrd", NULL, 1, arr);
+ while(digitalRead(1)==0){
+ ;
+ }
+ rising_edge();
+ while(digitalRead(1)==1){
+ ;
+ }
+ falling_edge();
+ if(microseconds_since(secondtimer)>1000000){
+ //delay(1000);
+ snprintf(buffer,sizeof(buffer),"%lu:%e:%e:%e:%e:%e:%d",(unsigned long)time(NULL),running_mean,g_off.mean,g_off.variance,g_on.mean,g_on.variance,on);
+ rrd_update_r("database.rrd", NULL, 1, arr);
+ clock_gettime(CLOCK_MONOTONIC, &secondtimer);
+ }
}
return 0;
}