added more comments

sipo
Ondřej Hruška 7 years ago
parent 334a89f055
commit b2ead539bf
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 54
      framework/rsc_enum.h
  2. 6
      framework/settings.c
  3. 2
      framework/settings.h
  4. 6
      framework/system_settings.h
  5. 19
      framework/unit.h
  6. 3
      framework/unit_base.h
  7. 17
      framework/unit_registry.c
  8. 5
      framework/unit_registry.h

@ -1,6 +1,8 @@
// //
// Created by MightyPork on 2018/01/06. // Created by MightyPork on 2018/01/06.
// //
// Enum of all defined resources
//
#ifndef GEX_F072_RSC_ENUM_H #ifndef GEX_F072_RSC_ENUM_H
#define GEX_F072_RSC_ENUM_H #define GEX_F072_RSC_ENUM_H
@ -31,6 +33,7 @@
// X(HDMI_CEC) // X(HDMI_CEC)
// X(COMP1) X(COMP2) X(COMP3) X(COMP4) X(COMP5) X(COMP6) X(COMP7) // X(COMP1) X(COMP2) X(COMP3) X(COMP4) X(COMP5) X(COMP6) X(COMP7)
// GPIO resources have names generated dynamically to save ROM
#define XX_RESOURCES_GPIO \ #define XX_RESOURCES_GPIO \
X(PA0) X(PA1) X(PA2) X(PA3) X(PA4) X(PA5) X(PA6) X(PA7) \ X(PA0) X(PA1) X(PA2) X(PA3) X(PA4) X(PA5) X(PA6) X(PA7) \
X(PA8) X(PA9) X(PA10) X(PA11) X(PA12) X(PA13) X(PA14) X(PA15) \ X(PA8) X(PA9) X(PA10) X(PA11) X(PA12) X(PA13) X(PA14) X(PA15) \
@ -45,13 +48,15 @@
X(PF0) X(PF1) X(PF2) X(PF3) X(PF4) X(PF5) X(PF6) X(PF7) \ X(PF0) X(PF1) X(PF2) X(PF3) X(PF4) X(PF5) X(PF6) X(PF7) \
X(PF8) X(PF9) X(PF10) X(PF11) X(PF12) X(PF13) X(PF14) X(PF15) \ X(PF8) X(PF9) X(PF10) X(PF11) X(PF12) X(PF13) X(PF14) X(PF15) \
// EXTI resources have names generated dynamically to save ROM
#define XX_RESOURCES_EXTI \ #define XX_RESOURCES_EXTI \
X(EXTI0) X(EXTI1) X(EXTI2) X(EXTI3) X(EXTI4) X(EXTI5) X(EXTI6) X(EXTI7) \ X(EXTI0) X(EXTI1) X(EXTI2) X(EXTI3) X(EXTI4) X(EXTI5) X(EXTI6) X(EXTI7) \
X(EXTI8) X(EXTI9) X(EXTI10) X(EXTI11) X(EXTI12) X(EXTI13) X(EXTI14) X(EXTI15) X(EXTI8) X(EXTI9) X(EXTI10) X(EXTI11) X(EXTI12) X(EXTI13) X(EXTI14) X(EXTI15)
/** Resource typedef for cleaner code */
typedef enum hw_resource Resource; typedef enum hw_resource Resource;
/** Enum of all resources */
enum hw_resource { enum hw_resource {
#define X(res_name) R_##res_name, #define X(res_name) R_##res_name,
XX_RESOURCES XX_RESOURCES
@ -62,35 +67,62 @@ enum hw_resource {
RESOURCE_COUNT = R_NONE, RESOURCE_COUNT = R_NONE,
}; };
/** Length of the resource map */
#define RSCMAP_LEN ((RESOURCE_COUNT/8)+1) #define RSCMAP_LEN ((RESOURCE_COUNT/8)+1)
/**
* Resource map is a bitfield byte array located in all component instances.
* Each bit corresponds to one resource claimed by the unit.
*/
typedef uint8_t ResourceMap[RSCMAP_LEN]; typedef uint8_t ResourceMap[RSCMAP_LEN];
static inline bool rscmap_is_free(ResourceMap *rscmap, Resource rsc) /**
* Check if a resource is free
*
* @param rscmap - resource map to look into
* @param rsc - tested resource
* @return is free
*/
static inline bool rscmap_is_free(const ResourceMap *rscmap, Resource rsc)
{ {
return (0 == ((*rscmap)[((rsc)>>3)&0xFF] & (1<<((rsc)&0x7)))); return (0 == ((*rscmap)[(rsc >> 3) & 0xFF] & (1 << (rsc & 0x7))));
} }
static inline bool rscmap_is_held(ResourceMap *rscmap, Resource rsc) /**
* Check if a resource is held
*
* @param rscmap - resource map to look into
* @param rsc - tested resource
* @return is not free
*/
static inline bool rscmap_is_held(const ResourceMap *rscmap, Resource rsc)
{ {
return !rscmap_is_free(rscmap, rsc); return !rscmap_is_free(rscmap, rsc);
} }
/**
* Claim a resource in a resource map
*
* @param rscmap - resource map to modify
* @param rsc - resource to claim
*/
static inline void rscmap_claim(ResourceMap *rscmap, Resource rsc) static inline void rscmap_claim(ResourceMap *rscmap, Resource rsc)
{ {
(*rscmap)[((rsc)>>3)&0xFF] |= (1<<((rsc)&0x7)); (*rscmap)[(rsc >> 3) & 0xFF] |= (1 << (rsc & 0x7));
} }
/**
* Release a resource in a resource map
*
* @param rscmap - resource map to modify
* @param rsc - resource to release
*/
static inline void rscmap_free(ResourceMap *rscmap, Resource rsc) static inline void rscmap_free(ResourceMap *rscmap, Resource rsc)
{ {
(*rscmap)[((rsc)>>3)&0xFF] &= ~(1<<((rsc)&0x7)); (*rscmap)[(rsc >> 3) & 0xFF] &= ~(1 << (rsc & 0x7));
} }
//#define RSC_IS_FREE(rscmap, rsc) (0 == (rscmap[((rsc)>>3)&0xFF] & (1<<((rsc)&0x7)))) // helper macros
//#define RSC_IS_HELD(rscmap, rsc) (!RSC_IS_FREE(rscmap, rsc))
//#define RSC_CLAIM(rscmap, rsc) do { rscmap[((rsc)>>3)&0xFF] |= (1<<((rsc)&0x7)); } while(0)
//#define RSC_FREE(rscmap, rsc) do { rscmap[((rsc)>>3)&0xFF] &= ~(1<<((rsc)&0x7)); } while(0)
#define RSC_IS_FREE(rscmap, rsc) rscmap_is_free(&rscmap, (rsc)) #define RSC_IS_FREE(rscmap, rsc) rscmap_is_free(&rscmap, (rsc))
#define RSC_IS_HELD(rscmap, rsc) rscmap_is_held(&rscmap, (rsc)) #define RSC_IS_HELD(rscmap, rsc) rscmap_is_held(&rscmap, (rsc))
#define RSC_CLAIM(rscmap, rsc) rscmap_claim(&rscmap, (rsc)) #define RSC_CLAIM(rscmap, rsc) rscmap_claim(&rscmap, (rsc))

@ -83,7 +83,7 @@ static bool savebuf_ovhandler(PayloadBuilder *pb, uint32_t more)
return true; return true;
} }
/** Save settings to flash */ // Save settings to flash
void settings_save(void) void settings_save(void)
{ {
HAL_StatusTypeDef hst; HAL_StatusTypeDef hst;
@ -222,6 +222,7 @@ static void savebuf_flush(PayloadBuilder *pb, bool final)
// --------------------------------------------------------------- // ---------------------------------------------------------------
/** Generate a file header */
static void gex_file_preamble(IniWriter *iw, const char *filename) static void gex_file_preamble(IniWriter *iw, const char *filename)
{ {
// File header // File header
@ -231,6 +232,7 @@ static void gex_file_preamble(IniWriter *iw, const char *filename)
iw_cmt_newline(iw); iw_cmt_newline(iw);
} }
/** Generate a config file header (write instructions) */
static void ini_preamble(IniWriter *iw, const char *filename) static void ini_preamble(IniWriter *iw, const char *filename)
{ {
gex_file_preamble(iw, filename); gex_file_preamble(iw, filename);
@ -296,6 +298,7 @@ void settings_load_ini_begin(void)
SystemSettings.loading_inifile = 0; SystemSettings.loading_inifile = 0;
} }
void settings_load_ini_key(const char *restrict section, const char *restrict key, const char *restrict value) void settings_load_ini_key(const char *restrict section, const char *restrict key, const char *restrict value)
{ {
// dbg("[%s] %s = %s", section, key, value); // dbg("[%s] %s = %s", section, key, value);
@ -344,6 +347,7 @@ void settings_load_ini_key(const char *restrict section, const char *restrict ke
} }
} }
void settings_load_ini_end(void) void settings_load_ini_end(void)
{ {
if (SystemSettings.loading_inifile == 'U') { if (SystemSettings.loading_inifile == 'U') {

@ -1,6 +1,8 @@
// //
// Created by MightyPork on 2017/11/26. // Created by MightyPork on 2017/11/26.
// //
// This module manages the INI and binary settings storage.
//
#ifndef GEX_SETTINGS_H #ifndef GEX_SETTINGS_H
#define GEX_SETTINGS_H #define GEX_SETTINGS_H

@ -1,6 +1,8 @@
// //
// Created by MightyPork on 2017/12/02. // Created by MightyPork on 2017/12/02.
// //
// SYSTEM.INI system settings
//
#ifndef GEX_SYSTEM_SETTINGS_H #ifndef GEX_SYSTEM_SETTINGS_H
#define GEX_SYSTEM_SETTINGS_H #define GEX_SYSTEM_SETTINGS_H
@ -10,6 +12,9 @@
#include "utils/payload_parser.h" #include "utils/payload_parser.h"
#include "utils/payload_builder.h" #include "utils/payload_builder.h"
/**
* Struct of the global system settings storage
*/
struct system_settings { struct system_settings {
bool visible_vcom; bool visible_vcom;
bool ini_comments; bool ini_comments;
@ -20,6 +25,7 @@ struct system_settings {
volatile char loading_inifile; // S-system, U-units volatile char loading_inifile; // S-system, U-units
}; };
/** Global system settings storage */
extern struct system_settings SystemSettings; extern struct system_settings SystemSettings;
/** /**

@ -1,6 +1,8 @@
// //
// Created by MightyPork on 2017/11/24. // Created by MightyPork on 2017/11/24.
// //
// Structures and basic scaffolding for defining unit drivers
//
#ifndef GEX_UNIT_H #ifndef GEX_UNIT_H
#define GEX_UNIT_H #define GEX_UNIT_H
@ -12,18 +14,27 @@
#include "utils/payload_parser.h" #include "utils/payload_parser.h"
#include "rsc_enum.h" #include "rsc_enum.h"
/** Helper macro that returns E_BAD_UNIT_TYPE if unit is not of the given type */
#define CHECK_TYPE(_unit, _driver) do { \ #define CHECK_TYPE(_unit, _driver) do { \
if ((_unit->driver) != (_driver)) \ if (((_unit)->driver) != (_driver)) \
return E_BAD_UNIT_TYPE; \ return E_BAD_UNIT_TYPE; \
} while (0) } while (0)
/** Shared unit scratch buffer */
extern char unit_tmp512[UNIT_TMP_LEN]; // temporary static buffer - not expected to be accessed asynchronously extern char unit_tmp512[UNIT_TMP_LEN]; // temporary static buffer - not expected to be accessed asynchronously
// TODO add mutex? // TODO add mutex?
/** Unit typedef - a instance */
typedef struct unit Unit; typedef struct unit Unit;
/** Unit driver typedef - type handlers / props object */
typedef struct unit_driver UnitDriver; typedef struct unit_driver UnitDriver;
/**
* Unit instance structure
*/
struct unit { struct unit {
/** Reference to the used driver */
const UnitDriver *driver; const UnitDriver *driver;
/** Unit name (used in error messages) */ /** Unit name (used in error messages) */
@ -46,7 +57,10 @@ struct unit {
/** Bit-map of held resources */ /** Bit-map of held resources */
ResourceMap resources; ResourceMap resources;
/** Tick interval to run the updateTick() function, if defined */
uint16_t tick_interval; uint16_t tick_interval;
/** Current number of ticks since last interval completion */
uint16_t _tick_cnt; uint16_t _tick_cnt;
}; };
@ -125,8 +139,7 @@ struct unit_driver {
/** /**
* De-init a partially initialized unit (before 'init' succeeds) * De-init a partially initialized unit (before 'init' succeeds)
* This releases all held resources and frees the *data, * This releases all held resources and frees *data and *name.
* if it looks like it has been dynamically allocated.
* *
* Does NOT free the unit struct itself * Does NOT free the unit struct itself
* *

@ -1,6 +1,9 @@
// //
// Created by MightyPork on 2017/12/09. // Created by MightyPork on 2017/12/09.
// //
// This is a common include file used in unit drivers to avoid repeating all the
// needed includes everywhere.
//
#include "platform.h" #include "platform.h"
#include "unit.h" #include "unit.h"

@ -40,6 +40,7 @@ static int32_t unit_count = -1;
// --- // ---
void ureg_add_type(const UnitDriver *driver) void ureg_add_type(const UnitDriver *driver)
{ {
bool suc = true; bool suc = true;
@ -72,6 +73,7 @@ void ureg_add_type(const UnitDriver *driver)
ureg_tail = re; ureg_tail = re;
} }
/** Free unit in a list entry (do not free the list entry itself!) */ /** Free unit in a list entry (do not free the list entry itself!) */
static void free_le_unit(UlistEntry *le) static void free_le_unit(UlistEntry *le)
{ {
@ -84,6 +86,7 @@ static void free_le_unit(UlistEntry *le)
free_ck(pUnit->name); free_ck(pUnit->name);
} }
/** Add unit to the list, updating references as needed */ /** Add unit to the list, updating references as needed */
static void add_unit_to_list(UlistEntry *le) static void add_unit_to_list(UlistEntry *le)
{ {
@ -96,6 +99,7 @@ static void add_unit_to_list(UlistEntry *le)
ulist_tail = le; ulist_tail = le;
} }
// create a unit instance (not yet loading or initing - just pre-init) // create a unit instance (not yet loading or initing - just pre-init)
Unit *ureg_instantiate(const char *driver_name) Unit *ureg_instantiate(const char *driver_name)
{ {
@ -141,6 +145,7 @@ Unit *ureg_instantiate(const char *driver_name)
return NULL; return NULL;
} }
void ureg_save_units(PayloadBuilder *pb) void ureg_save_units(PayloadBuilder *pb)
{ {
assert_param(pb->ok); assert_param(pb->ok);
@ -171,6 +176,7 @@ void ureg_save_units(PayloadBuilder *pb)
} // end units list } // end units list
} }
bool ureg_load_units(PayloadParser *pp) bool ureg_load_units(PayloadParser *pp)
{ {
bool suc; bool suc;
@ -251,6 +257,7 @@ void ureg_remove_all_units(void)
unit_count = -1; unit_count = -1;
} }
/** Create unit instances from the [UNITS] overview section */ /** Create unit instances from the [UNITS] overview section */
bool ureg_instantiate_by_ini(const char *restrict driver_name, const char *restrict names) bool ureg_instantiate_by_ini(const char *restrict driver_name, const char *restrict names)
{ {
@ -297,6 +304,7 @@ bool ureg_instantiate_by_ini(const char *restrict driver_name, const char *restr
return false; return false;
} }
/** Load unit key-value */ /** Load unit key-value */
error_t ureg_load_unit_ini_key(const char *restrict name, error_t ureg_load_unit_ini_key(const char *restrict name,
const char *restrict key, const char *restrict key,
@ -316,6 +324,7 @@ error_t ureg_load_unit_ini_key(const char *restrict name,
return E_NO_SUCH_UNIT; return E_NO_SUCH_UNIT;
} }
/** Finalize units init. Returns true if all inited OK. */ /** Finalize units init. Returns true if all inited OK. */
bool ureg_finalize_all_init(void) bool ureg_finalize_all_init(void)
{ {
@ -353,6 +362,7 @@ bool ureg_finalize_all_init(void)
return suc; return suc;
} }
/** helper foir ureg_build_ini() */
static void export_unit_do(UlistEntry *li, IniWriter *iw) static void export_unit_do(UlistEntry *li, IniWriter *iw)
{ {
Unit *const pUnit = &li->unit; Unit *const pUnit = &li->unit;
@ -379,6 +389,7 @@ static void export_unit_do(UlistEntry *li, IniWriter *iw)
pUnit->driver->cfgWriteIni(pUnit, iw); pUnit->driver->cfgWriteIni(pUnit, iw);
} }
// unit to INI // unit to INI
void ureg_build_ini(IniWriter *iw) void ureg_build_ini(IniWriter *iw)
{ {
@ -433,6 +444,7 @@ void ureg_build_ini(IniWriter *iw)
} }
} }
// count units // count units
uint32_t ureg_get_num_units(void) uint32_t ureg_get_num_units(void)
{ {
@ -450,6 +462,7 @@ uint32_t ureg_get_num_units(void)
return (uint32_t) unit_count; return (uint32_t) unit_count;
} }
extern osMutexId mutScratchBufferHandle; extern osMutexId mutScratchBufferHandle;
/** Deliver message to it's destination unit */ /** Deliver message to it's destination unit */
@ -497,6 +510,7 @@ void ureg_deliver_unit_request(TF_Msg *msg)
assert_param(osOK == osMutexRelease(mutScratchBufferHandle)); assert_param(osOK == osMutexRelease(mutScratchBufferHandle));
} }
/** Send a response for a unit-list request */ /** Send a response for a unit-list request */
void ureg_report_active_units(TF_ID frame_id) void ureg_report_active_units(TF_ID frame_id)
{ {
@ -542,6 +556,7 @@ void ureg_report_active_units(TF_ID frame_id)
free_ck(buff); free_ck(buff);
} }
Unit *ureg_get_rsc_owner(Resource resource) Unit *ureg_get_rsc_owner(Resource resource)
{ {
UlistEntry *li = ulist_head; UlistEntry *li = ulist_head;
@ -558,6 +573,7 @@ Unit *ureg_get_rsc_owner(Resource resource)
return NULL; return NULL;
} }
void ureg_print_unit_resources(IniWriter *iw) void ureg_print_unit_resources(IniWriter *iw)
{ {
if (iw->count == 0) return; if (iw->count == 0) return;
@ -584,6 +600,7 @@ void ureg_print_unit_resources(IniWriter *iw)
iw_newline(iw); iw_newline(iw);
} }
void ureg_tick_units(void) void ureg_tick_units(void)
{ {
UlistEntry *li = ulist_head; UlistEntry *li = ulist_head;

@ -1,12 +1,15 @@
// //
// Created by MightyPork on 2017/11/26. // Created by MightyPork on 2017/11/26.
// //
// Unit registry. This is a storage for dynamically allocated user units,
// handling units init, deinit and message passing.
//
#ifndef GEX_UNIT_REGISTRY_H #ifndef GEX_UNIT_REGISTRY_H
#define GEX_UNIT_REGISTRY_H #define GEX_UNIT_REGISTRY_H
#include <TinyFrame/TinyFrame.h>
#include "platform.h" #include "platform.h"
#include <TinyFrame/TinyFrame.h>
#include "unit.h" #include "unit.h"
/** /**

Loading…
Cancel
Save