Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/ArduinoHomeLibrary.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@
#include "services/irc_service.h"
#include "services/info_service.h"
#include "services/rgb_service.h"
#include "services/light_service.h"
#include "services/relay_service.h"
108 changes: 108 additions & 0 deletions src/services/light_service.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#include <Arduino.h>
#include <ArduinoJson.h>

#include "utils/utils.h"
#include "utils/string_stream.h"
#include "runtime.h"
#include "dispatcher_service.h"
#include "configuration_service.h"
#include "light_service.h"

#define NAME "LightService"

#ifndef PWMRANGE
#define PWMRANGE 255
#endif

namespace ah {
namespace services {

struct LightServiceConfig {
bool state;
uint8_t value;
};

#if PWMRANGE != 255
static inline uint16_t pwmValue(uint8_t value) {
return static_cast<uint32_t>(value) * PWMRANGE / 255;
}
#endif

LightService::LightService(const int &ppin, const char *pid)
: id(pid ? pid : "light"), pin(ppin), config(nullptr) {
utils::StringStream ss(settings);
ss << "pin=" << pin;
}

void LightService::init() {
dispatcher = Runtime::getDispatcherService();
config = Runtime::getConfigurationService()->createItem<LightServiceConfig>();

dispatcher->registerGetter(id, [this](ArduinoJson::JsonVariant &value) {
JsonObject& data = DispatcherService::sharedBuffer().createObject();
data["state"] = config->state;
data["value"] = config->value;

value = data;
return true;
});

dispatcher->registerSetter(id, [this](const ArduinoJson::JsonVariant &value) {
if(!value.is<JsonObject>()) {
return false;
}

JsonObject& data = value.as<JsonObject>();

if(data.containsKey("state")) { config->state = data["state"]; }
if(data.containsKey("value")) { config->value = data["value"]; }

apply();
config->save();

return true;
});
}

void LightService::setup() {
// be sure to enable pwm before use
analogWrite(pin, 1);

config->load();
apply();
}

void LightService::apply() {
AH_DEBUG(id << ": apply state=" << config->state << ", value=" << config->value << endl);

if(config->state) {
#if PWMRANGE != 255
analogWrite(pin, pwmValue(config->value));
#else
analogWrite(pin, config->value);
#endif
} else {
analogWrite(pin, 0);
}

JsonObject& data = DispatcherService::sharedBuffer().createObject();
data["state"] = config->state;
data["value"] = config->value;

dispatcher->notify(id, data);
}

const char *LightService::getName() const {
return NAME;
}

const char *LightService::getId() const {
return id;
}

const char *LightService::getSettings() const {
return settings.c_str();
}

} // namespace services
} // namespace ah
41 changes: 41 additions & 0 deletions src/services/light_service.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#ifndef __ARDUINO_HOME_LIGHT_SERVICE_H__
#define __ARDUINO_HOME_LIGHT_SERVICE_H__

#include "service.h"

namespace ah {
namespace services {

template<typename Data>
class ConfigItem;

struct LightServiceConfig;
struct DispatcherService;

struct LightService : public Service {
explicit LightService(const int &ppin, const char *pid = nullptr);
virtual ~LightService() = default;

virtual void init();
virtual void setup();

virtual const char *getName() const;
virtual const char *getId() const;
virtual const char *getSettings() const;

private:
void apply();

const char *id;

int pin;

DispatcherService *dispatcher;
ConfigItem<LightServiceConfig> *config;
String settings;
};

} // namespace services
} // namespace ah

#endif // __ARDUINO_HOME_LIGHT_SERVICE_H__