embedded-software
reusable software modules for embedded systems
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
subsystem.h
Go to the documentation of this file.
1 
31 #ifndef _SUBSYSTEM_H_
32 #define _SUBSYSTEM_H_
33 
34 #include <stdarg.h>
35 
36 #include "library.h"
37 
38 // Define these before including project_settings.h so project_settings.h can see them
39 #define SUBSYSTEM_IO_NONE 0
40 #define SUBSYSTEM_IO_UART 1
41 #define SUBSYSTEM_IO_PRINTF 2
42 #define SUBSYSTEM_IO_CUSTOM 255 // if the user sets this, they are responsible for creating the macro hooks to the IO layer in their project_settings.h file
43 
44 #include "project_settings.h"
45 
46 enum log_level {
47  LOG_OFF = 0,
52 };
53 
54 
55 /* If the subsys io isn't explicitly defined, but SUBSYS_UART is defined, set the io system to UART
56  * else, disable the system */
57 #ifndef SUBSYSTEM_IO
58 #ifdef SUBSYSTEM_UART
59 #define SUBSYSTEM_IO SUBSYSTEM_IO_UART
60 #else
61 #define SUBSYSTEM_IO SUBSYSTEM_IO_NONE
62 #endif
63 #endif
64 
65 #if SUBSYSTEM_IO != SUBSYSTEM_IO_NONE
66 #ifndef USE_MODULE_SUBSYSTEM
67 #warning "USE_MODULE_SUBSYSTEM not defined in project_settings.h. Other modules won't be able to utilize this module."
68 #endif
69 #endif
70 
71 #if SUBSYSTEM_IO == SUBSYSTEM_IO_NONE
72  #define LogError(sys_id, str, ...)
73  #define LogWarning(sys_id, str, ...)
74  #define LogMsg(sys_id, str, ...)
75  #define LogDebug(sys_id, str, ...)
76 #else
77  #define LogError(sys_id, str, ...) Subsystem_Write(sys_id, LOG_ERROR, str, ##__VA_ARGS__)
78  #define LogWarning(sys_id, str, ...) Subsystem_Write(sys_id, LOG_WARNING, str, ##__VA_ARGS__)
79  #define LogMsg(sys_id, str, ...) Subsystem_Write(sys_id, LOG_MESSAGE, str, ##__VA_ARGS__)
80  #define LogDebug(sys_id, str, ...) Subsystem_Write(sys_id, LOG_DEBUG, str, ##__VA_ARGS__)
81 #endif
82 
83 #if SUBSYSTEM_IO == SUBSYSTEM_IO_NONE
84  #define Subsystem_printf(str, ...)
85  #define Subsystem_vprintf(str, arg)
86  #define Subsystem_PrintChar(c)
87  #define Subsystem_RegisterReceiver(r)
88 #elif SUBSYSTEM_IO == SUBSYSTEM_IO_UART
89  #include "uart.h"
90  #ifndef USE_MODULE_BUFFER_PRINTF
91  #error "This module requires optional UART functionality provided by buffer_printf. Please declare USE_MODULE_BUFFER_PRINTF in project_settings.h"
92  #endif
93  #ifndef SUBSYSTEM_UART
94  #error "You must define what UART number the terminal is using in project_settings.h: #define SUBSYS_UART num"
95  #endif
96  #define Subsystem_printf(str, ...) UART_printf(SUBSYSTEM_UART, str, ##__VA_ARGS__)
97  #define Subsystem_vprintf(str, arg) UART_vprintf(SUBSYSTEM_UART, str, arg)
98  #define Subsystem_PrintChar(c) UART_WriteByte(SUBSYSTEM_UART, c)
99  #define Subsystem_RegisterReceiver(r) UART_RegisterReceiver(SUBSYSTEM_UART, r);
100 #elif SUBSYSTEM_IO == SUBSYSTEM_IO_PRINTF
101  #include <stdio.h>
102  #define Subsystem_printf(str, ...) printf(str, ##__VA_ARGS__)
103  #define Subsystem_vprintf(str, args) vprintf(str, args)
104  #define Subsystem_PrintChar(c) printf("%c", c)
105  #define Subsystem_RegisterReceiver(r)
106 #endif
107 
109 #define SYSTEM_VERSION 0x04000000u
110 
111 #ifndef RECEIVE_MAX_LENGTH
112 #define RECEIVE_MAX_LENGTH 64
113 #endif
114 #define RECEIVE_START_CHAR '$'
115 #ifndef RECEIVE_STOP_CHAR
116 #define RECEIVE_STOP_CHAR '\r'
117 #endif
118 #ifndef RECEIVE_MAX_ARGC
119 #define RECEIVE_MAX_ARGC 8
120 #endif
121 
201 #define GetLogTimestamp() TimeNow()
202 
203 // use Push_printf to log messages to the log buffer LOG_BUF
222 void LogStr(char * str, ...);
223 
244 // TODO: Update documentation
245 void Subsystem_Write(uint8_t subsystem_id, enum log_level level, char * str, ...);
246 
261 uint8_t Subsystem_Init(char * name, version_t version, void (*callback)(int argc, char *argv[]));
262 
277 void Subsystem_RegisterCallback(uint8_t subsystem_id, void (*callback)(int argc, char *argv[]));
278 
286 char *Subsystem_GetName(uint8_t subsystem_id);
287 
289 void Log_EchoOn(void);
290 
292 void Log_EchoOff(void);
293 
298 uint8_t Log_GetEcho(void);
299 
300 void Log_Version(uint8_t subys_id);
301 
302 void Log_Header(uint8_t subsystem_id, enum log_level level);
303 
307 void Log_MuteAll(void);
308 
312 void Log_UnmuteAll(void);
313 
317 void Log_MuteSys(uint8_t sys_id);
318 
322 void Log_UnmuteSys(uint8_t sys_id);
323 
324 void Log_SetLevel(uint8_t sys_id, enum log_level level);
325 
326 uint16_t ArgToU16(char* arg);
327 uint8_t ArgToU8(char* arg);
328 uint32_t ArgToU32(char* arg);
329 
333 void Subsystem_SystemDisable(void);
334 
340 void Subsystem_SystemEnable(void);
341 
343 #endif /* _SUBSYS_H_ */
log_level
Definition: subsystem.h:46
uint8_t Subsystem_Init(char *name, version_t version, void(*callback)(int argc, char *argv[]))
Definition: subsystem.c:84
uint8_t Log_GetEcho(void)
Definition: subsystem.c:320
Definition: subsystem.h:49
void Subsystem_Write(uint8_t subsystem_id, enum log_level level, char *str,...)
Definition: subsystem.c:205
const firmware_version_t version
Definition: cloud.c:163
void Log_SetLevel(uint8_t sys_id, enum log_level level)
Definition: subsystem.c:325
version union
Definition: library.h:148
uint32_t ArgToU32(char *arg)
Definition: subsystem.c:282
void Log_EchoOff(void)
Definition: subsystem.c:316
void Subsystem_RegisterCallback(uint8_t subsystem_id, void(*callback)(int argc, char *argv[]))
Definition: subsystem.c:99
void Log_MuteSys(uint8_t sys_id)
Definition: subsystem.c:337
uint8_t ArgToU8(char *arg)
Definition: subsystem.c:302
Definition: subsystem.h:51
Definition: subsystem.h:47
void Log_UnmuteAll(void)
Definition: subsystem.c:333
void LogStr(char *str,...)
Definition: subsystem.c:194
void Subsystem_SystemDisable(void)
Definition: subsystem.c:76
char * Subsystem_GetName(uint8_t subsystem_id)
Definition: subsystem.c:54
void(* callback)(struct spi_transaction *)
callback function
Definition: spi.h:57
void Log_EchoOn(void)
Definition: subsystem.c:312
uint16_t ArgToU16(char *arg)
Definition: subsystem.c:292
void Subsystem_SystemEnable(void)
Definition: subsystem.c:80
Definition: subsystem.h:50
void Log_Version(uint8_t subys_id)
Definition: subsystem.h:48
void Log_MuteAll(void)
Definition: subsystem.c:329
void Log_UnmuteSys(uint8_t sys_id)
Definition: subsystem.c:341
void Log_Header(uint8_t subsystem_id, enum log_level level)
Definition: subsystem.c:231