static status_t acpi_battery_read(void* _cookie, off_t position, void *buffer, size_t* numBytes) { if (*numBytes < 1) return B_IO_ERROR; battery_device_cookie *device = (battery_device_cookie*)_cookie; acpi_battery_info batteryStatus; ReadBatteryStatus(device->driver_cookie, &batteryStatus); acpi_extended_battery_info batteryInfo; ReadBatteryInfo(device->driver_cookie, &batteryInfo); if (position == 0) { char string[512]; char *str = string; size_t max_len = sizeof(string); snprintf(str, max_len, "Battery Status:\n"); max_len -= strlen(str); str += strlen(str); snprintf(str, max_len, " State %i, Current Rate %i, Capacity %i, " "Voltage %i\n", batteryStatus.state, batteryStatus.current_rate, batteryStatus.capacity, batteryStatus.voltage); max_len -= strlen(str); str += strlen(str); snprintf(str, max_len, "\nBattery Info:\n"); max_len -= strlen(str); str += strlen(str); snprintf(str, max_len, " Power Unit %i, Design Capacity %i, " "Last Full Charge %i, Technology %i\n", batteryInfo.power_unit, batteryInfo.design_capacity, batteryInfo.last_full_charge, batteryInfo.technology); max_len -= strlen(str); str += strlen(str); snprintf(str, max_len, " Design Voltage %i, Design Capacity Warning %i, " "Design Capacity Low %i, Capacity Granularity1 %i, " "Capacity Granularity1 %i\n", batteryInfo.design_voltage, batteryInfo.design_capacity_warning, batteryInfo.design_capacity_low, batteryInfo.capacity_granularity_1, batteryInfo.capacity_granularity_1); max_len -= strlen(str); str += strlen(str); snprintf(str, max_len, " Model Number %s, Serial Number %s, " "Type %s, OEM Info %s\n", batteryInfo.model_number, batteryInfo.serial_number, batteryInfo.type, batteryInfo.oem_info); max_len -= strlen(str); str += strlen(str); max_len = user_strlcpy((char*)buffer, string, *numBytes); if (max_len < B_OK) return B_BAD_ADDRESS; *numBytes = max_len; } else *numBytes = 0; return B_OK; }
static status_t acpi_battery_control(void* _cookie, uint32 op, void* arg, size_t len) { battery_device_cookie* device = (battery_device_cookie*)_cookie; status_t err; switch (op) { case IDENTIFY_DEVICE: { if (len < sizeof(uint32)) return B_BAD_VALUE; uint32 magicId = kMagicACPIBatteryID; return user_memcpy(arg, &magicId, sizeof(magicId)); } case GET_BATTERY_INFO: { if (len < sizeof(acpi_battery_info)) return B_BAD_VALUE; acpi_battery_info batteryInfo; err = ReadBatteryStatus(device->driver_cookie, &batteryInfo); if (err != B_OK) return err; return user_memcpy(arg, &batteryInfo, sizeof(batteryInfo)); } case GET_EXTENDED_BATTERY_INFO: { if (len < sizeof(acpi_extended_battery_info)) return B_BAD_VALUE; acpi_extended_battery_info extBatteryInfo; err = ReadBatteryInfo(device->driver_cookie, &extBatteryInfo); if (err != B_OK) return err; return user_memcpy(arg, &extBatteryInfo, sizeof(extBatteryInfo)); } case WATCH_BATTERY: sBatteryCondition.Wait(); if (atomic_get(&(device->stop_watching))) { atomic_set(&(device->stop_watching), 0); return B_ERROR; } return B_OK; case STOP_WATCHING_BATTERY: atomic_set(&(device->stop_watching), 1); sBatteryCondition.NotifyAll(); return B_OK; } return B_DEV_INVALID_IOCTL; }