from LogAnalyzer import Test,TestResult
import DataflashLog


class TestEvents(Test):
	'''test for erroneous events and failsafes'''
	# TODO: need to check for vehicle-specific codes

	def __init__(self):
		Test.__init__(self)
		self.name = "Event/Failsafe"

	def run(self, logdata, verbose):
		self.result = TestResult()
		self.result.status = TestResult.StatusType.GOOD

		errors = set()

		if "ERR" in logdata.channels:
			assert(len(logdata.channels["ERR"]["Subsys"].listData) == len(logdata.channels["ERR"]["ECode"].listData))
			for i in range(len(logdata.channels["ERR"]["Subsys"].listData)):
				subSys = logdata.channels["ERR"]["Subsys"].listData[i][1]
				eCode  = logdata.channels["ERR"]["ECode"].listData[i][1]
				if subSys == 2 and (eCode == 1):
			 		errors.add("PPM")
				elif subSys == 3 and (eCode == 1 or eCode == 2):
			 		errors.add("COMPASS")
				elif subSys == 5 and (eCode == 1):
			 		errors.add("FS_THR")
				elif subSys == 6 and (eCode == 1):
			 		errors.add("FS_BATT")
				elif subSys == 7 and (eCode == 1):
			 		errors.add("GPS")
				elif subSys == 8 and (eCode == 1):
			 		errors.add("GCS")
				elif subSys == 9 and (eCode == 1 or eCode == 2):
			 		errors.add("FENCE")
				elif subSys == 10:
			 		errors.add("FLT_MODE")
				elif subSys == 11 and (eCode == 2):
			 		errors.add("GPS_GLITCH")
				elif subSys == 12 and (eCode == 1):
			 		errors.add("CRASH")

		if errors:
			if len(errors) == 1 and "FENCE" in errors:
				self.result.status = TestResult.StatusType.WARN
			else:
				self.result.status = TestResult.StatusType.FAIL
				if len(errors) == 1:
					self.result.statusMessage = "ERR found: "
				else:
					self.result.statusMessage = "ERRs found: "
			for err in errors:
				self.result.statusMessage = self.result.statusMessage + err + " "