Program Listing for File energy.c

Return to documentation for file (mainboard/Src/energy/energy.c)

/* Includes ------------------------------------------------------------------*/
#include "energy/energy.h"

#include <stdlib.h>

/* Private typedef -----------------------------------------------------------*/
struct energy {
    uint32_t last_sample;
    float energy;
    float last_power;
};

/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

void energy_init(energy_t *handle) {
    *handle = malloc(sizeof(struct energy));
    energy_set_count(*handle, 0);
    energy_set_time(*handle, 0);
}

void energy_deinit(energy_t *handle) {
    free(*handle);
}

void energy_set_count(energy_t handle, float energy) {
    handle->energy = energy;
}

void energy_set_time(energy_t handle, uint32_t time) {
    handle->last_sample = time;
    handle->last_power  = 0;
}

void energy_sample_energy(energy_t handle, float power, uint32_t time) {
    // Use trapezoidal rule to approximate an integral
    // Energy = ∫Power dt = (1/2 * (P[i-1] + P[i])) * Δt
    handle->energy += ((handle->last_power + power) / 2) * ((time - handle->last_sample) / 1000.0f);

    handle->last_power  = power;
    handle->last_sample = time;
}

float energy_get_wh(energy_t handle) {
    // 1 J = 1/3600s Wh
    return handle->energy / 3600;
}

float energy_get_joule(energy_t handle) {
    return handle->energy;
}