Skip to content

Commit

Permalink
Linux: Use config file for gateway settings (#1061)
Browse files Browse the repository at this point in the history
- The following settings can be use on the config file:
  - verbose=[debug,info,notice,warn,err] - Logging verbosity.
  - log_file[0|1] - Enable logging to a file.
  - log_filepath=(FILE) - Log file path.
  - log_pipe=[0|1] - Enable logging to a named pipe(aka fifo).
    Use this option to view your gateway's log messages from the
    log_pipe_file (defined below).
    To do so, run the following command on another terminal:
    - $ cat "log_pipe_file"
  - log_pipe_file=(FILE)
  - syslog=[0|1] - Enable logging to syslog.
  - eeprom_file=[/etc/mysensors.eeprom]
  - eeprom_size=[1024]
- Change some mysgw parameters:
  - Added:
    - -q, --quiet:  for quiet mode, disable log messages written to the
    terminal.
  - Removed:
    - -d, --debug: removed, log messages are now enabled by default.
  - Replaced:
    - -b, --background: replaced by --daemon
- isatty() is no longer used, log messages by default are printed to
  stderr unless the gateway is started with --quiet (#1022)
- MY_LINUX_CONFIG_FILE: no longer holds the path to the eeprom file,
  but to the configuration file
  • Loading branch information
marceloaqno authored and mfalkvidd committed Mar 23, 2018
1 parent 06f8d2b commit 2175c99
Show file tree
Hide file tree
Showing 14 changed files with 635 additions and 130 deletions.
2 changes: 1 addition & 1 deletion MyConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -1873,7 +1873,7 @@
* @note For now the configuration file is only used to store the emulated eeprom state.
*/
#ifndef MY_LINUX_CONFIG_FILE
#define MY_LINUX_CONFIG_FILE "/etc/mysensors.dat"
#define MY_LINUX_CONFIG_FILE "/etc/mysensors.conf"
#endif
/** @}*/ // End of LinuxSettingGrpPub group
/** @}*/ // End of PlatformSettingGrpPub group
Expand Down
2 changes: 1 addition & 1 deletion configure
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Installation options:
MySensors options:
--my-debug=[enable|disable] Enables or disables MySensors core debugging. [enable]
--my-config-file=<FILE> Config file path. [/etc/mysensors.dat]
--my-config-file=<FILE> Config file path. [/etc/mysensors.conf]
--my-gateway=[none|ethernet|serial|mqtt]
Set the protocol used to communicate with the controller. [ethernet]
--my-node-id=<ID> Disable gateway feature and run as a node with the specified id.
Expand Down
66 changes: 43 additions & 23 deletions drivers/Linux/SoftEeprom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2017 Sensnology AB
* Copyright (C) 2013-2018 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
Expand All @@ -26,14 +26,36 @@
#include "log.h"
#include "SoftEeprom.h"

SoftEeprom::SoftEeprom(const char *fileName, size_t length)
SoftEeprom::SoftEeprom() : _length(0), _fileName(NULL), _values(NULL)
{
}

SoftEeprom::SoftEeprom(const SoftEeprom& other)
{
_fileName = strdup(other._fileName);

_length = other._length;
_values = new uint8_t[_length];
for (size_t i = 0; i < _length; ++i) {
_values[i] = other._values[i];
}
}

SoftEeprom::~SoftEeprom()
{
destroy();
}

int SoftEeprom::init(const char *fileName, size_t length)
{
struct stat fileInfo;

destroy();

_fileName = strdup(fileName);
if (_fileName == NULL) {
logError("Error: %s\n", strerror(errno));
exit(1);
return -1;
}

_length = length;
Expand All @@ -44,53 +66,48 @@ SoftEeprom::SoftEeprom(const char *fileName, size_t length)

if (stat(_fileName, &fileInfo) != 0) {
//File does not exist. Create it.
logInfo("Config file %s does not exist, creating new config file.\n", _fileName);
logInfo("EEPROM file %s does not exist, creating new file.\n", _fileName);
std::ofstream myFile(_fileName, std::ios::out | std::ios::binary);
if (!myFile) {
logError("Unable to create config file %s.\n", _fileName);
exit(1);
return -1;
}
myFile.write((const char*)_values, _length);
myFile.close();
} else if (fileInfo.st_size < 0 || (size_t)fileInfo.st_size != _length) {
logError("Config file %s is not the correct size of %zu. Please remove the file and a new one will be created.\n",
logError("EEPROM file %s is not the correct size of %zu. Please remove the file and a new one will be created.\n",
_fileName, _length);
exit(1);
return -1;
} else {
//Read config into local memory.
std::ifstream myFile(_fileName, std::ios::in | std::ios::binary);
if (!myFile) {
logError("Unable to open config to file %s for reading.\n", _fileName);
exit(1);
logError("Unable to open EEPROM file %s for reading.\n", _fileName);
return -1;
}
myFile.read((char*)_values, _length);
myFile.close();
}
}

SoftEeprom::SoftEeprom(const SoftEeprom& other)
{
_fileName = strdup(other._fileName);

_length = other._length;
_values = new uint8_t[_length];
for (size_t i = 0; i < _length; ++i) {
_values[i] = other._values[i];
}
return 0;
}

SoftEeprom::~SoftEeprom()
void SoftEeprom::destroy()
{
delete[] _values;
free(_fileName);
if (_values) {
delete[] _values;
}
if (_fileName) {
free(_fileName);
}
}

void SoftEeprom::readBlock(void* buf, void* addr, size_t length)
{
static bool config_to_mem = false;
unsigned long int offs = reinterpret_cast<unsigned long int>(addr);

if (!config_to_mem) {
if (!config_to_mem && length) {
//Read config into local memory.
std::ifstream myFile(_fileName, std::ios::in | std::ios::binary);
if (!myFile) {
Expand Down Expand Up @@ -144,6 +161,9 @@ void SoftEeprom::writeByte(int addr, uint8_t value)
SoftEeprom& SoftEeprom::operator=(const SoftEeprom& other)
{
if (this != &other) {
delete[] _values;
free(_fileName);

_fileName = strdup(other._fileName);

_length = other._length;
Expand Down
17 changes: 15 additions & 2 deletions drivers/Linux/SoftEeprom.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2017 Sensnology AB
* Copyright (C) 2013-2018 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
Expand Down Expand Up @@ -37,7 +37,7 @@ class SoftEeprom
/**
* @brief SoftEeprom constructor.
*/
SoftEeprom(const char *fileName, size_t length);
SoftEeprom();
/**
* @brief SoftEeprom copy constructor.
*/
Expand All @@ -46,6 +46,19 @@ class SoftEeprom
* @brief SoftEeprom destructor.
*/
~SoftEeprom();
/**
* @brief Initializes the eeprom class.
*
* @param fileName filepath where the data is saved.
* @param length eeprom size in bytes.
* @return 0 if SUCCESS or -1 if FAILURE.
*/
int init(const char *fileName, size_t length);
/**
* @brief Clear all allocated memory variables.
*
*/
void destroy();
/**
* @brief Read a block of bytes from eeprom.
*
Expand Down
Loading

0 comments on commit 2175c99

Please sign in to comment.