PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/TemaLib/tema/variablemodels/variablemodelcreator.py

https://github.com/jaaskel9/tema-tg
Python | 281 lines | 162 code | 96 blank | 23 comment | 34 complexity | 81a70f9bad43ce73aacbc92ac2a8ba70 MD5 | raw file
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os.path
  4. import tema.lsts.lsts as lsts
  5. import optparse
  6. """
  7. Generates variable models and interface model from a list of variables
  8. Variable file format:
  9. Variable1Name: value1,value2,value3
  10. Variable2Name: (UnknownValue),value1,value2
  11. The first value in the list is the initial value. Value enclosed with parantheses is the unknown value
  12. """
  13. class Variable:
  14. def __init__(self,name,values, unknownValue):
  15. self.__name = name
  16. self.__values = values
  17. self.__unknownValue = unknownValue
  18. def getName(self):
  19. return self.__name
  20. def getValues(self):
  21. return self.__values
  22. def getUnknownValue(self):
  23. return self.__unknownValue
  24. def getActions(self):
  25. VerifyAllowActions = []
  26. toAllowActions = []
  27. for v in self.__values:
  28. VerifyAllowActions.append("ALLOW<@PARENT: " + self.__name + v + ">")
  29. toAllowActions.append("ALLOW<@PARENT: To" + self.__name + v + ">")
  30. return VerifyAllowActions, toAllowActions
  31. class VariableModelCreator:
  32. def __init__(self,file,output):
  33. self.__variable_file = file
  34. self.__variables = []
  35. self.__outputDir = output
  36. def readVariables(self):
  37. if(not os.path.exists(self.__variable_file)):
  38. print "File:" + self.__variable_file + " does not exist"
  39. try:
  40. file = open(self.__variable_file, "r")
  41. for variable in open(self.__variable_file,"r").readlines():
  42. variable = file.readline()
  43. variableName = variable.partition(":")[0]
  44. unknownValue = None
  45. variableValues = [v.strip() for v in variable.partition(":")[2].split(",")]
  46. for v in variableValues:
  47. if variableValues.count(v) != 1:
  48. print variableName + ": Variable cannot contain duplicate values"
  49. return False
  50. elif v[0] == "(" and v[-1] == ")":
  51. if unknownValue:
  52. print variableName + ": Only one value can be marked unknown"
  53. return False
  54. else:
  55. unknownValue = v[1:-1]
  56. variableValues[variableValues.index(v)] = unknownValue
  57. self.__variables.append(Variable(variableName, variableValues,unknownValue))
  58. except:
  59. print "Invalid file"
  60. return False
  61. return True
  62. def createVariableModels(self):
  63. for v in self.__variables:
  64. verifyAllowActions, toAllowActions = v.getActions()
  65. actions = verifyAllowActions + toAllowActions
  66. transitions = []
  67. state_props = {}
  68. refinements = []
  69. state_props["SleepState"] = []
  70. idx = 0
  71. values = v.getValues()
  72. for value in values:
  73. state_transitions = []
  74. #Verifying allow transitions to the same state (value remains same)
  75. state_transitions.append((idx,idx+1))
  76. #Allow transitions to other values
  77. for i in range (0,len(v.getValues())):
  78. if i == idx:
  79. continue
  80. state_transitions.append((i,len(verifyAllowActions) + 1 + i))
  81. state_props["SleepState"].append(idx)
  82. state_props[v.getName() + value] = [idx]
  83. idx += 1
  84. transitions.append(state_transitions)
  85. action_file = open(self.__outputDir + v.getName() + ".lsts", "w")
  86. w = lsts.writer(action_file)
  87. w.set_actionnames(actions)
  88. w.set_transitions(transitions)
  89. w.set_stateprops(state_props)
  90. w.get_header().initial_states = 0
  91. w.write()
  92. def createInterface(self):
  93. transitions = []
  94. state_props = {}
  95. refinements = []
  96. actions = []
  97. state_props["SleepState"] = [0]
  98. #Add central state
  99. transitions.append([])
  100. for v in self.__variables:
  101. verifyTransitions = []
  102. values = v.getValues()
  103. for value in values:
  104. #Sets CallVerify transitions and actions
  105. transitions.append([])
  106. verifyTransitions.append((len(transitions)-1,self.__addAction__("REQ<@PARENT: "+ v.getName() + value + ">", actions)))
  107. transitions[-1].append((0,self.__addAction__("SLEEPapp<ReturnVerify" + v.getName() +":"+ value + ">", actions)))
  108. #add setValue transitions and actions
  109. if ( value != v.getUnknownValue()):
  110. transitions.append([])
  111. transitions[0].append((len(transitions)-1,self.__addAction__("WAKEapp<CallSet" + v.getName() + value + ">", actions)))
  112. transitions.append([])
  113. transitions[-2].append((len(transitions)-1,self.__addAction__("REQALL<@PARENT: To"+ v.getName() + value + ">", actions)))
  114. transitions[-1].append((0,self.__addAction__("SLEEPapp<ReturnSet" + v.getName() + value + ">", actions)))
  115. #Adds CallDiscovers from unknown value
  116. if(v.getUnknownValue()):
  117. transitions.append([])
  118. transitions[0].append((len(transitions)-1,self.__addAction__("WAKEapp<@PARENT: CallDiscover" + v.getName() + value + ">", actions)))
  119. transitions.append([])
  120. transitions[-2].append((len(transitions)-1,self.__addAction__("REQ<@PARENT: "+ v.getName() + v.getUnknownValue() + ">", actions)))
  121. transitions.append([])
  122. transitions[-3].append((len(transitions)-1,self.__addAction__("REQ<@PARENT: "+ v.getName() + value + ">", actions)))
  123. transitions[-2].append((len(transitions)-1,self.__addAction__("REQALL<@PARENT: To"+ v.getName() + value + ">", actions)))
  124. transitions[-1].append((0,self.__addAction__("SLEEPapp<@PARENT: ReturnDiscover"+ v.getName() + value + ">", actions)))
  125. transitions.append(verifyTransitions)
  126. transitions[0].append((len(transitions)-1,self.__addAction__("WAKEapp<CallVerify" + v.getName() + "Status>", actions)))
  127. #Add forget settings call
  128. foundForget = False
  129. for v in self.__variables:
  130. if v.getUnknownValue():
  131. if not foundForget:
  132. transitions.append([])
  133. transitions[0].append((len(transitions)-1,self.__addAction__("WAKEapp<CallForgetSettings>", actions)))
  134. foundForget = True
  135. transitions.append([])
  136. transitions[-2].append((len(transitions)-1,self.__addAction__("REQALL<@PARENT: To" + v.getName() + v.getUnknownValue() +">", actions)))
  137. if foundForget:
  138. transitions[-1].append((0,self.__addAction__("SLEEPapp<ReturnForgetSettings>", actions)))
  139. action_file = open(self.__outputDir + "interface.lsts", "w")
  140. w = lsts.writer(action_file)
  141. w.set_actionnames(actions)
  142. w.set_transitions(transitions)
  143. w.set_stateprops(state_props)
  144. w.get_header().initial_states = 0
  145. w.write()
  146. def __addAction__(self, actionName,actionList):
  147. if actionList.count(actionName) == 0:
  148. actionList.append(actionName)
  149. return len(actionList)
  150. else:
  151. return actionList.index(actionName) + 1
  152. if __name__ == "__main__":
  153. #Parse command line arguments
  154. parser = optparse.OptionParser(usage="usage: %prog [options] input_file")
  155. parser.add_option("-o", "--output", dest="outdir", default=".",
  156. help="Output path for the generated variable models.")
  157. parser.add_option("-i","--interface", dest="interface", default = False, action="store_true",
  158. help = "Generate a common interace model for the variables")
  159. outputdir = None
  160. #Argument parsing...
  161. (options, args) = parser.parse_args()
  162. if len(args) != 1:
  163. parser.error("incorrect number of arguments")
  164. exit(1)
  165. if not os.path.exists(args[0]):
  166. print "Inputfile: " + args[0] + " does not exist!"
  167. exit(1)
  168. variableFile = args[0]
  169. if options.outdir and not os.path.exists(options.outdir):
  170. try:
  171. os.makedirs(options.outdir)
  172. except:
  173. "Error creating output directory"
  174. exit(1)
  175. if options.outdir[-1] != os.sep: options.outdir += os.sep
  176. v = VariableModelCreator(variableFile,options.outdir)
  177. if(v.readVariables()):
  178. v.createVariableModels()
  179. if options.interface:
  180. v.createInterface()