Advertisement
jakoblover

Untitled

Oct 29th, 2016
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.44 KB | None | 0 0
  1. # coding=utf-8
  2. from threading import Thread
  3. from PySide import QtCore
  4. from threading import Thread
  5. from time import sleep
  6. import time
  7. import psycopg2
  8. import sys
  9. from PySide import QtCore,QtGui
  10. from decimal import Decimal
  11. import os
  12. from overlay import Overlay
  13. from insert_rfid import AddRFID
  14. import MFRC522
  15. import signal
  16.  
  17. #TODO:
  18. #random bilder, ikke bare første
  19. #legge til dato på csv total for mnd
  20. #system for å legge til studkort og nye varer
  21.  
  22. class MyWorkerThread(QtCore.QThread):
  23. message = QtCore.Signal(str)
  24.  
  25. def __init__(self, id, parent=None):
  26. super(MyWorkerThread, self).__init__(parent)
  27. self.id = id
  28. self.MIFAREReader = MFRC522.MFRC522()
  29. def run(self):
  30. while True:
  31. (status,TagType) = self.MIFAREReader.MFRC522_Request(self.MIFAREReader.PICC_REQIDL)
  32. (status,backData) = self.MIFAREReader.MFRC522_Anticoll()
  33. if status == self.MIFAREReader.MI_OK:
  34. rfid = str(backData[0])+str(backData[1])+str(backData[2])+str(backData[3])+str(backData[4])
  35. self.message.emit(rfid)
  36. else:
  37. self.message.emit("-")
  38. sleep(0.3)
  39.  
  40.  
  41. class SnackOverflow(QtGui.QMainWindow):
  42. def __init__(self):
  43.  
  44. super(SnackOverflow, self).__init__()
  45. try:
  46. self.conn = psycopg2.connect(database="snackoverflow", user="postgres", password="admin", host="10.0.1.4", port="5432")
  47. self.conn.autocommit = True
  48. print("Opened database successfully")
  49. except:
  50. print "Could not connect to database"
  51. self.cur = self.conn.cursor()
  52.  
  53.  
  54.  
  55. self.threads = []
  56. self.addWorker(MyWorkerThread(1))
  57.  
  58.  
  59.  
  60. self.total = []
  61.  
  62. self.initUI()
  63.  
  64. self.cur.execute("SELECT rfid, name, balance from students")
  65. self.students_dic = self.cur.fetchall()
  66. print(self.students_dic)
  67.  
  68. self.clk = QtCore.QTimer(self)
  69. self.clk.setInterval(100)
  70. self.clk.setSingleShot(False)
  71. self.connect(self.clk, QtCore.SIGNAL("timeout()"), self._update)
  72.  
  73. self._start = 0.0
  74. self._elapsedtime = 0.0
  75. self._running = 0
  76. self.e = 0
  77. self.m = 0
  78. self.today = time.strftime("%d %b %Y %H-%M-%S", time.localtime())
  79. self.reset_time = 10
  80. print(self.today)
  81.  
  82.  
  83.  
  84. #self.outputTimer = QtCore.QTimer()
  85. #self.connect(self.outputTimer, QtCore.SIGNAL('timeout()'), QtCore.SLOT("RFID_read_loop()"))
  86. #self.outputTimer.start(100)
  87.  
  88. def initUI(self):
  89. self.setStyleSheet("QMainWindow {background: 'black';}")
  90. self.mainWidget = QtGui.QWidget()
  91. self.mainWidget.showingPic = False
  92.  
  93. upcLayout = QtGui.QVBoxLayout()
  94. self.itemsGridLayout = QtGui.QGridLayout()
  95. totalLayout = QtGui.QHBoxLayout()
  96. mainLayout = QtGui.QVBoxLayout()
  97.  
  98. upcLayout.setAlignment(QtCore.Qt.AlignTop)
  99. totalLayout.setAlignment(QtCore.Qt.AlignBottom)
  100. self.itemsGridLayout.setAlignment(QtCore.Qt.AlignTop)
  101.  
  102.  
  103.  
  104. self.upc_entry = QtGui.QLineEdit(self)
  105. upcLayout.addWidget(self.upc_entry)
  106. self.upc_entry.setStyleSheet("QLabel { color : yellow; }")
  107. self.timeLabel = QtGui.QLabel(self)
  108. self.timeLabel.setText("")
  109. self.timeLabel.setStyleSheet("QLabel { color : yellow; font-size : 18pt;}")
  110.  
  111.  
  112. self.totalLabel = QtGui.QLabel(self)
  113. totalTextLabel = QtGui.QLabel(self)
  114. self.totalLabel.setStyleSheet("QLabel { color : yellow; font-size : 28pt;}")
  115. totalTextLabel.setStyleSheet("QLabel { color : yellow; font-size : 28pt;}")
  116. totalLayout.addWidget(totalTextLabel)
  117. totalLayout.addWidget(self.totalLabel)
  118. self.totalLabel.setAlignment(QtCore.Qt.AlignRight)
  119. totalTextLabel.setAlignment(QtCore.Qt.AlignLeft)
  120. self.totalLabel.setText("0")
  121. totalTextLabel.setText("Total:")
  122.  
  123.  
  124.  
  125.  
  126.  
  127. upcLayout.addWidget(self.timeLabel)
  128. upcLayout.addLayout(self.itemsGridLayout)
  129. mainLayout.addLayout(upcLayout)
  130. mainLayout.addLayout(totalLayout)
  131. self.mainWidget.setLayout(mainLayout)
  132. self.setCentralWidget(self.mainWidget)
  133. self.overlay = Overlay(self.centralWidget())
  134. self.overlay.hide()
  135.  
  136.  
  137.  
  138. self.setWindowTitle('SnackOverflow')
  139. self.show()
  140.  
  141. def keyPressEvent(self, event):
  142. key = event.key()
  143. if key == QtCore.Qt.Key_Return or key == QtCore.Qt.Key_Enter:
  144. upc = self.upc_entry.text()
  145. self.cur.execute("SELECT * FROM items")
  146. res = self.cur.fetchall()
  147. for row in res:
  148. if upc == row[0]:
  149. price = Decimal(row[3])
  150. alias = row[2]
  151. name = row[1]
  152.  
  153. self.add_item(upc,name,alias,price)
  154. self.update_total()
  155.  
  156. self._resetTimer()
  157. self.timeLabel.setText("Resetting in {0} s".format(self.reset_time))
  158. self._startTimer()
  159. else:
  160. print "Invalid UPC"
  161. self.upc_entry.clear()
  162.  
  163. def resizeEvent(self, event):
  164. self.overlay.resize(event.size())
  165. event.accept()
  166.  
  167.  
  168. def addWorker(self, worker):
  169. worker.message.connect(self.printMessage, QtCore.Qt.QueuedConnection)
  170. # connect the finished signal to method so that we are notified
  171. worker.finished.connect(self.workersFinished)
  172. self.threads.append(worker)
  173.  
  174. def startWorkers(self):
  175. for worker in self.threads:
  176. worker.start()
  177. # no wait, no finished. you start the threads and leave.
  178.  
  179. def workersFinished(self):
  180. if all(worker.isFinished() for worker in self.threads):
  181. # wait until all the threads finished
  182. #QtCore.QCoreApplication.instance().quit()
  183. print("Thread done")
  184.  
  185. @QtCore.Slot(str)
  186. def printMessage(self, rfid):
  187. self.cur.execute("SELECT rfid, name, balance, picture from students")
  188. self.students_dic = self.cur.fetchall()
  189.  
  190. foundID = False
  191. if rfid != "-" and not self.mainWidget.showingPic:
  192. for row in self.students_dic:
  193. if rfid == row[0]:
  194. foundID = True
  195. name = row[1]
  196. balance = Decimal(row[2])
  197. picture = row[3]
  198.  
  199. total = 0
  200. for i in self.total:
  201. total += i[3]
  202. balance -= Decimal(total)
  203.  
  204. print("Found RFID!")
  205. print("Amount to charge is " + str(total))
  206.  
  207. exec_string = "UPDATE students SET (balance) = (" + str(balance) + ") WHERE rfid = '"+str(rfid)+"'"
  208. self.cur.execute(exec_string)
  209.  
  210. print("Balance = " + str(balance))
  211.  
  212. print(picture)
  213. self.overlay.changePic("./{0}/1.PNG".format(picture))
  214. self.overlay.changeAttributes(name,balance,total)
  215. self.overlay.show()
  216.  
  217. monthYear = time.strftime("%b %Y", time.localtime())
  218. day = time.strftime("%d", time.localtime())
  219. monthDir = "./{0}".format(monthYear)
  220. hms = time.strftime("%H-%M-%S", time.localtime())
  221.  
  222. if not os.path.exists(monthDir):
  223. os.makedirs(monthDir)
  224.  
  225. with open(monthDir+"/{0}.csv".format(day),"a+") as f:
  226. for i in self.total:
  227. f.write("{0},{1},{2},{3},{4}\n".format(hms,name,i[0],i[1],i[3]))
  228. with open(monthDir+"/total.csv","a+") as f:
  229. for i in self.total:
  230. f.write("{0},{1},{2},{3},{4}\n".format(hms,name,i[0],i[1],i[3]))
  231.  
  232. self.clear()
  233.  
  234. if not foundID:
  235. print("Could not find ID in database")
  236. self.add_rfid = AddRFID(self.cur,rfid)
  237. foundID = False
  238.  
  239.  
  240. else:
  241. print("No RFID registered yet")
  242.  
  243. def clear(self):
  244.  
  245.  
  246.  
  247. self.timeLabel.setText("")
  248. self.upc_entry.clear()
  249. self.total = []
  250. self.totalLabel.setText("0")
  251. self._stopTimer()
  252. self._resetTimer()
  253.  
  254. for i in range(0,self.itemsGridLayout.rowCount()*2):
  255. item = self.itemsGridLayout.itemAt(0)
  256. if item is not None:
  257. widget = item.widget()
  258. if widget is not None:
  259. self.itemsGridLayout.removeWidget(widget)
  260. widget.deleteLater()
  261.  
  262.  
  263. def add_item(self,upc,name,alias,price):
  264. self.total.append((upc,name,alias,price))
  265. rows = self.itemsGridLayout.rowCount()
  266.  
  267. itemName = QtGui.QLabel()
  268. itemName.setText(alias)
  269. itemPrice = QtGui.QLabel()
  270. itemPrice.setText(str(price))
  271.  
  272. itemPrice.setStyleSheet("QLabel { color : yellow; font-size : 22pt;}")
  273. itemName.setStyleSheet("QLabel { color : yellow; font-size : 22pt;}")
  274.  
  275. itemPrice.setAlignment(QtCore.Qt.AlignRight)
  276. self.itemsGridLayout.addWidget(itemName,rows,0)
  277. self.itemsGridLayout.addWidget(itemPrice,rows,1)
  278.  
  279. def update_total(self):
  280. total = 0
  281. for i in self.total:
  282. total += i[3]
  283. self.totalLabel.setText(str(total))
  284.  
  285. def _startTimer(self):
  286. if not self._running:
  287. self.clk.start()
  288. self._start = time.time() - self._elapsedtime
  289. self._update()
  290. self._running = True
  291.  
  292. def _stopTimer(self):
  293. if self._running:
  294. self.clk.stop()
  295. self._running = False
  296. self.timeLabel.setText("")
  297. self.clear()
  298.  
  299. def _resetTimer(self):
  300. if self._elapsedtime:
  301. self._start = time.time()
  302. self._elapsedtime = 0.0
  303. self._setTime(self._elapsedtime)
  304. self.timeLabel.setText("")
  305.  
  306.  
  307. def _update(self):
  308. if self._running:
  309. self._elapsedtime = time.time() - self._start
  310. self._setTime(self._elapsedtime)
  311.  
  312.  
  313.  
  314. def _setTime(self, elap):
  315. minutes = int(elap/60)
  316. seconds = int(elap - minutes*60.0)
  317.  
  318.  
  319. if self._elapsedtime<self.reset_time:
  320. self.timeLabel.setText("Resetting in {0} s".format(self.reset_time-seconds))
  321. else:
  322. self.timeLabel.setText("")
  323. self._stopTimer()
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330. def main():
  331. app = QtGui.QApplication(sys.argv)
  332. ex = SnackOverflow()
  333. ex.startWorkers()
  334. sys.exit(app.exec_())
  335. if __name__ == '__main__':
  336. main()
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356. #def RFID_read_loop(self):
  357. # (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
  358. # if status == MIFAREReader.MI_OK:
  359. # print "Card detected"
  360. # (status,backData) = MIFAREReader.MFRC522_Anticoll()
  361. # if status == MIFAREReader.MI_OK:
  362. # print "Card read UID: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4])
  363. # rfid = str(backData[0])+str(backData[1])+str(backData[2])+str(backData[3])+str(backData[4])
  364. # for row in self.students_dic:
  365. # if backData == row[0]:
  366. # balance = Decimal(row[2])
  367. # total = 0
  368. # for i in total:
  369. # total += i
  370. # exec_string = "UPDATE students SET (balance) = (" + str(balance-total) + ") WHERE rfid = '"+str(rfid)+"'"
  371. # self.cur.execute(exec_string)
  372. # else:
  373. # print("Could not find ID in database")
  374. # self.total = []
  375.  
  376.  
  377. ####### CREATE NEW TABLE
  378. # try:
  379. # cur.execute('''CREATE TABLE COMPANY
  380. # (ID INT PRIMARY KEY NOT NULL,
  381. # NAME TEXT NOT NULL,
  382. # AGE INT NOT NULL,
  383. # ADDRESS CHAR(50),
  384. # SALARY REAL);''')
  385. # except:
  386. # print("Something went wrong when trying to create the table")
  387. # print "Table created successfully"
  388. #######
  389.  
  390. ####### INSERT NEW VALUE
  391. #self.cur.execute("INSERT INTO students (name,rfid,balance) \
  392. # VALUES ('Jakob Løver',123456,100)");
  393.  
  394. ######
  395.  
  396. ###### EXTRACT DATA
  397. # self.cur.execute("SELECT student_id, name, balance from students")
  398. # rows = self.cur.fetchall()
  399. # for row in rows:
  400. # print "ID = ", row[0]
  401. # print "NAME = ", row[1]
  402. # print "BALANCE = ", row[2], "\n"
  403. ######
  404.  
  405.  
  406. #self.cur.execute("INSERT INTO students (name,rfid,balance) \
  407. # VALUES ('Jakob Løver',123456,100)");
  408.  
  409. #self.cur.execute("SELECT upc, name, alias, price from items")
  410. #rows = self.cur.fetchall()
  411. # stud_id = self.upc_entry.text()
  412. # for row in rows:
  413. # if stud_id == row[0]:
  414. # print "ID = ", row[0]
  415. # print "NAME = ", row[1]
  416. # print "BALANCE = ", row[2], "\n"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement