stable now, graphs might need some tweaks
[monky] / src / linux.c
index c2755c7..0dd4bcd 100644 (file)
@@ -35,6 +35,7 @@
 #include "linux.h"
 #include "net_stat.h"
 #include "diskio.h"
+#include "bme.c"
 #include "temphelper.h"
 #include <dirent.h>
 #include <ctype.h>
@@ -1583,17 +1584,20 @@ static char batteries[MAX_BATTERY_COUNT][32];
 //eg 4100
 static int last_battery_volts[MAX_BATTERY_COUNT];
 
-//eg 78
-static unsigned char last_cell_radio_dbm;
+//eg -78
+static dbus_int32_t last_cell_radio_dbm;
 
 //eg 100
-static unsigned char last_cell_radio_percent;
+static dbus_int32_t last_cell_radio_percent;
 
 //eg 'full' 'on' 'off'
 static char last_batt_charge_status[16];
 
-//eg 35
-static int last_battery_temp[MAX_BATTERY_COUNT];
+//eg 100 or -100
+static int last_battery_rate[MAX_BATTERY_COUNT];
+
+//eg 35.5
+static float last_battery_temp[MAX_BATTERY_COUNT];
 
 /* e.g. "charging 75%" */
 static char last_battery_str[MAX_BATTERY_COUNT][64];
@@ -1653,22 +1657,25 @@ DBusMessage *reply;
 
 void dbus_exit_app_view()
 {
+       //not needed in harmattan - swipe down or away and close (although it doesn't seem to be reliable to swipe)
+       
+       
        //dbus-send --type=signal --session     /com/nokia/hildon_desktop .
 
-       type = DBUS_BUS_SESSION;
-       //message_type = DBUS_MESSAGE_TYPE_SIGNAL;
-       dbus_error_init (&error);
-       connection = dbus_bus_get (type, &error);
-    message = dbus_message_new_signal ("/com/nokia/hildon_desktop", "com.nokia.hildon_desktop", "exit_app_view");
-    // send the message and flush the connection
-    if (!dbus_connection_send(connection, message, NULL)) {
-       fprintf(stderr, "Out Of Memory!\n");
-       exit(1);
-    }
-    dbus_connection_flush(connection);
-
-    // free the message
-    dbus_message_unref(message);
+//     type = DBUS_BUS_SESSION;
+//     //message_type = DBUS_MESSAGE_TYPE_SIGNAL;
+//     dbus_error_init (&error);
+//     connection = dbus_bus_get (type, &error);
+//    message = dbus_message_new_signal ("/com/nokia/hildon_desktop", "com.nokia.hildon_desktop", "exit_app_view");
+//    // send the message and flush the connection
+//    if (!dbus_connection_send(connection, message, NULL)) {
+//       fprintf(stderr, "Out Of Memory!\n");
+//       exit(1);
+//    }
+//    dbus_connection_flush(connection);
+//
+//    // free the message
+//    dbus_message_unref(message);
 
 }
 
@@ -1678,6 +1685,7 @@ void get_dbus_stuff(char *buffer,unsigned int intMax_length, int item)
        char path[128];
        char dest[128];
        char *args = "";
+       char *args2 = "";
        if (dbus_queue > 10)
        {
                fprintf (stderr, "too much dbus queuing\n");
@@ -1705,19 +1713,39 @@ void get_dbus_stuff(char *buffer,unsigned int intMax_length, int item)
       exit (1);
     }
        switch(item){
-       case DBUS_CELL_DBM:
-               snprintf(method,127,"get_signal_strength");
-               snprintf(path,127,"/com/nokia/phone/net");
-               snprintf(dest,127,"com.nokia.phone.net");
-               message = dbus_message_new_method_call (dest,path,"Phone.Net",method);
+       case DBUS_CELL_DBM:             
+               snprintf(method,127,"Get");
+               args = "com.nokia.csd.CSNet.SignalStrength";
+               args2 = "SignalDecibels";
+               snprintf(path,127,"/com/nokia/csd/csnet");
+               snprintf(dest,127,"com.nokia.csd.CSNet"); //service name
+               message = dbus_message_new_method_call (dest,path,"org.freedesktop.DBus.Properties",method);//dest,path,interface,method
                dbus_message_set_auto_start (message, TRUE);
+               if (!dbus_message_append_args(message,
+                       DBUS_TYPE_STRING, &args,
+                       DBUS_TYPE_STRING, &args2,
+                       DBUS_TYPE_INVALID))
+                               fprintf (stderr, "OOM appending args\n");
+               //dbus_message_iter_init_append(message, &iter);
+               //if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &args))
+               //      fprintf (stderr, "OOM appending args\n");
                break;
        case DBUS_CELL_PERCENT:
-               snprintf(method,127,"get_signal_strength");
-               snprintf(path,127,"/com/nokia/phone/net");
-               snprintf(dest,127,"com.nokia.phone.net");
-               message = dbus_message_new_method_call (dest,path,"Phone.Net",method);
+               snprintf(method,127,"Get");
+               args = "com.nokia.csd.CSNet.SignalStrength";
+               args2 = "SignalPercent";
+               snprintf(path,127,"/com/nokia/csd/csnet");
+               snprintf(dest,127,"com.nokia.csd.CSNet"); //service name
+               message = dbus_message_new_method_call (dest,path,"org.freedesktop.DBus.Properties",method);//dest,path,interface,method
                dbus_message_set_auto_start (message, TRUE);
+               if (!dbus_message_append_args(message,
+                       DBUS_TYPE_STRING, &args,
+                       DBUS_TYPE_STRING, &args2,
+                       DBUS_TYPE_INVALID))
+                               fprintf (stderr, "OOM appending args\n");
+               //dbus_message_iter_init_append(message, &iter);
+               //if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &args))
+               //      fprintf (stderr, "OOM appending args\n");
                break;
        case DBUS_HAL_BATTERY_CHRG_STATUS:
                // 'full' 'on' 'off'
@@ -1746,7 +1774,7 @@ void get_dbus_stuff(char *buffer,unsigned int intMax_length, int item)
        case DBUS_HAL_BATTERY_VOLTS_CURRENT:
                // '3600' - '4200'
                snprintf(method,127,"GetProperty");
-               args = "battery.voltage.current";
+               args = "battery.voltage.current"; //battery.reporting.current gets battery mA, not charge/discharge rate
                snprintf(path,127,"/org/freedesktop/Hal/devices/bme");
                snprintf(dest,127,"org.freedesktop.Hal");
                message = dbus_message_new_method_call (dest,path,"org.freedesktop.Hal.Device",method);
@@ -1780,27 +1808,37 @@ void get_dbus_stuff(char *buffer,unsigned int intMax_length, int item)
        if (reply)
        {
                DBusMessageIter iter;
+               DBusMessageIter subiter;
                dbus_message_iter_init (reply, &iter);
-               //int type = dbus_message_iter_get_arg_type(&iter);
                int current_fieldnumber = 0;
                while (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INVALID)
                {
-                       //fprintf (stderr,"dbus-monitor too dumb to decipher arg type '%c'\n", type);
+                       
                        current_fieldnumber++;
                        switch(item){
                        case DBUS_CELL_DBM:
-                               if (current_fieldnumber == 2)
-                               {
-                                       unsigned char val;
-                                       dbus_message_iter_get_basic(&iter, &val);
+                               if (current_fieldnumber == 1)
+                               {//this is a variant
+                                       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT){
+                                               fprintf (stderr,"DBUS_CELL_DBM got type '%c'; expected variant!\n", dbus_message_iter_get_arg_type(&iter));
+                                               break;
+                                       }
+                                       dbus_message_iter_recurse (&iter, &subiter);                            
+                                       dbus_int32_t val = 0;
+                                       if (dbus_message_iter_get_arg_type(&subiter) != DBUS_TYPE_INT32){
+                                               fprintf (stderr,"DBUS_CELL_DBM subiter got type '%c'; expected INT32!\n", dbus_message_iter_get_arg_type(&subiter));
+                                               break;
+                                       }
+                                       dbus_message_iter_get_basic(&subiter, &val);
                                        last_cell_radio_dbm = val;
                                }
                                break;
                        case DBUS_CELL_PERCENT:
                                if (current_fieldnumber == 1)
-                               {
-                                       unsigned char val;
-                                       dbus_message_iter_get_basic(&iter, &val);
+                               {//this is a variant
+                                       dbus_message_iter_recurse (&iter, &subiter);
+                                       dbus_int32_t val = 0;
+                                       dbus_message_iter_get_basic(&subiter, &val);
                                        last_cell_radio_percent = val;
                                }
                                break;
@@ -1882,7 +1920,7 @@ void get_battery_stuff(char *buffer, unsigned int n, const char *bat, int item)
        idx = get_battery_idx(bat);
 
        /* don't update battery too often */
-       if (current_update_time - last_battery_time[idx] < 29.5) {
+       if (current_update_time - last_battery_time[idx] < 2) {
                set_return_value(buffer, n, item, idx);
                return;
        }
@@ -1927,10 +1965,12 @@ void get_battery_stuff(char *buffer, unsigned int n, const char *bat, int item)
                }
                fclose(sysfs_bat_fp[idx]);
                sysfs_bat_fp[idx] = NULL;
-
-               last_battery_volts[idx] = voltage;
-               last_battery_temp[idx] = temp;
-
+               if (voltage > 10000) voltage = voltage / 1000;  //fix for n900 power kernel 47
+               last_battery_volts[idx] = voltage;
+               if (temp < 100)
+                       last_battery_temp[idx] = temp;
+               else //fix for n900 power kernel 47
+                       last_battery_temp[idx] = (float) temp / 10;
                /* charging */
                if (present_rate <= 0) {
                                /* e.g. charging 75% */
@@ -1962,7 +2002,11 @@ void get_battery_stuff(char *buffer, unsigned int n, const char *bat, int item)
                else if (strncmp(buffer, "full", 4) == 0) {//no, it won't always be 100%. stupid dbus.
                        snprintf(last_battery_str[idx], sizeof(last_battery_str[idx])-1, "charged %i%%", remaining_capacity);
                 }
-               last_battery_temp[idx] = temp;
+                
+                struct bme_reply bmeInfo = getBattInfoFromBME();
+                last_battery_temp[idx] = ((float)bmeInfo.battery_temperature) - 273.15f;
+                last_battery_rate[idx] = bmeInfo.battery_current;
+               //last_battery_temp[idx] = temp;                
        }
        set_return_value(buffer, n, item, idx);
 }
@@ -1980,8 +2024,11 @@ void set_return_value(char *buffer, unsigned int n, int item, int idx)
                        snprintf(buffer, n, "%i", last_battery_volts[idx]); // voltage
                        break;
                case BATTERY_TEMP:
-                       snprintf(buffer, n, "%i", last_battery_temp[idx]); // temperature
+                       snprintf(buffer, n, "%3.1f", last_battery_temp[idx]); // temperature
                        break;
+               case BATTERY_RATE:
+                       snprintf(buffer, n, "%i", last_battery_rate[idx]); // charge/discharge rate
+                       break;                  
                default:
                        fprintf (stderr, "invalid item type in set_return_value");
                        break;