diff --git a/src/battery_monitor.cpp b/src/battery_monitor.cpp
index 8b348b15ae0987d62d6afd298b84c420f167959c..04e94178f89cb7b6826a3c0d7e1ce2dceed934a5 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 9e13d15b9af3a8693104c6dc7bef211b3a644f17..5af0ffbd8d53ac26c6b6690dcdc88593a6a10927 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 ad97eeaf3e540ac7a4d71f8013e26990f105a3b0..b176c1982a07603f8b5dd732530bdc3c28d3f896 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)
 {