| @@ -191,7 +191,6 @@ class AD2USB(object): | |||||
| self._fire_status = None | self._fire_status = None | ||||
| self._zones_faulted = [] | self._zones_faulted = [] | ||||
| self._last_zone_fault = 0 | self._last_zone_fault = 0 | ||||
| self._last_wait = False | |||||
| self.address = 18 | self.address = 18 | ||||
| self.configbits = 0xFF00 | self.configbits = 0xFF00 | ||||
| @@ -384,25 +383,18 @@ class AD2USB(object): | |||||
| self._update_zone_status(message) | self._update_zone_status(message) | ||||
| #self._clear_expired_zones(message) | |||||
| def _update_zone_status(self, message): | def _update_zone_status(self, message): | ||||
| #if message.check_zone or (not message.ready and "FAULT" in message.text): | |||||
| if "Hit * for faults" in message.text: | if "Hit * for faults" in message.text: | ||||
| self._device.send('*') | |||||
| self._device.write('*') | |||||
| return | return | ||||
| if message.ready: | if message.ready: | ||||
| cleared_zones = [] | |||||
| for z in self._zones_faulted: | |||||
| cleared_zones.append(z) | |||||
| for idx, status in enumerate(cleared_zones): | |||||
| del self._zones_faulted[idx] | |||||
| for idx, z in enumerate(self._zones_faulted): | |||||
| self.on_restore(z) | self.on_restore(z) | ||||
| del self._zones_faulted[:] | |||||
| self._last_zone_fault = 0 | |||||
| elif "FAULT" in message.text: | elif "FAULT" in message.text: | ||||
| zone = -1 | zone = -1 | ||||
| @@ -411,173 +403,64 @@ class AD2USB(object): | |||||
| except ValueError: | except ValueError: | ||||
| zone = int(message.numeric_code, 16) | zone = int(message.numeric_code, 16) | ||||
| if zone not in self._zones_faulted: | |||||
| # if self._last_zone_fault == 0: | |||||
| # idx = 0 | |||||
| # else: | |||||
| # idx = self._zones_faulted.index(self._last_zone_fault) + 1 | |||||
| self._last_zone_fault = zone | |||||
| self._last_wait = True | |||||
| if zone in self._zones_faulted: | |||||
| self._clear_expired_zones(zone) | |||||
| else: | |||||
| self._zones_faulted.append(zone) | self._zones_faulted.append(zone) | ||||
| self._zones_faulted.sort() | self._zones_faulted.sort() | ||||
| self.on_fault(zone) | self.on_fault(zone) | ||||
| self._clear_expired_zones(zone) | |||||
| self._last_zone_fault = zone | self._last_zone_fault = zone | ||||
| def _clear_expired_zones(self, zone): | def _clear_expired_zones(self, zone): | ||||
| cleared_zones = [] | cleared_zones = [] | ||||
| found_last, found_new, at_end = False, False, False | |||||
| found_last = False | |||||
| found_end = False | |||||
| print '_clear_expired_zones: ', repr(self._zones_faulted) | |||||
| # ---------- | |||||
| #for idx in range(len(self._zones_faulted)): | |||||
| # idx = 0 | |||||
| # while idx < len(self._zones_faulted): | |||||
| # z = self._zones_faulted[idx] | |||||
| # if not found_last: | |||||
| # if z == self._last_zone_fault: | |||||
| # print ' found start point', z | |||||
| # found_last = True | |||||
| # if found_last: | |||||
| # if z == zone and self._last_zone_fault != zone and not break_loop: | |||||
| # print ' found end point', z | |||||
| # found_end = True | |||||
| # break | |||||
| # elif z != self._last_zone_fault and len(self._zones_faulted) > 1: | |||||
| # print ' clearing', z | |||||
| # cleared_zones.append(z) | |||||
| # if idx == len(self._zones_faulted) - 1 and not found_end: | |||||
| # print ' rolling back to front of the list.' | |||||
| # idx = 0 | |||||
| # break_loop = True | |||||
| # else: | |||||
| # idx += 1 | |||||
| # ---------- | |||||
| # idx = 0 | |||||
| # while not found_end and idx < len(self._zones_faulted): | |||||
| # z = self._zones_faulted[idx] | |||||
| # if z == zone and found_last: | |||||
| # print ' found end point, exiting', z | |||||
| # found_end = True | |||||
| # break | |||||
| # if not found_last and z == self._last_zone_fault: | |||||
| # print ' found start point', z | |||||
| # found_last = True | |||||
| # if found_last: | |||||
| # print 'removing', z | |||||
| # self._zones_faulted.remove(z) | |||||
| # #print ' idx', idx | |||||
| # #print ' end', found_end | |||||
| # #print ' start', found_last | |||||
| # if idx >= len(self._zones_faulted) - 1 and not found_end and found_last: | |||||
| # print ' roll' | |||||
| # idx = 0 | |||||
| # else: | |||||
| # idx += 1 | |||||
| # ----- | |||||
| # idx = 0 | |||||
| # start_pos = -1 | |||||
| # end_pos = -1 | |||||
| # while idx < len(self._zones_faulted): | |||||
| # z = self._zones_faulted[idx] | |||||
| # if z == self._last_zone_fault or self._last_zone_fault == 0: | |||||
| # print 'start', idx | |||||
| # start_pos = idx | |||||
| # if z == zone: | |||||
| # print 'end', idx | |||||
| # end_pos = idx | |||||
| # if idx >= len(self._zones_faulted) - 1 and end_pos == -1 and start_pos != -1: | |||||
| # print 'roll' | |||||
| # idx = 0 | |||||
| # else: | |||||
| # idx += 1 | |||||
| # if start_pos < end_pos: | |||||
| # diff = end_pos - start_pos | |||||
| # if diff > 1 and not self._last_wait: | |||||
| # print 'deleting', start_pos + 1, end_pos | |||||
| # del self._zones_faulted[start_pos + 1:end_pos] | |||||
| # elif end_pos < start_pos: | |||||
| # diff = len(self._zones_faulted) - start_pos + end_pos | |||||
| # if diff > 1 and not self._last_wait: | |||||
| # print 'deleting', start_pos + 1, ' -> end' | |||||
| # del self._zones_faulted[start_pos + 1:] | |||||
| # print 'deleting', 'start -> ', end_pos | |||||
| # del self._zones_faulted[:end_pos] | |||||
| # if self._last_wait == True: | |||||
| # self._last_wait = False | |||||
| # for idx, z in enumerate(cleared_zones): | |||||
| # print ' !remove it', z | |||||
| # #del self._zones_faulted[idx] | |||||
| # self._zones_faulted.remove(z) | |||||
| # self.on_restore(z) | |||||
| # ----- | |||||
| idx = 0 | |||||
| start_pos = -1 | |||||
| end_pos = -1 | |||||
| while idx < len(self._zones_faulted): | |||||
| z = self._zones_faulted[idx] | |||||
| if z == self._last_zone_fault or self._last_zone_fault == 0: | |||||
| print 'start', idx | |||||
| start_pos = idx | |||||
| if z == zone: | |||||
| print 'end', idx | |||||
| end_pos = idx | |||||
| if idx >= len(self._zones_faulted) - 1 and end_pos == -1 and start_pos != -1: | |||||
| print 'roll' | |||||
| idx = 0 | |||||
| else: | |||||
| idx += 1 | |||||
| it = iter(self._zones_faulted) | |||||
| try: | |||||
| while not found_last: | |||||
| z = it.next() | |||||
| if start_pos < end_pos: | |||||
| diff = end_pos - start_pos | |||||
| if z == self._last_zone_fault: | |||||
| found_last = True | |||||
| break | |||||
| if diff > 1: | |||||
| print 'deleting', start_pos + 1, end_pos | |||||
| del self._zones_faulted[start_pos + 1:end_pos] | |||||
| elif end_pos <= start_pos: | |||||
| diff = len(self._zones_faulted) - start_pos + end_pos | |||||
| if diff > 1: | |||||
| print 'deleting', start_pos + 1, ' -> end' | |||||
| del self._zones_faulted[start_pos + 1:] | |||||
| except StopIteration: | |||||
| at_end = True | |||||
| print 'deleting', 'start -> ', end_pos | |||||
| del self._zones_faulted[:end_pos] | |||||
| try: | |||||
| while not at_end and not found_new: | |||||
| z = it.next() | |||||
| if z == zone: | |||||
| found_new = True | |||||
| break | |||||
| else: | |||||
| cleared_zones += [z] | |||||
| except StopIteration: | |||||
| pass | |||||
| if not found_new: | |||||
| it = iter(self._zones_faulted) | |||||
| try: | |||||
| while not found_new: | |||||
| z = it.next() | |||||
| if z == zone: | |||||
| found_new = True | |||||
| break | |||||
| else: | |||||
| cleared_zones += [z] | |||||
| except StopIteration: | |||||
| pass | |||||
| for idx, z in enumerate(cleared_zones): | for idx, z in enumerate(cleared_zones): | ||||
| print ' !remove it', z | |||||
| #del self._zones_faulted[idx] | |||||
| self._zones_faulted.remove(z) | self._zones_faulted.remove(z) | ||||
| self.on_restore(z) | self.on_restore(z) | ||||
| def _on_open(self, sender, args): | def _on_open(self, sender, args): | ||||
| """ | """ | ||||
| Internal handler for opening the device. | Internal handler for opening the device. | ||||