renderbug/src/Sequencer.cpp

128 lines
2.7 KiB
C++
Raw Normal View History

2021-03-28 01:19:55 +00:00
#include "Sequencer.h"
2021-03-29 08:10:55 +00:00
#include <MainLoop.h>
#include "Static.h"
2021-03-28 01:19:55 +00:00
Sequencer::Sequencer() :
2021-03-28 01:19:55 +00:00
Task("SceneSequencer"),
m_idx(0)
{
state = Task::Running;
}
void
Sequencer::Scene::start()
{
for(const char* pattern : patterns) {
Log.verbose("Starting pattern task %s", pattern);
MainLoop::instance()->dispatch(InputEvent{InputEvent::StartThing, pattern});
}
}
void
Sequencer::Scene::stop()
2021-03-28 01:19:55 +00:00
{
for(const char* pattern : patterns) {
Log.verbose("Stopping pattern task %s", pattern);
MainLoop::instance()->dispatch(InputEvent{InputEvent::StopThing, pattern});
}
2021-03-28 01:19:55 +00:00
}
void
Sequencer::loop() {}
const char*
Sequencer::currentSceneName()
{
return m_scenes[m_idx].name;
}
const std::vector<Sequencer::Scene>
Sequencer::scenes() const
{
return m_scenes;
}
void
Sequencer::onStart()
{
}
void
Sequencer::setScenes(std::vector<Scene> &&scenes)
{
m_idx = 0;
m_scenes = scenes;
}
2021-03-28 01:19:55 +00:00
void
Sequencer::handleEvent(const InputEvent& evt)
{
if (evt.intent == InputEvent::ReadyToRoll && !m_scenes.empty()) {
Log.notice("Starting pattern %s!", m_scenes[m_idx].name);
for(const char* pattern : m_scenes[m_idx].patterns) {
Log.verbose("Starting pattern task %s", pattern);
MainLoop::instance()->dispatch(InputEvent{InputEvent::StartThing, pattern});
}
} else if (evt.intent == InputEvent::SetPattern && evt.asString() == m_scenes[m_idx].name) {
2021-04-10 18:10:25 +00:00
return;
} else if (evt.intent == InputEvent::SetPattern || evt.intent == InputEvent::NextPattern || evt.intent == InputEvent::PreviousPattern) {
2021-03-29 08:10:55 +00:00
Log.notice("Switching pattern!");
m_scenes[m_idx].stop();
2021-03-28 01:19:55 +00:00
if (evt.intent == InputEvent::NextPattern) {
m_idx++;
} else if (evt.intent == InputEvent::PreviousPattern) {
m_idx--;
} else {
2021-03-28 21:50:31 +00:00
for(m_idx = 0; m_idx < m_scenes.size(); m_idx++) {
if (!strcmp(evt.asString(), m_scenes[m_idx].name)) {
break;
}
}
2021-03-28 01:19:55 +00:00
}
if (m_idx < 0) {
m_idx = m_scenes.size() - 1;
}
if (m_idx >= m_scenes.size()) {
m_idx = 0;
}
m_scenes[m_idx].start();
2021-03-28 01:19:55 +00:00
}
}
void
doScenes(Args& args, Print& out)
{
out.println("Available scenes: ");
for (auto scene : Static<Sequencer>::instance()->scenes()) {
out.println(scene.name);
}
}
static String s;
void
doScene(Args& args, Print& out)
{
s = args[1];
MainLoop::instance()->dispatch(InputEvent{InputEvent::SetPattern, s.c_str()});
}
const std::vector<Command> _commands = {
{"scene", doScene},
{"scenes", doScenes}
};
const std::vector<Command>&
Sequencer::commands() const
{
return _commands;
}
STATIC_ALLOC(Sequencer);
STATIC_TASK(Sequencer);