@@ -453,9 +453,13 @@ void Platform_getBattery(BatteryInfo* info) {
453453 intmax_t totalCharge = 0 ;
454454 intmax_t totalCapacity = 0 ;
455455
456+ bool havePower = false;
457+ intmax_t totalPower = 0 ;
458+
456459 * info = (BatteryInfo ) {
457460 .ac = AC_ERROR ,
458461 .percent = NAN ,
462+ .powerCurr = NAN ,
459463 .energyCurr = NAN ,
460464 .energyFull = NAN ,
461465 };
@@ -488,11 +492,17 @@ void Platform_getBattery(BatteryInfo* info) {
488492 intmax_t isConnected = 0 ;
489493 intmax_t curCharge = 0 ;
490494 intmax_t maxCharge = 0 ;
495+ intmax_t chargeRate = 0 ;
496+ intmax_t dischargeRate = 0 ;
491497 intmax_t voltage = 0 ;
492498 intmax_t designVoltage = 0 ;
493499
494500 bool haveCharge = false;
501+ bool haveChargeRate = false;
502+ bool haveDischargeRate = false;
495503 bool chargeIsAmpHours = false;
504+ bool chargeRateIsAmps = false;
505+ bool dischargeRateIsAmps = false;
496506
497507 while ((fields = prop_object_iterator_next (fieldsIter )) != NULL ) {
498508 props = prop_dictionary_get (fields , "device-properties" );
@@ -531,14 +541,29 @@ void Platform_getBattery(BatteryInfo* info) {
531541 haveCharge = true;
532542 chargeIsAmpHours = typeField != NULL &&
533543 prop_string_equals_string (typeField , "Ampere hour" );
544+ } else if (prop_string_equals_string (descField , "charge rate" )) {
545+ chargeRate = prop_number_signed_value (curValue );
546+ chargeRateIsAmps = typeField != NULL &&
547+ prop_string_equals_string (typeField , "Ampere" );
548+ haveChargeRate = true;
549+ } else if (prop_string_equals_string (descField , "discharge rate" )) {
550+ dischargeRate = prop_number_signed_value (curValue );
551+ dischargeRateIsAmps = typeField != NULL &&
552+ prop_string_equals_string (typeField , "Ampere" );
553+ haveDischargeRate = true;
534554 }
535555 }
536556
537557 if (isBattery && isPresent ) {
538558 intmax_t batteryVoltage = (voltage != 0 ) ? voltage : designVoltage ;
539559
560+ bool haveBatteryChargeRate = false;
561+ bool haveBatteryDischargeRate = false;
562+
540563 bool haveBatteryCharge = false;
541564
565+ intmax_t batteryChargeRate = 0 ;
566+ intmax_t batteryDischargeRate = 0 ;
542567 intmax_t batteryCharge = 0 ;
543568 intmax_t batteryCapacity = 0 ;
544569
@@ -556,11 +581,39 @@ void Platform_getBattery(BatteryInfo* info) {
556581 }
557582 }
558583
584+ if (haveChargeRate ) {
585+ if (chargeRateIsAmps ) {
586+ if (batteryVoltage > 0 ) {
587+ batteryChargeRate = chargeRate * batteryVoltage / 1000000 ;
588+ haveBatteryChargeRate = true;
589+ }
590+ } else {
591+ batteryChargeRate = chargeRate ;
592+ haveBatteryChargeRate = true;
593+ }
594+ }
595+
596+ if (haveDischargeRate ) {
597+ if (dischargeRateIsAmps ) {
598+ if (batteryVoltage > 0 ) {
599+ batteryDischargeRate = dischargeRate * batteryVoltage / 1000000 ;
600+ haveBatteryDischargeRate = true;
601+ }
602+ } else {
603+ batteryDischargeRate = dischargeRate ;
604+ haveBatteryDischargeRate = true;
605+ }
606+ }
607+
559608 if (haveBatteryCharge ) {
560609 totalCharge += batteryCharge ;
561610 totalCapacity += batteryCapacity ;
562611 }
563612
613+ if (haveBatteryChargeRate || haveBatteryDischargeRate ) {
614+ totalPower += batteryDischargeRate - batteryChargeRate ;
615+ havePower = true;
616+ }
564617 }
565618
566619 if (isACAdapter && info -> ac != AC_PRESENT ) {
@@ -577,6 +630,10 @@ void Platform_getBattery(BatteryInfo* info) {
577630 info -> energyFull = (double ) totalCapacity / 1000000.0 ;
578631 }
579632
633+ if (havePower ) {
634+ info -> powerCurr = (double ) totalPower / 1000000.0 ;
635+ }
636+
580637error :
581638 if (fd != -1 )
582639 close (fd );
0 commit comments