From 284fcc060cdd15b2c2d7d208c16c5232e24ecd1c Mon Sep 17 00:00:00 2001
From: fherrero <fherrero@iri.upc.edu>
Date: Tue, 29 Jan 2019 17:03:09 +0100
Subject: [PATCH] Add alarm iteration for thread starting (lost on old commit)
 Add some capacity data short int casts Fix BatteryStatus error bit number

---
 src/battery_monitor.cpp               | 31 ++++++++++++++++++++++++---
 src/battery_monitor.h                 |  2 +-
 src/examples/battery_monitor_test.cpp |  2 +-
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/src/battery_monitor.cpp b/src/battery_monitor.cpp
index 8b348b1..04e9417 100755
--- a/src/battery_monitor.cpp
+++ b/src/battery_monitor.cpp
@@ -61,6 +61,7 @@ void *CBattery_Monitor::battery_monitor_thread(void *param)
   CBattery_Monitor *battery=(CBattery_Monitor *)param;
   short int data[21];
   bool end=false;
+  std::list<TAlarm>::iterator iterator;
   
   while(!end)
   {
@@ -70,7 +71,7 @@ void *CBattery_Monitor::battery_monitor_thread(void *param)
       else
       {
         /* get the data from the battery */
-        battery->bat_mon->read_registers(0x20,(unsigned char *)data,38);
+        battery->bat_mon->read_registers(0x20,(unsigned char *)data,42);
         /* convert the data */
         battery->info.temperature=data[0]/10.0-273.15;
         battery->info.battery_voltage=data[1]/1000.0;
@@ -79,20 +80,44 @@ void *CBattery_Monitor::battery_monitor_thread(void *param)
         battery->info.relative_state_of_charge=data[4];
         battery->info.absolute_state_of_charge=data[5];
         battery->info.remaining_capacity=data[6]/1000.0;
-        battery->info.full_charge_capacity=data[7]/1000.0;
+        battery->info.full_charge_capacity=((unsigned short int)data[7])/1000.0;
         battery->info.run_time_to_empty=data[8];
         battery->info.avg_time_to_empty=data[9];
         battery->info.avg_time_to_full=data[10];
         battery->info.charging_current=data[11]/1000.0;
         battery->info.charging_voltage=data[12]/1000.0;
         (*((unsigned short int *)&battery->info.status))=data[13];
-        battery->info.design_capacity=data[14]/1000.0;
+        battery->info.design_capacity=((unsigned short int)data[14])/1000.0;
         battery->info.design_voltage=data[15]/1000.0;
         // pack status ignored
         battery->info.cell4_voltage=data[17]/1000.0;
         battery->info.cell3_voltage=data[18]/1000.0;
         battery->info.cell2_voltage=data[19]/1000.0;
         battery->info.cell1_voltage=data[20]/1000.0;
+
+        bool active_alarm=false;
+        for(iterator=battery->alarms.begin();iterator!=battery->alarms.end();iterator++)
+        {
+          if(iterator->condition_function(&battery->info))
+          {
+            active_alarm=true;
+            if(!battery->event_server->event_is_set(iterator->event_id))
+              battery->event_server->set_event(iterator->event_id);
+            // start the thread sound
+            battery->current_alarm=iterator;
+            if(battery->sound_enabled)
+            {
+              /* start the thread only once */
+              if(battery->thread_server->get_thread_state(battery->battery_sound_thread_id)==attached)
+                battery->thread_server->start_thread(battery->battery_sound_thread_id); 
+            }
+            break;
+          }
+        }
+
+        if(!active_alarm)
+          battery->disable_alarm_sound();
+
       }
     }catch(CException &e){
       std::cout << e.what() << std::endl;
diff --git a/src/battery_monitor.h b/src/battery_monitor.h
index 9e13d15..5af0ffb 100755
--- a/src/battery_monitor.h
+++ b/src/battery_monitor.h
@@ -9,7 +9,7 @@
 
 typedef struct
 {
-  unsigned short int error:3;
+  unsigned short int error:4;
   unsigned short int fully_discharged:1;
   unsigned short int fully_charged:1;
   unsigned short int discharging:1;
diff --git a/src/examples/battery_monitor_test.cpp b/src/examples/battery_monitor_test.cpp
index ad97eea..b176c19 100755
--- a/src/examples/battery_monitor_test.cpp
+++ b/src/examples/battery_monitor_test.cpp
@@ -6,7 +6,7 @@
 #include <linux/kd.h>
 #include <signal.h>
 
-std::string battery_dev="A900WSG1";
+std::string battery_dev="A600eB1Y";
 
 bool condition1(TBatteryInfo *info)
 {
-- 
GitLab