From: Kirk B. <ki...@ka...> - 2004-04-28 19:59:11
|
I'm sending again with some more information... apologies for sending two emails... additional info is at the bottom of the email. After my upgrade to 2.89, my Fan_Control.pm module (that I wrote) is having problems... here is part of the code: package Fan_Motor; @Fan_Motor::ISA = ('Generic_Item'); sub new { my ($class, $name) = @_; &::print_log("FAN: Class=$class, name=$name"); my $self={}; bless $self,$class; $$self{'name'} = $name; $$self{'timer'} = new Timer(); &::print_log("FAN: self=$self, timer=$$self{'timer'}"); push(@{$$self{states}}, 'off', 'low', 'med', 'high'); return $self; } sub delay_off { my ($self, $delay) = @_; &::print_log("FAN(delay_off): self=$self"); &::print_log("FAN: timer=$$self{'timer'}, name=$$self{name}, states=$$self{states}"); unless ($$self{'timer'}) { &::print_log("Fan_Motor $$self{name}: ERROR: no timer object defined!"); return; } $$self{'timer'}->set($delay, $self); } sub setstate_high { my ($self) = @_; &::print_log("FAN(high): self=$self"); &::print_log("FAN: timer=$$self{'timer'}, name=$$self{name}, states=$$self{states}"); set $fan_socket "fan $$self{'name'} motor high"; unless ($$self{'timer'}) { &::print_log("Fan_Motor $$self{name}: ERROR: no timer object defined!"); return; } $$self{'timer'}->stop(); } Now, before this upgrade, I never checked the 'timer' member to see if it was defined, but after the upgrade I started getting errors because I was calling stop() on an undefined object. So I added all of the debugging and the checks, but it still doesn't answer the question as to how I can define a timer object in the constructor but then it would no longer exist in sutstate_high(), even though the 'name' object property remains set... here are some of the logs to illustrate the problem: 04/28/04 12:27:00 PM FAN: Class=Fan_Motor, name=fr 04/28/04 12:27:00 PM FAN: self=Fan_Motor=HASH(0x990144c), timer=Timer=HASH(0x9901470) 04/28/04 12:27:07 PM FAN(delay_off): self=Fan_Motor=HASH(0x990144c) 04/28/04 12:27:07 PM FAN: timer=Timer=HASH(0x9901470), name=fr, states=ARRAY(0x9901494) 04/28/04 12:27:46 PM FAN(high): self=Fan_Motor=HASH(0x990144c) 04/28/04 12:27:46 PM FAN: timer=, name=fr, states=ARRAY(0x9901494) 04/28/04 12:27:48 PM FAN(delay_off): self=Fan_Motor=HASH(0x990144c) 04/28/04 12:27:48 PM FAN: timer=, name=fr, states=ARRAY(0x9901494) Note how the timer is defined in the constructor, and in the delay_off() function, but then it is no longer defined in the setstate_high() function nor in the second call to delay_off(). What could be causing this to happen? Did something change in Misterhouse between 2.86 and 2.89 that would be causing this? I actually shut everything down and erased my saved states files and restarted but it did not fix the problem (but DID fix some other strangeness I was having). ------- NEW INFO -------------- Apparently it is the fact that the object's state is set to 'high' that causes the problem. The first delay_off() call can be taken out and the problem still happens. Here is how I define this object: FANMOTOR, fr, fr_fan_motor, Fans Here is how I'm calling the set() function: Increase_Fan($fr_fan_motor); Where this function is defined as: sub Increase_Fan($) { my ($fan) = @_; if (state $fan eq 'off') { set $fan 'low'; } elsif (state $fan eq 'low') { set $fan 'med'; } else { set $fan 'high'; } } Could it be something about how the object is passed into the Increase_Fan() function? Also, the module does define other functions like setstate_off(), setstate_low(), and setstate_med(). |