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