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))); }
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); } }
void SuplaDeviceClass::channelValueChanged(int channel_number, char v) { channelValueChanged(channel_number, v, 0, 1); }
void SuplaDeviceClass::channelDoubleValueChanged(int channel_number, double v) { channelValueChanged(channel_number, 0, v, 2); }
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); } }
void FixtureManager::setChannelValue(quint32 fixtureID, quint32 channelIndex, quint8 value) { emit channelValueChanged(fixtureID, channelIndex, value); }