#include <signal.h>
#include <iostream>
#include <thread>
#include <sstream>
#include <map>
#include "../include/Gobbledegook.h"
static const int kMaxAsyncInitTimeoutMS = 30 * 1000;
static std::map<std::string,int> temperatures;
enum LogLevel
{
Debug,
Verbose,
Normal,
ErrorsOnly
};
LogLevel logLevel = Normal;
void LogDebug(const char *pText) { if (logLevel <= Debug) { std::cout << " DEBUG: " << pText << std::endl; } }
void LogInfo(const char *pText) { if (logLevel <= Verbose) { std::cout << " INFO: " << pText << std::endl; } }
void LogStatus(const char *pText) { if (logLevel <= Normal) { std::cout << " STATUS: " << pText << std::endl; } }
void LogWarn(const char *pText) { std::cout << "WARNING: " << pText << std::endl; }
void LogError(const char *pText) { std::cout << "!!ERROR: " << pText << std::endl; }
void LogFatal(const char *pText) { std::cout << "**FATAL: " << pText << std::endl; }
void LogAlways(const char *pText) { std::cout << "..Log..: " << pText << std::endl; }
void LogTrace(const char *pText) { std::cout << "-Trace-: " << pText << std::endl; }
void signalHandler(int signum)
{
switch (signum)
{
case SIGINT:
LogStatus("SIGINT recieved, shutting down");
ggkTriggerShutdown();
break;
case SIGTERM:
LogStatus("SIGTERM recieved, shutting down");
ggkTriggerShutdown();
break;
}
}
const void *dataGetter(const char *pName)
{
if (nullptr == pName)
{
LogError("NULL name sent to server data getter");
return nullptr;
}
std::string strName = pName;
auto it = temperatures.find(strName);
if (it != temperatures.end()) return &(*it);
return nullptr;
}
int dataSetter(const char *pName, const void *pData)
{
if (nullptr == pName)
{
LogError("NULL name sent to server data setter");
return 0;
}
if (nullptr == pData)
{
LogError("NULL pData sent to server data setter");
return 0;
}
std::string strName = pName;
int16_t temp = *static_cast<const int16_t *>(pData);
temperatures[strName]=temp;
LogDebug((std::string("Server data: temperature of ")+strName+" set to " + std::to_string(temp)).c_str());
return 1;
}
int main(int argc, char **ppArgv)
{
for (int i = 1; i < argc; ++i)
{
std::string arg = ppArgv[i];
if (arg == "-q")
{
logLevel = ErrorsOnly;
}
else if (arg == "-v")
{
logLevel = Verbose;
}
else if (arg == "-d")
{
logLevel = Debug;
}
else
{
LogFatal((std::string("Unknown parameter: '") + arg + "'").c_str());
LogFatal("");
LogFatal("Usage: standalone [-q | -v | -d]");
return -1;
}
}
signal(SIGINT, signalHandler);
signal(SIGTERM, signalHandler);
ggkLogRegisterDebug(LogDebug);
ggkLogRegisterInfo(LogInfo);
ggkLogRegisterStatus(LogStatus);
ggkLogRegisterWarn(LogWarn);
ggkLogRegisterError(LogError);
ggkLogRegisterFatal(LogFatal);
ggkLogRegisterAlways(LogAlways);
ggkLogRegisterTrace(LogTrace);
if (!ggkStart("termostore", "termostore", "thermo", dataGetter, dataSetter, kMaxAsyncInitTimeoutMS))
{
return -1;
}
while (ggkGetServerRunState() < EStopping)
{
std::this_thread::sleep_for(std::chrono::seconds(15));
}
if (!ggkWait())
{
return -1;
}
return ggkGetServerHealth() == EOk ? 0 : 1;
}