コード例 #1
0
ファイル: Calaos.cpp プロジェクト: omusico/calaos_base
std::string Calaos::get_new_scenario_id()
{
    int cpt = 0;
    bool found = true;
    list<Scenario *> autosc = ListeRoom::Instance().getAutoScenarios();

    while (found && autosc.size() > 0)
    {
        list<Scenario *>::iterator it = autosc.begin();

        bool found2 = false;
        for (;it != autosc.end() && !found2;it++)
        {
            Scenario *sc = *it;
            if (sc->get_param("auto_scenario") == "scenario_" + Utils::to_string(cpt))
                found2 = true;
        }

        if (found2)
            cpt++;
        else
            found = false;
    }

    string ret = "scenario_" + Utils::to_string(cpt);
    return ret;
}
コード例 #2
0
void TCPConnection::ScenarioCommand(Params &request, ProcessDone_cb callback)
{
    Params result = request;

    if (request["0"] != "scenario")
    {
        cDebugDom("network") << "Wrong command !";

        ProcessDone_signal sig;
        sig.connect(callback);
        sig.emit(result);

        return;
    }

    if (request["1"] == "list")
    {
        cDebugDom("network") << "list";

        list<Scenario *> l = ListeRoom::Instance().getAutoScenarios();
        list<Scenario *>::iterator it = l.begin();

        for (int i = 2;it != l.end();it++, i++)
            result.Add(Utils::to_string(i), (*it)->get_param("id"));
    }
    else if (request["1"] == "get")
    {
        cDebugDom("network") << "get";

        Scenario *sc = dynamic_cast<Scenario *>(ListeRoom::Instance().get_input(request["2"]));
        if (sc && sc->getAutoScenario())
        {
            AutoScenario *a = sc->getAutoScenario();
            int cpt = 3;
            result.Add(Utils::to_string(cpt), "cycle:" + string(a->isCycling()?"true":"false"));
            cpt++;
            result.Add(Utils::to_string(cpt), "enabled:" + string(a->isDisabled()?"false":"true"));
            cpt++;
            if (a->isScheduled())
                result.Add(Utils::to_string(cpt), string("schedule:") + a->getIOPlage()->get_param("id"));
            else
                result.Add(Utils::to_string(cpt), "schedule:false");
            cpt++;
            result.Add(Utils::to_string(cpt), "category:" + a->getCategory());
            cpt++;

            result.Add(Utils::to_string(cpt), "steps_count:" + Utils::to_string(a->getRuleSteps().size()));
            cpt++;

            for (uint i = 0;i < a->getRuleSteps().size();i++)
            {
                result.Add(Utils::to_string(cpt), "step:" + Utils::to_string(a->getStepPause(i)));
                cpt++;
                for (int j = 0;j < a->getStepActionCount(i);j++)
                {
                    ScenarioAction sa = a->getStepAction(i, j);
                    result.Add(Utils::to_string(cpt), sa.io->get_param("id") + ":" + sa.action);
                    cpt++;
                }
            }

            //End step
            result.Add(Utils::to_string(cpt), "step_end");
            cpt++;
            for (int j = 0;j < a->getEndStepActionCount();j++)
            {
                ScenarioAction sa = a->getEndStepAction(j);
                result.Add(Utils::to_string(cpt), sa.io->get_param("id") + ":" + sa.action);
                cpt++;
            }
        }
    }
    else if (request["1"] == "create")
    {
        cDebugDom("network") << "create";

        Params params;
        string room_name;
        Room *room = NULL;
        params.Add("auto_scenario", Calaos::get_new_scenario_id());
        int s = -1;
        Scenario *scenario = NULL;
        for (int i = 2;i < request.size();i++)
        {
            vector<string> tokens;
            split(request[Utils::to_string(i)], tokens, ":", 2);

            if (tokens[0] == "name") params.Add("name", url_decode(tokens[1]));
            else if (tokens[0] == "visible") params.Add("visible", tokens[1]);
            else if (tokens[0] == "room_name") room_name = url_decode(tokens[1]);
            else if (tokens[0] == "room_type") room = ListeRoom::Instance().searchRoomByNameAndType(room_name, url_decode(tokens[1]));
            else if (tokens[0] == "cycle") params.Add("cycle", tokens[1]);
            else if (tokens[0] == "disabled") params.Add("disabled", tokens[1]);
            else if (tokens[0] == "step")
            {
                if (!scenario)
                {
                    params.Add("type", "scenario");
                    if (!room) room = ListeRoom::Instance().get_room(0);
                    Input *in = ListeRoom::Instance().createInput(params, room);
                    scenario = dynamic_cast<Scenario *>(in);
                    scenario->getAutoScenario()->checkScenarioRules();

                    string sig = "new_scenario id:";
                    sig += scenario->get_param("id");
                    IPC::Instance().SendEvent("events", sig);
                }

                double pause;
                from_string(tokens[1], pause);

                s++;

                scenario->getAutoScenario()->addStep(pause);
            }
            else if (tokens[0] == "step_end")
            {
                if (!scenario)
                {
                    params.Add("type", "scenario");
                    if (!room) ListeRoom::Instance().get_room(0);
                    Input *in = ListeRoom::Instance().createInput(params, room);
                    scenario = dynamic_cast<Scenario *>(in);
                    scenario->getAutoScenario()->checkScenarioRules();

                    string sig = "new_scenario id:";
                    sig += scenario->get_param("id");
                    IPC::Instance().SendEvent("events", sig);
                }

                s = AutoScenario::END_STEP;
            }
            else if (s >= 0)
            {
                Output *out = ListeRoom::Instance().get_output(url_decode(tokens[0]));
                if (out)
                    scenario->getAutoScenario()->addStepAction(s, out, url_decode(tokens[1]));
            }
        }

        //Resave config, auto scenarios have probably created/deleted ios and rules
        Config::Instance().SaveConfigIO();
        Config::Instance().SaveConfigRule();
    }
    else if (request["1"] == "delete")
    {
        cDebugDom("network") << "delete";

        Scenario *sc = dynamic_cast<Scenario *>(ListeRoom::Instance().get_input(request["2"]));
        if (sc && sc->getAutoScenario())
        {
            sc->getAutoScenario()->deleteAll();

            //delete the scenario IO
            ListeRoom::Instance().deleteIO(dynamic_cast<Input *>(sc));

            string sig = "delete_scenario id:";
            sig += request["2"];
            IPC::Instance().SendEvent("events", sig);

            //Resave config
            Config::Instance().SaveConfigIO();
            Config::Instance().SaveConfigRule();
        }
    }
    else if (request["1"] == "modify")
    {
        cDebugDom("network") << "modify";

        Scenario *scenario = dynamic_cast<Scenario *>(ListeRoom::Instance().get_input(request["2"]));
        if (scenario && scenario->getAutoScenario())
        {
            scenario->getAutoScenario()->deleteRules();

            Params params;
            string room_name;
            Room *room = NULL;
            int s = -1;

            for (int i = 2;i < request.size();i++)
            {
                vector<string> tokens;
                split(request[Utils::to_string(i)], tokens, ":", 2);

                if (tokens[0] == "name") params.Add("name", url_decode(tokens[1]));
                else if (tokens[0] == "visible") params.Add("visible", tokens[1]);
                else if (tokens[0] == "room_name") room_name = url_decode(tokens[1]);
                else if (tokens[0] == "room_type") room = ListeRoom::Instance().searchRoomByNameAndType(room_name, url_decode(tokens[1]));
                else if (tokens[0] == "cycle") params.Add("cycle", tokens[1]);
                else if (tokens[0] == "disabled") params.Add("disabled", tokens[1]);
                else if (tokens[0] == "step")
                {
                    double pause;
                    from_string(tokens[1], pause);
                    s++;
                    scenario->getAutoScenario()->addStep(pause);
                }
                else if (tokens[0] == "step_end")
                {
                    s = AutoScenario::END_STEP;
                }
                else if (s >= 0)
                {
                    Output *out = ListeRoom::Instance().get_output(url_decode(tokens[0]));
                    if (out)
                        scenario->getAutoScenario()->addStepAction(s, out, url_decode(tokens[1]));
                }
            }

            //Check for changes
            if (params["name"] != scenario->get_param("name"))
            {
                scenario->set_param("name", params["name"]);

                string sig = "output ";
                sig += scenario->get_param("id") + " ";
                sig += url_encode("name" + string(":") + params["name"]) + " ";
                IPC::Instance().SendEvent("events", sig);

                sig = "input ";
                sig += scenario->get_param("id") + " ";
                sig += url_encode("name" + string(":") + params["name"]) + " ";
                IPC::Instance().SendEvent("events", sig);
            }

            if (params["visible"] != scenario->get_param("visible"))
            {
                scenario->set_param("visible", params["visible"]);

                string sig = "output ";
                sig += scenario->get_param("id") + " ";
                sig += url_encode("visible" + string(":") + params["visible"]) + " ";
                IPC::Instance().SendEvent("events", sig);

                sig = "input ";
                sig += scenario->get_param("id") + " ";
                sig += url_encode("visible" + string(":") + params["visible"]) + " ";
                IPC::Instance().SendEvent("events", sig);
            }

            Room *old_room = ListeRoom::Instance().getRoomByInput(scenario);
            if (room != old_room)
            {
                if (room)
                {
                    old_room->RemoveInputFromRoom(dynamic_cast<Input *>(scenario));
                    old_room->RemoveOutputFromRoom(dynamic_cast<Output *>(scenario));
                    room->AddInput(dynamic_cast<Input *>(scenario));
                    room->AddOutput(dynamic_cast<Output *>(scenario));

                    string sig = "modify_room ";
                    sig += url_encode(string("input_add:") + scenario->get_param("id")) + " ";
                    sig += url_encode(string("room_name:") + room->get_name()) + " ";
                    sig += url_encode(string("room_type:") + room->get_type());
                    IPC::Instance().SendEvent("events", sig);
                    sig = "modify_room ";
                    sig += url_encode(string("output_add:") + scenario->get_param("id")) + " ";
                    sig += url_encode(string("room_name:") + room->get_name()) + " ";
                    sig += url_encode(string("room_type:") + room->get_type());
                    IPC::Instance().SendEvent("events", sig);
                }
            }

            if (params["cycle"] != scenario->get_param("cycle"))
            {
                if (params["cycle"] == "true")
                    scenario->getAutoScenario()->setCycling(true);
                else
                    scenario->getAutoScenario()->setCycling(false);
            }

            if (params["disabled"] != scenario->get_param("disabled"))
            {
                if (params["disabled"] == "true")
                    scenario->getAutoScenario()->setDisabled(true);
                else
                    scenario->getAutoScenario()->setDisabled(false);
            }

            scenario->getAutoScenario()->checkScenarioRules();

            //Resave config
            Config::Instance().SaveConfigIO();
            Config::Instance().SaveConfigRule();

            string sig = "modify_scenario id:";
            sig += request["2"];
            IPC::Instance().SendEvent("events", sig);
        }
    }
    else if (request["1"] == "add_schedule")
    {
        cDebugDom("network") << "add_schedule";

        Scenario *sc = dynamic_cast<Scenario *>(ListeRoom::Instance().get_input(request["2"]));
        if (sc && sc->getAutoScenario())
        {
            sc->getAutoScenario()->addSchedule();

            //Resave config
            Config::Instance().SaveConfigIO();
            Config::Instance().SaveConfigRule();

            result.clear();
            result.Add("0", "scenario");
            result.Add("1", request["2"]);
            result.Add("2", string("schedule_id:") + sc->getAutoScenario()->getIOPlage()->get_param("id"));

            string sig = "modify_scenario id:";
            sig += request["2"];
            IPC::Instance().SendEvent("events", sig);
        }
    }
    else if (request["1"] == "del_schedule")
    {
        cDebugDom("network") << "add_schedule";

        Scenario *sc = dynamic_cast<Scenario *>(ListeRoom::Instance().get_input(request["2"]));
        if (sc && sc->getAutoScenario())
        {
            sc->getAutoScenario()->deleteSchedule();

            //Resave config
            Config::Instance().SaveConfigIO();
            Config::Instance().SaveConfigRule();

            result.clear();
            result.Add("0", "scenario");
            result.Add("1", "ok");

            string sig = "modify_scenario id:";
            sig += request["2"];
            IPC::Instance().SendEvent("events", sig);
        }
    }

    ProcessDone_signal sig;
    sig.connect(callback);
    sig.emit(result);
}