1/* 2 * Copyright 2009-2015, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Clemens Zeidler, haiku@clemens-zeidler.de 7 */ 8 9 10#include "APMDriverInterface.h" 11 12#include <arch/x86/apm_defs.h> 13#include <generic_syscall_defs.h> 14#include <syscalls.h> 15 16 17const bigtime_t kUpdateInterval = 2000000; 18 // every two seconds 19 20 21APMDriverInterface::~APMDriverInterface() 22{ 23} 24 25 26status_t 27APMDriverInterface::Connect() 28{ 29 uint32 version = 0; 30 status_t status = _kern_generic_syscall(APM_SYSCALLS, B_SYSCALL_INFO, 31 &version, sizeof(version)); 32 if (status == B_OK) { 33 apm_battery_info info; 34 status = _kern_generic_syscall(APM_SYSCALLS, APM_GET_BATTERY_INFO, 35 &info, sizeof(apm_battery_info)); 36 } 37 38 return status; 39} 40 41 42status_t 43APMDriverInterface::GetBatteryInfo(int32 index, battery_info* info) 44{ 45 if (index != 0) 46 return B_BAD_VALUE; 47 48 info->current_rate = -1; 49 50 apm_battery_info apmInfo; 51 status_t status = _kern_generic_syscall(APM_SYSCALLS, APM_GET_BATTERY_INFO, 52 &apmInfo, sizeof(apm_battery_info)); 53 if (status == B_OK) { 54 info->state = apmInfo.online ? BATTERY_CHARGING : BATTERY_DISCHARGING; 55 info->capacity = apmInfo.percent; 56 info->full_capacity = 100; 57 info->time_left = apmInfo.time_left; 58 } 59 60 return status; 61} 62 63 64status_t 65APMDriverInterface::GetExtendedBatteryInfo(int32 index, 66 acpi_extended_battery_info* info) 67{ 68 return B_NOT_SUPPORTED; 69} 70 71 72int32 73APMDriverInterface::GetBatteryCount() 74{ 75 return 1; 76} 77 78 79void 80APMDriverInterface::_WatchPowerStatus() 81{ 82 while (atomic_get(&fIsWatching) > 0) { 83 Broadcast(kMsgUpdate); 84 acquire_sem_etc(fWaitSem, 1, B_RELATIVE_TIMEOUT, kUpdateInterval); 85 } 86} 87