aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirk Brandewie <dirk.brandewie@gmail.com>2012-06-12 08:57:14 -0700
committerChris E Ferron <chris.e.ferron@linux.intel.com>2012-06-12 09:33:26 -0700
commit035c28b60c764ce465488042edbad926540c316b (patch)
treea3e704e75266660a1f5b802fd150b2ec3ef1d137
parent9db6fd2da221d31c086ca2812b81033307e33fa7 (diff)
Add collection of average power during measurement.
Signed-off-by: Dirk Brandewie <dirk.brandewie@gmail.com>
-rw-r--r--src/measurement/extech.cpp45
-rw-r--r--src/measurement/extech.h8
2 files changed, 50 insertions, 3 deletions
diff --git a/src/measurement/extech.cpp b/src/measurement/extech.cpp
index e9d1768..4e8bf8a 100644
--- a/src/measurement/extech.cpp
+++ b/src/measurement/extech.cpp
@@ -293,15 +293,56 @@ void extech_power_meter::measure(void)
}
+void extech_power_meter::sample(void)
+{
+ ssize_t ret;
+ struct timespec tv;
+
+ tv.tv_sec = 0;
+ tv.tv_nsec = 200000000;
+ while (!end_thread) {
+ nanosleep(&tv, NULL);
+ /* trigger the extech to send data */
+ ret = write(fd, " ", 1);
+ if (ret < 0)
+ continue;
+
+ sum += extech_read(fd);
+ samples++;
+
+ }
+}
+
+extern "C"
+{
+ void* thread_proc(void *arg)
+ {
+ class extech_power_meter *parent;
+ parent = (class extech_power_meter*)arg;
+ parent->sample();
+ return 0;
+ }
+}
void extech_power_meter::end_measurement(void)
{
- measure();
+ end_thread = 1;
+ pthread_join( thread, NULL);
+ if (samples){
+ rate = sum / samples;
+ }
+ else
+ measure();
}
void extech_power_meter::start_measurement(void)
{
- /* ACPI battery state is a lagging indication, lets only measure at the end */
+ end_thread = 0;
+ sum = samples = 0;
+
+ if (pthread_create(&thread, NULL, thread_proc, this))
+ fprintf(stderr, "ERROR: extech measurement thread creation failed\n");
+
}
diff --git a/src/measurement/extech.h b/src/measurement/extech.h
index 98f854b..5f4c338 100644
--- a/src/measurement/extech.h
+++ b/src/measurement/extech.h
@@ -25,6 +25,7 @@
#ifndef __INCLUDE_GUARD_EXTECH_H
#define __INCLUDE_GUARD_EXTECH_H
+#include <pthread.h>
#include "measurement.h"
class extech_power_meter: public power_meter {
@@ -33,11 +34,16 @@ class extech_power_meter: public power_meter {
double rate;
void measure(void);
+ double sum;
+ int samples;
+ int end_thread;
+ pthread_t thread;
public:
extech_power_meter(const char *_dev_name);
virtual void start_measurement(void);
virtual void end_measurement(void);
-
+ virtual void sample(void);
+
virtual double joules_consumed(void);
virtual double dev_capacity(void) { return 0.0; };
};