blob: 0b1093a503e699f031411be4d45e7491f61d5ef8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @file battery.h
* @brief Hardware-agnostic interface for fuel gauge ICs
*
* The Batter interface provides a hardware-agnostic layer for reading
* fuel gauge controller ICs.
*/
#ifndef __BATTERY_H__
#define __BATTERY_H__
#include "os/mynewt.h"
#include "battery/battery_prop.h"
#ifdef __cplusplus
extern "C" {
#endif
#if MYNEWT_VAL(BATTERY_DRIVERS_MAX)
#define BATTERY_DRIVERS_MAX MYNEWT_VAL(BATTERY_DRIVERS_MAX)
#else
#define BATTERY_DRIVERS_MAX 2
#endif
/* Package init function. Remove when we have post-kernel init stages.
*/
void battery_pkg_init(void);
/* Forward declaration of battery structure. */
struct battery;
struct battery_driver;
struct battery_property;
struct battery_driver_data;
struct battery_init_cfg {
/* Empty structure for future use */
};
struct battery_open_arg {
const char **devices;
};
/* Comments above intentionally not in Doxygen format */
/* =================================================================
* ====================== DEFINES/MACROS ===========================
* =================================================================
*/
/**
* @{ Fuel Gauge API
*/
// ------------------------ BATTERY OBJECT -------------------------
/* Private struct */
struct listener_data;
struct battery {
/* The OS device this battery inherits from, this is typically a
* fuel gauge specific driver.
*/
struct os_dev b_dev;
/*
* Driver data, set by driver init function
*/
struct battery_driver *b_drivers[BATTERY_DRIVERS_MAX];
/*
* Battery manager managed fields
*/
/* The lock for battery object */
struct os_mutex b_lock;
/* All propertied are numbered for battery manager internal use */
uint8_t b_all_property_count;
/* Number of registered listeners */
uint8_t b_listener_count;
/* Array of properties created by battery manager
* for alarms that are not fully supported by hardware.
* Filled by battery manager.
*/
struct battery_property *b_properties;
/* Bitmask of properties which needs polling (for poll and change
* notifications).
*/
uint32_t b_polled_properties[BATTERY_PROPERTY_MASK_SIZE];
/**
* Poll rate in ms for this battery.
* Field managed by battery manager.
*/
uint32_t b_poll_rate;
/* The next time at which we will poll data from this fuel gauge
* Field managed by battery manager.
*/
os_time_t b_next_run;
/* Battery last reading time stamp. */
os_time_t b_last_read_time;
/* A list of listeners that are registered to receive data from this
* battery.
*/
struct listener_data *b_listeners;
};
/* =================================================================
* ========================== BATTERY ==============================
* =================================================================
*/
/**
* Initialize battery structure data and mutex and associate it with an
* os_dev.
*
* @param os_dev to associate with the battery struct
* @param Battery struct to initialize
*
* @return 0 on success, non-zero error code on failure.
*/
int battery_init(struct os_dev *dev, void *cfg);
/**
* Find battery property or create one
*
* @param The battery to get property from
* @param The flags to select property
* @param The battery property flags, if BATTERY_PROPERY_CREATE
* is specified property can be created if not existed before.
* @param The driver name to get property from, this parameter is optional
* and can be NULL.
*
* @return NULL if property could not be found
*/
struct battery_property *battery_find_property(struct os_dev *battery,
battery_property_type_t type, battery_property_flags_t flags,
const char *dev_name);
/**
* Find battery property by name
*
* @param The battery to get property from
* @param The name of property
*
* @return NULL if property could not be found
*/
struct battery_property *battery_find_property_by_name(struct os_dev *battery,
const char *name);
/**
* Returns battery property count
*
* @param The battery to get property count from
* @param Battery driver to get property from, can be NULL.
*
* @return number of properties register to battery
*/
int battery_get_property_count(struct os_dev *battery,
struct battery_driver *driver);
/**
* Returns battery property specified by number
* It can be used to enumerate properties.
*
* @param The battery to enum property from
* @param Battery driver to get property from, can be NULL.
* @param Index of property, should be less that value returned
* by bettery_get_property_couunt
*
* @return pointer to property for valid index, or NULL if prop_num is to high
*/
struct battery_property *
battery_enum_property(struct os_dev *battery, struct battery_driver *driver,
uint8_t prop_num);
/**
* Gets battery property name
*
* @param The battery property
* @param Buffer for property name
* @param Size of the buffer for property
*
* @return pointer buffer for easy usage in printf like functions
*/
char *battery_prop_get_name(const struct battery_property *prop, char *buf,
size_t buf_size);
/**
* Set the battery poll rate
*
* @param The battery
* @param The poll rate in milliseconds
*
* @return 0 on success, non-zero error code on failure.
*/
int battery_set_poll_rate_ms(struct os_dev *battery, uint32_t poll_rate);
// =================================================================
// ========================== BATTERY MANAGER ======================
// =================================================================
/**
* @{ Battery Manager API
*/
/**
* Registers a battery with the battery manager.
* This function should be called from driver init function.
*
* @param The battery to register
*
* @return 0 on success, non-zero error code on failure.
*/
int battery_mgr_register_battery(struct os_dev *battery);
/**
* Search the battery list and find the next battery that
* corresponds to a given device name.
*
* @param The battery to search for, if NULL first registered
* battery is returned.
*
* @return battery pointer, NULL if such battery is not registered
*/
struct os_dev *battery_mgr_find_by_name(const char *name);
/**
* Add interrupt from driver so it can be processed in user context.
*
* @param The event passed from driver to be processed in battery
* manager task.
*/
void battery_mgr_process_event(struct os_event *event);
/**
* Returns number of batteries in the system.
*
* @return number of batteries.
*/
int battery_mgr_get_battery_count(void);
/**
* Get battery by its number
*/
struct os_dev *battery_get_battery(int bat_num);
/**
* Returns number of battery driver for battery instance
*
* There may be several drivers serving battery information (fuel gauge, adc),
* they can provide separate properties for same information like voltage.
* This function returns number of configured drivers.
*
* @return number of drivers for battery.
*/
int battery_get_driver_count(struct os_dev *battery);
/**
* Returns battery driver specified by it device name.
*
* @return battery driver.
*/
struct battery_driver *get_battery_driver(struct os_dev *battery,
const char *dev_name);
#if MYNEWT_VAL(BATTERY_SHELL)
void battery_shell_register(void);
#endif
/**
* }@
*/
/* End Battery Manager API */
/**
* @}
*/
/* End Battery API */
#ifdef __cplusplus
}
#endif
#endif /* __BATTERY_H__ */