main.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from concurrent.futures import thread
  4. import cv2
  5. import RPi.GPIO as GPIO
  6. import LCD_1in44
  7. import LCD_Config
  8. from datetime import date
  9. import time
  10. import threading
  11. import json
  12. from PIL import Image,ImageDraw,ImageFont,ImageColor
  13. class mainCls:
  14. video_resulution_x = 1920
  15. video_resolution_y = 1080
  16. video_frames = 30.0
  17. video_length = 90
  18. display_resolution_x = 128
  19. display_resolution_y = 128
  20. display_frames = 5
  21. camera_id = 0
  22. recording = False
  23. recordingActive = False
  24. displaying = False
  25. showMenu = False
  26. currentMenuItem = [0]
  27. KEY_UP_PIN = 6
  28. KEY_DOWN_PIN = 19
  29. KEY_LEFT_PIN = 5
  30. KEY_RIGHT_PIN = 26
  31. KEY_PRESS_PIN = 13
  32. KEY1_PIN = 21
  33. KEY2_PIN = 20
  34. KEY3_PIN = 16
  35. #################################################
  36. ## Init & Setup
  37. #################################################
  38. def __init__(self):
  39. self.lock = threading.Lock()
  40. self.setupDisplay()
  41. #splash = threading.Thread(target = self.showLogo)
  42. #splash.start()
  43. self.showLogo()
  44. self.setupMenu()
  45. self.setupKeypad()
  46. #self.setupCamera()
  47. #splash.join()
  48. def run(self):
  49. while True:
  50. time.sleep(0.1)
  51. def setupKeypad(self):
  52. GPIO.cleanup()
  53. GPIO.setmode(GPIO.BCM)
  54. GPIO.setup(self.KEY_UP_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Input with pull-up
  55. GPIO.setup(self.KEY_DOWN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Input with pull-up
  56. GPIO.setup(self.KEY_LEFT_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Input with pull-up
  57. GPIO.setup(self.KEY_RIGHT_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Input with pull-up
  58. GPIO.setup(self.KEY_PRESS_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Input with pull-up
  59. GPIO.setup(self.KEY1_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Input with pull-up
  60. GPIO.setup(self.KEY2_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Input with pull-up
  61. GPIO.setup(self.KEY3_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Input with pull-up
  62. self.keyboardThread = threading.Thread(target=self.threadCheckKeypad, daemon=True)
  63. self.keyboardThread.start()
  64. def showLogo(self):
  65. image = Image.open('img/logo.bmp')
  66. self.disp.LCD_ShowImage(image,0,0)
  67. time.sleep(2.4)
  68. def setupDisplay(self):
  69. self.disp = LCD_1in44.LCD()
  70. Lcd_ScanDir = LCD_1in44.SCAN_DIR_DFT #SCAN_DIR_DFT = D2U_L2R
  71. self.disp.LCD_Init(Lcd_ScanDir)
  72. self.disp.LCD_Clear()
  73. def setupMenu(self):
  74. with open("menu.json", "r") as read_file:
  75. self.menu = json.load(read_file)
  76. def renderDisplay(self):
  77. if self.showMenu:
  78. mnuItem = self.getCurrentMenuItem()
  79. image = Image.new("RGB", (self.display_resolution_x, self.display_resolution_y), "BLACK")
  80. if "icon" in mnuItem:
  81. image = Image.open('img/'+mnuItem["icon"])
  82. draw = ImageDraw.Draw(image)
  83. draw.rectangle([(17,99),(112,22)],fill = "BLUE")
  84. draw.rectangle([(18,100),(110,20)],fill = "BLACK")
  85. if "displayName" in mnuItem:
  86. draw.text((23, 101), mnuItem["displayName"], fill = "BLUE")
  87. self.disp.LCD_ShowImage(image,0,0)
  88. elif self.displaying == True and self.frame is not None:
  89. resized = cv2.resize(self.frame, (self.display_resolution_x, self.display_resolution_y))
  90. self.disp.LCD_ShowImage(resized,0,0)
  91. else:
  92. pass
  93. #################################################
  94. ## Camera
  95. #################################################
  96. def startCamera(self):
  97. self.camera_active = True
  98. self.cameraThread = threading.Thread(target=self.threadCamera)
  99. self.cameraThread.start()
  100. def stopCamera(self):
  101. self.self.camera_active = False
  102. self.cameraThread.join()
  103. def threadCamera(self):
  104. cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
  105. cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.video_resulution_x)
  106. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.video_resulution_y)
  107. while self.camera_active:
  108. ret, frame = cap.read()
  109. if not ret:
  110. self.frame = frame
  111. if self.displaying==True:
  112. self.renderDisplay()
  113. if self.recordingActive==True:
  114. self.writer.write(frame)
  115. cap.release()
  116. cv2.destroyAllWindows()
  117. #################################################
  118. ## Recording
  119. #################################################
  120. def startRecording(self):
  121. self.recording = True
  122. while self.recording:
  123. recordThread=threading.Thread(target=self.threadRecordVideo)
  124. recordThread.start()
  125. recordThread.join()
  126. def threadRecordVideo(self):
  127. startDate = date.today()
  128. startTime = time.perf_counter()
  129. #fourcc = cv2.VideoWriter_fourcc(*'X264')
  130. fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  131. #fourcc = cv2.VideoWriter_fourcc(*'xvid')
  132. #fourcc = cv2.VideoWriter_fourcc(*'XVID')
  133. #fourcc = cv2.VideoWriter_fourcc(*'MJPG')
  134. #fourcc = cv2.VideoWriter_fourcc(*'DIVX')
  135. #fourcc = cv2.VideoWriter_fourcc(*'WMV1')
  136. #fourcc = cv2.VideoWriter_fourcc(*'WMV1')
  137. filename = startDate.strftime("%Y-%m-%d_%H-%M-%S") + ".tmp"
  138. self.writer = cv2.VideoWriter("/home/admin/Video/"+filename, fourcc, self.video_frames, (self.video_resulution_x, self.video_resolution_y))
  139. self.recordingActive = True
  140. time.sleep(self.video_length)
  141. self.recordingActive = False
  142. time.sleep(0.1)
  143. self.writer.release()
  144. #################################################
  145. ## Keys
  146. #################################################
  147. def onKeyPressed(self, key, duration):
  148. if key==self.KEY3_PIN:
  149. if duration<2:
  150. self.displaying = False
  151. if key==self.KEY_LEFT_PIN:
  152. if len(self.currentMenuItem) <= 1:
  153. self.showMenu=False
  154. self.currentMenuItem = [0]
  155. else:
  156. self.currentMenuItem.list = self.currentMenuItem.list[ : -1]
  157. if key==self.KEY_RIGHT_PIN:
  158. mnuItem = self.getCurrentMenuItem()
  159. if "action" in mnuItem:
  160. if "." in mnuItem["action"]:
  161. func = getattr(mnuItem["action"].split(".")[0],mnuItem["action"].split(".")[1])
  162. func()
  163. else:
  164. func = getattr(self,mnuItem["action"])
  165. func()
  166. if "sub" in mnuItem:
  167. self.currentMenuItem.append(0)
  168. if key==self.KEY_UP_PIN:
  169. if self.currentMenuItem[-1]>0:
  170. self.currentMenuItem[-1] = self.currentMenuItem[-1] - 1
  171. if key==self.KEY_DOWN_PIN:
  172. mnu = self.getMenuItem(self.currentMenuItem)
  173. maxMnu = len(mnu)
  174. if self.currentMenuItem[-1]<mnu:
  175. self.currentMenuItem[-1] = self.currentMenuItem[-1] + 1
  176. if key==self.KEY_PRESS_PIN:
  177. if self.showMenu==True:
  178. self.showMenu=False
  179. else:
  180. self.showMenu=True
  181. self.renderDisplay()
  182. def onKeyDown(self, key):
  183. if key==self.KEY3_PIN:
  184. self.displaying = True
  185. if key==self.KEY1_PIN:
  186. if self.startRecording==True:
  187. self.startRecording = False
  188. else:
  189. self.startRecording()
  190. def onKeyUp(self, key):
  191. pass
  192. #################################################
  193. ## Menu
  194. #################################################
  195. def getMenuItem(self, index):
  196. return self.__getMenuItemSub(self.menu,index, 0)
  197. def getCurrentMenuItem(self):
  198. mnu = self.__getMenuItemSub(self.menu, self.currentMenuItem,0)
  199. return mnu[self.currentMenuItem[-1]]
  200. def __getMenuItemSub(self, mnu,index,i):
  201. length = len(index)
  202. if i<=length-1 and "sub" in mnu[index[i]]:
  203. return self.__getMenuItemSub(mnu[index[i]]["sub"],index,i+1)
  204. return mnu
  205. #################################################
  206. ## Keypad Thread
  207. #################################################
  208. key1_pressed=False
  209. key2_pressed=False
  210. key3_pressed=False
  211. keyUp_pressed=False
  212. keyDown_pressed=False
  213. keyLeft_pressed=False
  214. keyRight_pressed=False
  215. keyPress_pressed=False
  216. key1_dur=None
  217. key2_dur=None
  218. key3_dur=None
  219. keyUp_dur=None
  220. keyDown_dur=None
  221. keyLeft_dur=None
  222. keyRight_dur=None
  223. keyPress_dur=None
  224. def threadCheckKeypad(self):
  225. while True:
  226. self.checkKeyPressed()
  227. def checkKeyPressed(self):
  228. # Key1
  229. if GPIO.input(self.KEY1_PIN) == 0:
  230. if self.key1_pressed==True:
  231. self.key1_pressed=False
  232. self.onKeyUp(self.KESY1.PIN)
  233. self.onKeyPress(self.KEY1_PIN, time.perf_counter() - self.key1_dur)
  234. self.key1_dur=None
  235. else:
  236. if self.key1_pressed==False:
  237. self.onKeyDown(self.KEY1_PIN)
  238. self.key1_dur=time.perf_counter()
  239. self.key1_pressed=True
  240. # Key2
  241. if GPIO.input(self.KEY2_PIN) == 0:
  242. if self.key2_pressed==True:
  243. self.key2_pressed=False
  244. self.onKeyUp(self.KESY2.PIN)
  245. self.onKeyPress(self.KEY2_PIN, time.perf_counter() - self.key2_dur)
  246. self.key2_dur=None
  247. else:
  248. if self.key2_pressed==False:
  249. self.onKeyDown(self.KEY2_PIN)
  250. self.key2_dur=time.perf_counter()
  251. self.key2_pressed=True
  252. # Key3
  253. if GPIO.input(self.KEY3_PIN) == 0:
  254. if self.key3_pressed==True:
  255. self.key3_pressed=False
  256. self.onKeyUp(self.KESY3_PIN)
  257. self.onKeyPress(self.KEY3_PIN, time.perf_counter() - self.key3_dur)
  258. self.key3_dur=None
  259. else:
  260. if self.key3_pressed==False:
  261. self.onKeyDown(self.KEY3_PIN)
  262. self.key3_dur=time.perf_counter()
  263. self.key3_pressed=True
  264. # Key Up
  265. if GPIO.input(self.KEY_UP_PIN) == 0:
  266. if self.keyUp_pressed==True:
  267. self.keyUp_pressed=False
  268. self.onKeyUp(self.KESY2.PIN)
  269. self.onKeyPress(self.KEY_UP_PIN, time.perf_counter() - self.keyUp_dur)
  270. self.keyUp_dur=None
  271. else:
  272. if self.keyUp_pressed==False:
  273. self.onKeyDown(self.KEY_UP_PIN)
  274. self.keyUp_dur=time.perf_counter()
  275. self.keyUp_pressed=True
  276. # Key Down
  277. if GPIO.input(self.KEY_DOWN_PIN) == 0:
  278. if self.keyDown_pressed==True:
  279. self.keyDown_pressed=False
  280. self.onKeyUp(self.KESY2.PIN)
  281. self.onKeyPress(self.KEY_DOWN_PIN, time.perf_counter() - self.keyDown_dur)
  282. self.keyDown_dur=None
  283. else:
  284. if self.keyDown_pressed==False:
  285. self.onKeyDown(self.KEY_DOWN_PIN)
  286. self.keyDown_dur=time.perf_counter()
  287. self.keyDown_pressed=True
  288. # Key Left
  289. if GPIO.input(self.KEY_LEFT_PIN) == 0:
  290. if self.keyLeft_pressed==True:
  291. self.keyLeft_pressed=False
  292. self.onKeyUp(self.KESY2.PIN)
  293. self.onKeyPress(self.KEY_LEFT_PIN, time.perf_counter() - self.keyLeft_dur)
  294. self.keyLeft_dur=None
  295. else:
  296. if self.keyLeft_pressed==False:
  297. self.onKeyDown(self.KEY_LEFT_PIN)
  298. self.keyLeft_dur=time.perf_counter()
  299. self.keyLeft_pressed=True
  300. # Key Right
  301. if GPIO.input(self.KEY_RIGHT_PIN) == 0:
  302. if self.keyRight_pressed==True:
  303. self.keyRight_pressed=False
  304. self.onKeyUp(self.KESY2.PIN)
  305. self.onKeyPress(self.KEY_RIGHT_PIN, time.perf_counter() - self.keyRight_dur)
  306. self.keyRight_dur=None
  307. else:
  308. if self.keyRight_pressed==False:
  309. self.onKeyDown(self.KEY_RIGHT_PIN)
  310. self.keyRight_dur=time.perf_counter()
  311. self.keyRight_pressed=True
  312. # Key Press
  313. if GPIO.input(self.KEY_PRESS_PIN) == 0:
  314. if self.keyPress_pressed==True:
  315. self.keyPress_pressed=False
  316. self.onKeyUp(self.KESY2.PIN)
  317. self.onKeyPress(self.KEY_PRESS_PIN, time.perf_counter() - self.keyPress_dur)
  318. self.keyPress_dur=None
  319. else:
  320. if self.keyPress_pressed==False:
  321. self.onKeyDown(self.KEY_PRESS_PIN)
  322. self.keyPress_dur=time.perf_counter()
  323. self.keyPress_pressed=True
  324. if __name__ == "__main__":
  325. app = mainCls()
  326. app.run()