avr-fw-modules/core/src/runtime.c

105 lines
1.8 KiB
C
Executable File

#include <hwo/eeprom.h>
#include <hwo/systick.h>
#include <hwo/threads.h>
#include <sys/runtime.h>
#include <sys/events.h>
/**
* @defgroup hwo_core_runtime Betriebsstunden
* @brief Speicherung der Betriebsstunden.
*
* @{
*/
volatile struct rt_ram rt_ram;
/*! \brief Signal Thread.
*
*/
void runtime_signal(void)
{
#if !defined(RUNTIME_USES_THREADING)
timer_start( rt_ram.timer, 1L );
#else
thread_wake( rt_ram.rtThread );
#endif
};
/*! \brief Runtime-Thread.
*
* Ermittelt Betriebsstunden des Geräts
*/
void runtime_cycle(void)
{
rt_ram.secs_current = systick_secs();
rt_ram.secs_gone = rt_ram.secs_current - rt_ram.secs_last;
rt_ram.eeprom.secs_powered += rt_ram.secs_gone;
if (rt_ram.flags.is_running)
rt_ram.eeprom.secs_running += rt_ram.secs_gone;
if ((rt_ram.eeprom.next_service != -1L) && (rt_ram.eeprom.next_service <= rt_ram.eeprom.secs_running))
rt_ram.flags.service_pending = 1;
else
rt_ram.flags.service_pending = 0;
eeprom_save( rt_ram.bank, (avrEEPROM*)&rt_ram.eeprom.eeprom );
rt_ram.secs_last = rt_ram.secs_current;
};
#if defined(RUNTIME_USES_THREADING)
void runtime_thread(void* arg){
while (1){
wait_ms( 10000l );
runtime_cycle();
};
};
#endif
/*! \brief Startet Runtime-Thread.
*
*/
void runtime_start(int16_t bank)
{
if (!eeprom_load( bank, (avrEEPROM*)&rt_ram.eeprom.eeprom ) || (rt_ram.eeprom.serial.code == -1))
rt_ram.flags.eeprom_corrupt = 1;
else
rt_ram.flags.eeprom_corrupt = 0;
rt_ram.eeprom.count_poweron++;
rt_ram.flags.is_running = 0;
eeprom_save( bank, (avrEEPROM*)&rt_ram.eeprom );
rt_ram.secs_last = systick_secs();
rt_ram.bank = bank;
#if !defined(RUNTIME_USES_THREADING)
rt_ram.timer = timer_create_ex( TIMERID_SYS_RUNTIME, 10000000L, runtime_cycle, TF_REPEAT);
timer_start( rt_ram.timer, 0 );
#else
thread_alloc( runtime_thread, NULL, 256 );
#endif
};
/** @}
*/