class GoWrong(Tree): spec = P('misunderstanding\nabout MR14', failure_rate=1e-4) check = P('not discovered during\npeer review', failure_rate=1e-4) failure = T( r'moving to the \"gathered position\"\ninstead of \"towards the victim\"' ) failure << (spec & check)
class EscortNoLED(Tree): led = P('primary indicator LED failure', failure_rate=1e-5) with F('not aware of escorting') as not_aware: not_aware << (hw.EPuck.memory_fault() | Escort.unintentional) failure = T('escorting, but\nno LED indication') failure << (led | not_aware | software_bug())
class NoEscort(Tree): indirect = F('taking a detour during escort') indirect << (Uncooperative.failure.as_leaf() | hw.Motor.failure() | hw.EPuck.memory_fault()) failure = T( 'not moving the victim out;\nat least not on shortest known path') failure << (StandingStill.failure | Escort.unintentional.as_leaf() | indirect)
class SeeNoLed(Tree): primary = P('primary failure\nof the display-LED', failure_rate=1e-5) software = software_bug() not_turned_on = hw.EPuck.not_turned_on() failure = T('clear line of sight,\nbut no LED indication') failure << (VictimSilent.failure | proto.SOS.receiver | primary | software | not_turned_on)
class SpuriousMovements(Tree): turn = F('does not\nstop turning\nwhile sensing\nangle to victim') turn << (VictimSilent.failure.as_leaf() | hw.ExtBoard.failure) badcolor = S("Tin Bot's physical color\nis not hardcoded color") failure = T('spurious movements\n(e.g., spin around, drive circles, ...)') failure << (proto.LPS.failure.as_leaf() | software_bug() | badcolor | Proximity.failure() | Uncooperative.failure.as_leaf() | turn)
class SystemFailure(Tree): tin_bot_failure = F('Tin Bot failure\n') tin_bot_failure << (VictimLost.failure | IgnoreVictim.failure | NoEscort.failure | Victim404.failure) all_bad = F('all Tin Bots fail') all_bad << (tin_bot_failure & tin_bot_failure.as_leaf()) failure = T('system failure\n(victim remains in maze)') failure << all_bad
class Uncooperative(Tree): with F('sender failure') as sender: sender << (software_bug() | hw.Bluetooth.sender()) with F('receiver failure') as receiver: receiver << (software_bug() | hw.Bluetooth.receiver()) design = P('protocol design failure (T2T)', failure_rate=0) failure = T('uncooperative behavior\n(explores cells twice, ...)') failure << (sender | receiver | hw.Bluetooth.medium() | design)
class StandingStill(Tree): with F('no initial position from LPS') as no_initial_lps: user = S('user did not\nenable LPS') no_initial_lps << (proto.LPS.failure | user) with F('wheels do not turn') as wheel_fault: blocked = S('wheels blocked') wheel_fault << (hw.Motor.failure | blocked) bad_setup = S('bad setup') software = software_bug() failure = T('standing still') failure << (no_initial_lps | bad_setup | software | wheel_fault | hw.EPuck.failure | RunIntoWall.failure | Escort.hang)
class VictimLost(Tree): with F('victim dropped / unable to grab') as dropped: magnet_weak = P('primary magnet failure\n(e.g., too weak)', 1e-5) belt_weak = P('primary belt failure\n(magnet slips out of the belt)', 1e-1) # Your magnet is weak, your belt is weak, your bloodline is # weak, and you will *not* survive winter! dropped << (belt_weak | magnet_weak) pulled_away = F('pulled away by\nanother Tin Bot') pulled_away << (Escort.unintentional | Uncooperative.failure.as_leaf()) failure = T('victim lost while escorting') failure << (pulled_away | dropped)
class IgnoreVictim(Tree): conflict = F('conflicting data\nabout victim') conflict << (hw.EPuck.memory_fault() | S('user moved\nvictim') | Uncooperative.failure.as_leaf()) late = P('too high min-distance\nfor sensing again', failure_rate=1e-4) no_triang = F('triangulation fails') no_triang << (late | software_bug()) overwrite = F('information gets overwritten\nbefore E-Puck picks it up') overwrite << Uncooperative.design() failure = T('not using information\nabout victim') failure << (hw.ExtBoard.failure.as_leaf() | conflict | no_triang | overwrite)
class Victim404(Tree): not_placed_in = S('user did not place\nthe victim in the maze') unsolvable = S('unsolvable maze') rhr_hangs = F('right-hand follower\ndrives in circles') rhr_hangs << (P('right-hand follower\ncan drive in circles', failure_rate=inf) & P('path-pruning fails', failure_rate=0) & S('maze is not\n1-outerplanar')) drift = F('lost orientation') drift << (proto.LPS.failure & P('approximation algorithm\nis way off', failure_rate=1e-3) & P('drift from real orientation\ndoes not stabilize', failure_rate=1e-5)) failure = T('victim cannot be found') failure << (VictimSilent.failure | proto.SOS.receiver() | rhr_hangs | drift | not_placed_in | unsolvable)
class RunIntoWall(Tree): failure = T('run into walls') failure << (Proximity.collision | bad_firmware)
class NoPowerLED(Tree): primary = P('primary power LED failure', failure_rate=1e-5) failure = T('power LED is off') failure << (primary | hw.EPuck.failure)
class VictimSilent(Tree): software = software_bug() failure = T('victim\'s LED does not\nsend valid signal') failure << (software | hw.Victim.failure)