add: relay/piface support

This commit is contained in:
Tobias Reisinger 2020-04-14 00:50:55 +02:00
parent fa6ceb2bf4
commit db64e4f820
34 changed files with 1259 additions and 313 deletions

View file

@ -11,7 +11,7 @@
/**
* @brief Information about this controller
*/
typedef struct controller
typedef struct
{
/**
* @brief A unique UUID for this controller
@ -22,7 +22,7 @@ typedef struct controller
*
* Includes a \0 terminator.
*/
char name[CONTROLLER_NAME_LENGTH + 1];
char name[MAX_NAME_LENGTH + 1];
/**
* @brief The command port the controller was bound to
*/
@ -35,22 +35,22 @@ typedef struct controller
* @brief Amount of relays available to this controller
*/
uint8_t relay_count;
relay **relays;
relay_t **relays;
} controller;
} controller_t;
/**
* @brief Key to save controller information in database
*/
typedef enum controller_db_key
typedef enum
{
KEY_META_ID = 0,
KEY_META_NAME = 1,
KEY_META_COMMAND_PORT = 2,
KEY_META_DISCOVERY_PORT = 3,
KEY_META_RELAY_COUNT = 4,
KEY_META_RELAYS = 5,
} controller_db_key;
DB_KEY_CONTROLLER_ID = 0,
DB_KEY_CONTROLLER_NAME = 1,
DB_KEY_CONTROLLER_COMMAND_PORT = 2,
DB_KEY_CONTROLLER_DISCOVERY_PORT = 3,
DB_KEY_CONTROLLER_RELAY_COUNT = 4,
DB_KEY_CONTROLLER_RELAYS = 5,
} db_key_controller_e;
/**
* @brief Create a new instance of controller
@ -59,7 +59,7 @@ typedef enum controller_db_key
*
* @return A new instance of #controller
*/
controller*
controller_t*
controller_create(void);
@ -72,20 +72,32 @@ controller_create(void);
*
* @return A loaded or new instance of controller or NULL on database error
*/
controller*
controller_t*
controller_load(MDB_env *mdb_env);
/**
* @brief Save a controller to the database
*
* @param cntrlr Instance of a controller
* @param controller Instance of a controller
* @param mdb_env Already created MDB_env
*
* @return Indicator to show success (0) or failure (!0)
*/
int
controller_save(controller *cntrlr, MDB_env *mdb_env);
controller_save(controller_t *controller, MDB_env *mdb_env);
/**
* @brief Sets a name to a controller.
* This function won't perform any checks (e.g. no NULL checks)
*
* @param controller Set the name to this controller
* @param name Name to be set
*/
void
controller_set_name(controller_t *controller, char *name);
void
controller_free(controller_t *controller);
/**
* @brief Debug an instance of #controller
@ -95,6 +107,6 @@ controller_save(controller *cntrlr, MDB_env *mdb_env);
* @param cntrlr #controller to debug
*/
void
controller_debug(controller *cntrlr);
controller_debug(controller_t *controller);
#endif //CONTROLLER_CONTROLLER_H

19
include/models/period.h Normal file
View file

@ -0,0 +1,19 @@
#ifndef CONTROLLER_PERIOD_H
#define CONTROLLER_PERIOD_H
#include <stdint.h>
#include <time.h>
typedef struct
{
uint16_t start;
uint16_t end;
} period_t;
period_t*
period_create(uint16_t start, uint16_t end);
int
period_includes_time(period_t *period, uint16_t timestamp);
#endif /* CONTROLLER_PERIOD_H */

View file

@ -2,16 +2,63 @@
#define CONTROLLER_RELAY_H
#include <stdint.h>
#include <time.h>
#include <lmdb.h>
#include <config.h>
#include <models/schedule.h>
typedef struct relay {
uint8_t index;
char name[128];
uint16_t *schedule;
} relay;
typedef struct
{
uint8_t number;
char name[MAX_NAME_LENGTH + 1];
schedule_t *schedule;
} relay_t;
relay*
relay_init(uint8_t index);
/**
* @brief Key to save relay information in database
*/
typedef enum
{
DB_KEY_RELAY_NAME = 0,
DB_KEY_RELAY_SCHEDULE_ID = 1,
DB_KEY_RELAY_SCHEDULE_PERIODS = 2,
} db_key_relay_e;
relay_t*
relay_create(uint8_t number);
void
relay_set_name(relay_t *relay, char *name);
/**
* @brief Load a relay for database or create a new one
*
* @param mdb_env An opened MDB_env to load from
*
* @return A loaded or new instance of relay
*/
relay_t*
relay_load(MDB_env *mdb_env, uint8_t num);
/**
* @brief Save a relay to the database
*
* @param relay Instance of a relay
* @param mdb_env Already created MDB_env
*
* @return Indicator to show success (0) or failure (!0)
*/
int
relay_save(relay_t *relay, MDB_env *mdb_env);
int
relay_is_active(relay_t *relay, time_t timestamp_now);
void
relay_free(relay_t *relay);
void
relay_debug(relay_t *relay);
#endif //CONTROLLER_RELAY_H

28
include/models/schedule.h Normal file
View file

@ -0,0 +1,28 @@
#ifndef CONTROLLER_SCHEDULE_H
#define CONTROLLER_SCHEDULE_H
#include <stdint.h>
#include <uuid/uuid.h>
#include <models/period.h>
typedef struct
{
uuid_t id;
uint16_t length;
period_t **periods;
} schedule_t;
schedule_t*
schedule_create(uuid_t id, uint16_t length, uint16_t *periods_blob);
uint16_t*
schedule_periods_to_blob(schedule_t *schedule);
void
schedule_free(schedule_t *schedule);
void
schedule_debug(schedule_t *schedule);
#endif /* CONTROLLER_SCHEDULE_H */