Beispiel #1
0
ContextManager::ContextManager(QQuickView *view, Doc *doc,
                               FixtureManager *fxMgr, FunctionManager *funcMgr,
                               QObject *parent)
    : QObject(parent)
    , m_view(view)
    , m_doc(doc)
    , m_fixtureManager(fxMgr)
    , m_functionManager(funcMgr)
    , m_universeFilter(Universe::invalid())
    , m_prevRotation(0)
    , m_editingEnabled(false)
{
    m_source = new GenericDMXSource(m_doc);
    m_source->setOutputEnabled(true);

    m_2DView = new MainView2D(m_view, m_doc);
    m_view->rootContext()->setContextProperty("View2D", m_2DView);

    m_DMXView = new MainViewDMX(m_view, m_doc);

    connect(m_fixtureManager, SIGNAL(newFixtureCreated(quint32,qreal,qreal)),
            this, SLOT(slotNewFixtureCreated(quint32,qreal,qreal)));
    connect(m_fixtureManager, SIGNAL(channelValueChanged(quint32,quint32,quint8)),
            this, SLOT(slotChannelValueChanged(quint32,quint32,quint8)));
    connect(m_fixtureManager, SIGNAL(channelTypeValueChanged(int,quint8)),
            this, SLOT(slotChannelTypeValueChanged(int,quint8)));
    connect(m_fixtureManager, SIGNAL(colorChanged(QColor,QColor)),
            this, SLOT(slotColorChanged(QColor,QColor)));
    connect(m_fixtureManager, SIGNAL(positionTypeValueChanged(int,int)),
            this, SLOT(slotPositionChanged(int,int)));
    connect(m_fixtureManager, SIGNAL(presetChanged(const QLCChannel*,quint8)),
            this, SLOT(slotPresetChanged(const QLCChannel*,quint8)));
    connect(m_doc->inputOutputMap(), SIGNAL(universesWritten(int, const QByteArray&)),
            this, SLOT(slotUniversesWritten(int, const QByteArray&)));
    connect(m_functionManager, SIGNAL(functionEditingChanged(bool)),
            this, SLOT(slotFunctionEditingChanged(bool)));
}
Beispiel #2
0
void SuplaDeviceClass::channelSetValue(int channel, char value, _supla_int_t DurationMS) {

    bool success = false;

    uint8_t _HI = channel_pin[channel].hiIsLo ? LOW : HIGH;
    uint8_t _LO = channel_pin[channel].hiIsLo ? HIGH : LOW;

    if ( Params.reg_dev.channels[channel].Type == SUPLA_CHANNELTYPE_RELAY ) {

        if ( channel_pin[channel].bistable )
            if ( channel_pin[channel].bi_time_left > 0
                    || suplaDigitalRead(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin2)  == value ) {
                value = -1;
            } else {
                value = 1;
                channel_pin[channel].bi_time_left = 500;
            }

        if ( value == 0 ) {

            if ( channel_pin[channel].pin1 != 0 ) {
                suplaDigitalWrite(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin1, _LO);

                success = suplaDigitalRead(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin1) == _LO;
            }


            if ( channel_pin[channel].pin2 != 0
                    && channel_pin[channel].bistable == false ) {
                suplaDigitalWrite(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin2, _LO);

                if ( !success )
                    success = suplaDigitalRead(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin2) == _LO;
            }


        } else if ( value == 1 ) {

            if ( channel_pin[channel].pin2 != 0
                    && channel_pin[channel].bistable == false ) {
                suplaDigitalWrite(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin2, _LO);
                delay(50);
            }

            if ( channel_pin[channel].pin1 != 0 ) {
                suplaDigitalWrite(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin1, _HI);

                if ( !success )
                    success = suplaDigitalRead(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin1) == _HI;

                if ( DurationMS > 0 )
                    channel_pin[channel].time_left = DurationMS;
            }



        } else if ( value == 2
                    && channel_pin[channel].bistable == false ) {

            if ( channel_pin[channel].pin1 != 0 ) {
                suplaDigitalWrite(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin1, _LO);
                delay(50);
            }

            if ( channel_pin[channel].pin2 != 0  ) {
                suplaDigitalWrite(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin2, _HI);

                if ( !success )
                    success = suplaDigitalRead(Params.reg_dev.channels[channel].Number, channel_pin[channel].pin2) == _HI;
            }

        }

        if ( channel_pin[channel].bistable ) {
            success = false;
            delay(50);
        }

    };

    if ( success
            && registered == 1
            && srpc ) {
        channelValueChanged(Params.reg_dev.channels[channel].Number, value);
    }


}
Beispiel #3
0
void SuplaDeviceClass::channelValueChanged(int channel_number, char v) {

    channelValueChanged(channel_number, v, 0, 1);

}
Beispiel #4
0
void SuplaDeviceClass::channelDoubleValueChanged(int channel_number, double v) {
    channelValueChanged(channel_number, 0, v, 2);

}
Beispiel #5
0
void SuplaDeviceClass::iterate(void) {

    if ( !isInitialized(false) ) return;

    if ( !Params.cb.svr_connected() ) {

        supla_log(LOG_DEBUG, "Not connected");
        registered = 0;
        last_response = 0;
        ping_flag = false;

        if ( !Params.cb.svr_connect(Params.server, 2015) ) {

            supla_log(LOG_DEBUG, "Connection fail. Server: %s", Params.server);
            Params.cb.svr_disconnect();
            delay(2000);
            return;
        }
    }

    unsigned long _millis = millis();


    if ( registered == 0 ) {

        registered = -1;
        srpc_ds_async_registerdevice_b(srpc, &Params.reg_dev);
        supla_log(LOG_DEBUG, "Register in progress");

    } else if ( registered == 1 ) {
        // PING
        if ( (_millis-last_response)/1000 >= (server_activity_timeout+10)  ) {

            supla_log(LOG_DEBUG, "TIMEOUT");
            Params.cb.svr_disconnect();

        } else if ( ping_flag == false
                    && (_millis-last_response)/1000 >= (server_activity_timeout-5) ) {
            ping_flag = true;
            srpc_dcs_async_ping_server(srpc);
        }
    }

    if ( last_iterate_time != 0 ) {

        unsigned long td = abs(_millis - last_iterate_time);

        for(int a=0; a<Params.reg_dev.channel_count; a++) {

            if ( channel_pin[a].bi_time_left != 0 ) {
                if ( td >= channel_pin[a].bi_time_left ) {

                    suplaDigitalWrite(Params.reg_dev.channels[a].Number, channel_pin[a].pin1, channel_pin[a].hiIsLo ? HIGH : LOW);
                    channel_pin[a].bi_time_left = 0;

                } else if ( channel_pin[a].bi_time_left > 0 ) {
                    channel_pin[a].bi_time_left-=td;
                }
            }

            if ( channel_pin[a].time_left != 0 ) {
                if ( td >= channel_pin[a].time_left ) {

                    channel_pin[a].time_left = 0;

                    if ( Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_SENSORNO )
                        channel_pin[a].last_val = -1;

                    else if ( Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_RELAY )
                        channelSetValue(a, 0, 0);

                } else if ( channel_pin[a].time_left > 0 ) {
                    channel_pin[a].time_left-=td;
                }
            }

            if ( Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_RELAY
                    && channel_pin[a].bistable	)
                if ( td >= channel_pin[a].vc_time ) {

                    channel_pin[a].vc_time-=td;

                } else {

                    uint8_t val = suplaDigitalRead(Params.reg_dev.channels[a].Number, channel_pin[a].pin2);

                    if ( val != channel_pin[a].last_val ) {

                        channel_pin[a].last_val = val;
                        channel_pin[a].vc_time = 200;

                        channelValueChanged(Params.reg_dev.channels[a].Number, val == HIGH ? 1 : 0);

                    }
                }

            if ( Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_SENSORNO ) {

                uint8_t val = suplaDigitalRead(Params.reg_dev.channels[a].Number, channel_pin[a].pin1);

                if ( val != channel_pin[a].last_val ) {

                    channel_pin[a].last_val = val;

                    if ( channel_pin[a].time_left <= 0 ) {
                        channel_pin[a].time_left = 500;
                        channelValueChanged(Params.reg_dev.channels[a].Number, val == HIGH ? 1 : 0);
                    }

                }
            }

            if ( Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_THERMOMETERDS18B20
                    && Params.cb.get_temperature != NULL ) {


                if ( channel_pin[a].time_left <= 0 ) {

                    channel_pin[a].time_left = 10000;
                    double val = Params.cb.get_temperature(a, channel_pin[a].last_val_dbl1);

                    if ( val != channel_pin[a].last_val_dbl1 ) {
                        channel_pin[a].last_val_dbl1 = val;
                        channelDoubleValueChanged(a, val);
                    }

                }
            }


            if ( ( Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_DHT11
                    || Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_DHT22
                    || Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_AM2302 )
                    && Params.cb.get_temperature_and_humidity != NULL ) {


                if ( channel_pin[a].time_left <= 0 ) {

                    channel_pin[a].time_left = 10000;

                    double t = channel_pin[a].last_val_dbl1;
                    double h = channel_pin[a].last_val_dbl2;

                    Params.cb.get_temperature_and_humidity(a, &t, &h);

                    if ( t != channel_pin[a].last_val_dbl1
                            || h != channel_pin[a].last_val_dbl2 ) {

                        channel_pin[a].last_val_dbl1 = t;
                        channel_pin[a].last_val_dbl2 = h;

                        channelSetTempAndHumidityValue(a, t, h);
                        srpc_ds_async_channel_value_changed(srpc, a, Params.reg_dev.channels[a].value);
                    }

                }
            }


            if ( Params.reg_dev.channels[a].Type == SUPLA_CHANNELTYPE_DISTANCESENSOR
                    && Params.cb.get_distance != NULL ) {

                if ( channel_pin[a].time_left <= 0 ) {

                    if ( channel_pin[a].time_left <= 0 ) {

                        channel_pin[a].time_left = 1000;

                        double val = Params.cb.get_distance(a, channel_pin[a].last_val_dbl1);

                        if ( val != channel_pin[a].last_val_dbl1 ) {

                            channel_pin[a].last_val_dbl1 = val;
                            channelDoubleValueChanged(a, val);
                        }

                    }

                }

            }


        }

    }


    last_iterate_time = millis();

    if( srpc_iterate(srpc) == SUPLA_RESULT_FALSE ) {
        supla_log(LOG_DEBUG, "Iterate fail");
        Params.cb.svr_disconnect();
        delay(5000);
    }


}
Beispiel #6
0
void FixtureManager::setChannelValue(quint32 fixtureID, quint32 channelIndex, quint8 value)
{
    emit channelValueChanged(fixtureID, channelIndex, value);
}