Страница 1 из 1

Наследование свойств класса объектом - есть проблемы?

Добавлено: Сб фев 15, 2014 12:49 am
Vovix
Опишу суть проблемы:

Создан класс - Light
и созданы свойства (именно в родительском классе):
1) status
2) trigOnOff

ну и еще методы (тоже в родительском классе):
1) turnOff

Код: Выделить всё

$status=$this->getProperty("status");
if ($status) {
// было включено - выключаем
// переключение по фронту 0 -> 1
$this->setProperty("trigOnOff",0);
$this->setProperty("trigOnOff",1);
}
else {
// было выключено - оставляем как есть
}
2) turnOn

Код: Выделить всё

$status=$this->getProperty("status");
if ($status) {
// было включено - оставляем как есть
}
else {
// было выключено - включаем
// переключение по фронту 0 -> 1
$this->setProperty("trigOnOff",0);
$this->setProperty("trigOnOff",1);
}
Теперь создаю объект в этом классе (Light): Lampa

и в настройках 1-wire связываю:
  • PIO.A - Lampa.trigOnOff
    sensed.B - Lampa.status
и очень странно, но даже в X-Ray оба связанных свойства пусты???
что делаю не так?
комп перезагружал, "по колёсам пинал", "фары протирал" :D и не работает???

Re: Наследование свойств класса объектом - есть проблемы?

Добавлено: Пн фев 17, 2014 11:50 am
sergejey
На первый взгляд всё верно -- простейшее использование свойств объекта какого-то класса. У самого море таких привязок рабочих.

Re: Наследование свойств класса объектом - есть проблемы?

Добавлено: Пн фев 17, 2014 12:15 pm
LutsenkoDenis
Ну тут остается только дебажить и смотреть что на каждом этапе выполнения происходит.

И еще вопрос, зачем использовать конструкцию else, если в ней ничего не происходит? можно было бы написать и вот так. Ну как вариант.

Код: Выделить всё

// turnOff
$status = $this->getProperty("status");

if ($status) 
{
   // было включено - выключаем
   // переключение по фронту 0 -> 1
   $this->setProperty("trigOnOff", 0);
   $this->setProperty("trigOnOff", 1);
}

//turnOn
$status = $this->getProperty("status");
if (!$status)
{
   // было выключено - включаем
   // переключение по фронту 0 -> 1
   $this->setProperty("trigOnOff", 0);
   $this->setProperty("trigOnOff", 1);
} 
Я конечно не сильно понял что у вас там в коде должно делаться, но смущает одинаковый код при включении и выключении...

Код: Выделить всё

 $this->setProperty("trigOnOff", 0);
   $this->setProperty("trigOnOff", 1);

Re: Наследование свойств класса объектом - есть проблемы?

Добавлено: Вт фев 18, 2014 12:13 pm
Vovix
Спасибо за ответы!

else еще просто не дописана!

код одинаковый для turnOn и turnOff для совместимости дальше...
ну и для логики! А так как модули работают по переходу (фронту) 0 -> 1 , то вообще пользуюсь методом switch

А по сути моего вопроса, потом всё заработало! Просто там видимо нюансы когда несколько раз меняешь названия свойств или классов и перепривязываем это например к 1-wire, то не сразу всё начинает работать... ну или у меня так произошло!!!

Тут просто еще всплыло кое-что интересное:
например

если свойство объекта "Лампа.status" связываешь с 1-wire "sensed B" и предположим оно равно=1
(т.е. второй канал DS2406p чувствует, что лампа включена)
а "Лампа.trigOnOff" связываем с 1-wire "pio A" (первый канал DS2406p)

а в настройках "Лампа.status" ставим "Запускать метод при изменении: statusChanged", то

при включении света через комп метод "statusChanged" запускается два раза, хотя
когда подаёшь

Код: Выделить всё

 $this->setProperty("trigOnOff", 0);
   $this->setProperty("trigOnOff", 1);
при выполнении первой строчки значение "Лампа.status" не меняется!!!

а вот если выключателем вручную "щёлкнуть", то "statusChanged" запускается один раз, как и должно быть!

пришлось выкручиваться:

метод: turnOff

Код: Выделить всё

$status=$this->getProperty("status");
if ($status) {
// было включено - выключаем
// переключание по фронту 0 -> 1
$this->setProperty("trigOnOff",0);
$this->setProperty("statusFlag",0);
$this->setProperty("trigOnOff",1);
$this->setProperty("statusFlag",1);
}
else {
// было выключено
}
метод: turnOn

Код: Выделить всё

$status=$this->getProperty("status");
if ($status) {
// было включено
}
else {
// было выключено - включаем
// переключание по фронту 0 -> 1
$this->setProperty("trigOnOff",0);
$this->setProperty("statusFlag",0);
$this->setProperty("trigOnOff",1);
$this->setProperty("statusFlag",1);
}
метод: switch

Код: Выделить всё

$status=$this->getProperty("status");
// переключает программа(1)
$this->setProperty("statusWhoTurn",1);

if ($status) {
 $this->callMethod('turnOff');
 }  else {
 $this->callMethod('turnOn');
}
метод: statusChanged

Код: Выделить всё

$status=$this->getProperty('status');
$statusFlag=$this->getProperty('statusFlag');
$this->setProperty('updatedTimestamp',time());

$this->setProperty("alive",1);
$ot=$this->object_title;
$alive_timeout=(int)$this->getProperty("aliveTimeOut");
if (!$alive_timeout) {
 $alive_timeout=12*60*60; // 12 часов
}
//say($statusFlag);
if (($statusFlag) && ($status)) {
say($ot.' включена');
}
elseif (($statusFlag) && (!$status)) {
say($ot.' выключена');
}
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);

только не бейте за мой плохой "английский", увы давно не писал программульки!!!

З.Ы. Слушайте, а почему у вас вставка кода в форум "раскрашивается" а у меня нет?