#include "ltc2941.h" #define LTC2941_REG_STATUS 0x00 #define LTC2941_REG_CONTROL 0x01 #define LTC2941_REG_CHARGE_MSB 0x02 #define LTC2941_REG_CHARGE_LSB 0x03 ltc2941_ret_t ltc2941_init(ltc2941_t *bat) { uint8_t control_reg = ((bat->config.alert_mode & 0x03U) << 0x01U) | ((bat->config.prescaler & 0x07U) << 0x03U) | ((bat->config.alert_level & 0x03U) << 0x06U); bat->cb.write_register_cb(bat->user_data, LTC2941_REG_CONTROL, control_reg); return LTC2941_OK; } ltc2941_ret_t ltc2941_read_status(ltc2941_t *bat, uint8_t *status) { return bat->cb.read_register_cb(bat->user_data, LTC2941_REG_STATUS, status); } ltc2941_ret_t ltc2941_read_charge(ltc2941_t *bat, uint16_t *charge) { uint8_t reg = 0x00; bat->cb.read_register_cb(bat->user_data, LTC2941_REG_CHARGE_MSB, ®); *charge = reg << 0x08U; bat->cb.read_register_cb(bat->user_data, LTC2941_REG_CHARGE_LSB, ®); *charge |= reg; return LTC2941_OK; } ltc2941_ret_t ltc2941_write_charge(ltc2941_t *bat, uint16_t charge) { uint8_t reg = (charge >> 0x08U); // MSB bat->cb.write_register_cb(bat->user_data, LTC2941_REG_CHARGE_MSB, reg); reg = (charge & 0xFFU); // LSB bat->cb.write_register_cb(bat->user_data, LTC2941_REG_CHARGE_LSB, reg); return LTC2941_OK; }