// // BSD version based on the Linux version by Mike: // Copyright (c) 1997 by Mike Romberg ( romberg@fsl.noaa.gov ) // // This file may be distributed under terms of the GPL // // BSD porting work done by David W. Talmage // // // $Id$ // // Only supported for NetBSD so far. #include "btrymeter.h" #include "xosview.h" #ifdef HAVE_FSTREAM #include #else #include #endif #include #include #include #include #include #include static const char APMFILENAME[] = "/dev/apm"; BtryMeter::BtryMeter( XOSView *parent ) : FieldMeter( parent, 2, "BAT", "% LEFT/% USED", 1, 1 ){ } BtryMeter::~BtryMeter( void ){ } void BtryMeter::checkResources( void ){ FieldMeter::checkResources(); setfieldcolor( 0, parent_->getResource( "batteryUsedColor" ) ); setfieldcolor( 1, parent_->getResource( "batteryLeftColor" ) ); priority_ = atoi (parent_->getResource( "batteryPriority" ) ); SetUsedFormat(parent_->getResource( "batteryUsedFormat" ) ); } void BtryMeter::checkevent( void ){ getpwrinfo(); drawfields(); } void BtryMeter::getpwrinfo( void ){ struct apm_power_info buff; float minutes_left, max_left; int error = 0; int loadinfo = open(APMFILENAME, O_RDONLY, 0); if ( !loadinfo ){ std::cerr <<"Can not open file : " <done(1); return; } error = ioctl(loadinfo, APM_IOC_GETPOWER, &buff); if (error != -1) { if (buff.battery_state != APM_BATT_ABSENT) { fields_[0] = (float)buff.battery_life; // percent left fields_[1] = 100.0 - fields_[0]; // percent used minutes_left = (float)buff.minutes_left; // minutes_left = (percent_left/100.0) * max_minutes; // minutes_left / (percent_left/100.0) = max_minutes; // minutes_left * 100.0 / percent_left = max_minutes; if (minutes_left == 0) { // This fix a bogus warning when the apm bios doesn't know // the correct remaining time. minutes_left = (float)0.01; } max_left = minutes_left * 100.0 / fields_[0]; // // Set total_ so that the graphing methods know to set the // relative sizes of the percent left and percent used graphs. // total_ = 100.0; // // This sets the actual number of minutes left. If the resource // xosview*batteryUsedFormat is "float", then xosview will display // that number to the left of the battery graph. If it's // "percent", then you get the percent remaining next to the // graph. // setUsed(minutes_left, max_left); } } close(loadinfo); }