Files @ 9ae5559ab974
Branch filter:

Location: therm-ng/src/system/error.c

matthewreed
Added current setpoint number to heating screens, and a few fixes for floating point numbers and such.
//
// Error: Provides a simple interface for asserting and checking errors
//

#include "stm32f3xx_hal.h"

#include <stdio.h>

#include "config.h"
#include "error.h"

static volatile uint32_t err_reg;
static volatile uint8_t num_errors_asserted = 0;

// Moderately detailed messages corresponding to each error enum
//static const char *  error_message[] =
//{
//		"Info",
//		"General",
//};


// Set the passed error flag
void error_assert(const uint8_t errno)
{
    // Errno invalid: exceeds bit length of error register
    if(errno >= 32)
        return;

    // Don't count info messages as true errors
    if(errno > ERR_INFO)
    {
        // Set error flag
        err_reg |= (1<<errno);

        // Count how many errors have occurred
        num_errors_asserted++;
    }

    // Dispatch error message over IRdA and/or debug port
#ifdef DEBUG_ERROUT_ENABLE
    char outbuf[256];
    snprintf(outbuf, 256, "[%lu\] %s (no details) \r\n", HAL_GetTick(), error_message[errno]);
#endif
}


// Set the passed error flag with details about the error
void error_assert_info(const uint8_t errno, const char* details)
{
    // Errno invalid: exceeds bit length of error register
    if(errno >= 32)
        return;

    // Don't count info messages as true errors
    if(errno > ERR_INFO)
    {
        // Set error flag
        err_reg |= (1<<errno);

        // Count how many errors have occurred
        num_errors_asserted++;
    }

    // Dispatch error message over IRdA and/or debug port
#ifdef DEBUG_ERROUT_ENABLE
    char outbuf[256];
    if(errno == ERR_INFO)
        snprintf(outbuf, 256, "Info: %s \r\n", details);
    else
        snprintf(outbuf, 256, "[%lu\] %s (%s) \r\n", HAL_GetTick(), error_message[errno], details);
    usb_send_debug(outbuf);

    if(errno > ERR_INFO)
    {
        ir_efs_send(outbuf);
        error_sidechannel_addmsg(outbuf);
    }
#endif
}


// Check if the passed error flag has been asserted
inline uint8_t error_check(const uint8_t errno)
{
    return (err_reg & (1<<errno)) > 0;
}


// Return 1 if any error has occurred
inline uint8_t error_occurred(void)
{
    return err_reg > 0;
}


// Return the number of errors that have occurred
inline uint8_t error_count(void)
{
    return num_errors_asserted;
}