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

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 532 раза
Контактная информация:

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

Сообщение Vovix » Сб фев 15, 2014 12:49 am

Опишу суть проблемы:

Создан класс - 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 и не работает???
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Пн фев 17, 2014 11:50 am

На первый взгляд всё верно -- простейшее использование свойств объекта какого-то класса. У самого море таких привязок рабочих.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Пн фев 17, 2014 12:15 pm

Ну тут остается только дебажить и смотреть что на каждом этапе выполнения происходит.

И еще вопрос, зачем использовать конструкцию 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);
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 532 раза
Контактная информация:

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

Сообщение Vovix » Вт фев 18, 2014 12:13 pm

Спасибо за ответы!

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);

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

З.Ы. Слушайте, а почему у вас вставка кода в форум "раскрашивается" а у меня нет?
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Ответить