Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding=utf-8
- from threading import Thread
- from PySide import QtCore
- from threading import Thread
- from time import sleep
- import time
- import psycopg2
- import sys
- from PySide import QtCore,QtGui
- from decimal import Decimal
- import os
- from overlay import Overlay
- from insert_rfid import AddRFID
- import MFRC522
- import signal
- #TODO:
- #random bilder, ikke bare første
- #legge til dato på csv total for mnd
- #system for å legge til studkort og nye varer
- class MyWorkerThread(QtCore.QThread):
- message = QtCore.Signal(str)
- def __init__(self, id, parent=None):
- super(MyWorkerThread, self).__init__(parent)
- self.id = id
- self.MIFAREReader = MFRC522.MFRC522()
- def run(self):
- while True:
- (status,TagType) = self.MIFAREReader.MFRC522_Request(self.MIFAREReader.PICC_REQIDL)
- (status,backData) = self.MIFAREReader.MFRC522_Anticoll()
- if status == self.MIFAREReader.MI_OK:
- rfid = str(backData[0])+str(backData[1])+str(backData[2])+str(backData[3])+str(backData[4])
- self.message.emit(rfid)
- else:
- self.message.emit("-")
- sleep(0.3)
- class SnackOverflow(QtGui.QMainWindow):
- def __init__(self):
- super(SnackOverflow, self).__init__()
- try:
- self.conn = psycopg2.connect(database="snackoverflow", user="postgres", password="admin", host="10.0.1.4", port="5432")
- self.conn.autocommit = True
- print("Opened database successfully")
- except:
- print "Could not connect to database"
- self.cur = self.conn.cursor()
- self.threads = []
- self.addWorker(MyWorkerThread(1))
- self.total = []
- self.initUI()
- self.cur.execute("SELECT rfid, name, balance from students")
- self.students_dic = self.cur.fetchall()
- print(self.students_dic)
- self.clk = QtCore.QTimer(self)
- self.clk.setInterval(100)
- self.clk.setSingleShot(False)
- self.connect(self.clk, QtCore.SIGNAL("timeout()"), self._update)
- self._start = 0.0
- self._elapsedtime = 0.0
- self._running = 0
- self.e = 0
- self.m = 0
- self.today = time.strftime("%d %b %Y %H-%M-%S", time.localtime())
- self.reset_time = 10
- print(self.today)
- #self.outputTimer = QtCore.QTimer()
- #self.connect(self.outputTimer, QtCore.SIGNAL('timeout()'), QtCore.SLOT("RFID_read_loop()"))
- #self.outputTimer.start(100)
- def initUI(self):
- self.setStyleSheet("QMainWindow {background: 'black';}")
- self.mainWidget = QtGui.QWidget()
- self.mainWidget.showingPic = False
- upcLayout = QtGui.QVBoxLayout()
- self.itemsGridLayout = QtGui.QGridLayout()
- totalLayout = QtGui.QHBoxLayout()
- mainLayout = QtGui.QVBoxLayout()
- upcLayout.setAlignment(QtCore.Qt.AlignTop)
- totalLayout.setAlignment(QtCore.Qt.AlignBottom)
- self.itemsGridLayout.setAlignment(QtCore.Qt.AlignTop)
- self.upc_entry = QtGui.QLineEdit(self)
- upcLayout.addWidget(self.upc_entry)
- self.upc_entry.setStyleSheet("QLabel { color : yellow; }")
- self.timeLabel = QtGui.QLabel(self)
- self.timeLabel.setText("")
- self.timeLabel.setStyleSheet("QLabel { color : yellow; font-size : 18pt;}")
- self.totalLabel = QtGui.QLabel(self)
- totalTextLabel = QtGui.QLabel(self)
- self.totalLabel.setStyleSheet("QLabel { color : yellow; font-size : 28pt;}")
- totalTextLabel.setStyleSheet("QLabel { color : yellow; font-size : 28pt;}")
- totalLayout.addWidget(totalTextLabel)
- totalLayout.addWidget(self.totalLabel)
- self.totalLabel.setAlignment(QtCore.Qt.AlignRight)
- totalTextLabel.setAlignment(QtCore.Qt.AlignLeft)
- self.totalLabel.setText("0")
- totalTextLabel.setText("Total:")
- upcLayout.addWidget(self.timeLabel)
- upcLayout.addLayout(self.itemsGridLayout)
- mainLayout.addLayout(upcLayout)
- mainLayout.addLayout(totalLayout)
- self.mainWidget.setLayout(mainLayout)
- self.setCentralWidget(self.mainWidget)
- self.overlay = Overlay(self.centralWidget())
- self.overlay.hide()
- self.setWindowTitle('SnackOverflow')
- self.show()
- def keyPressEvent(self, event):
- key = event.key()
- if key == QtCore.Qt.Key_Return or key == QtCore.Qt.Key_Enter:
- upc = self.upc_entry.text()
- self.cur.execute("SELECT * FROM items")
- res = self.cur.fetchall()
- for row in res:
- if upc == row[0]:
- price = Decimal(row[3])
- alias = row[2]
- name = row[1]
- self.add_item(upc,name,alias,price)
- self.update_total()
- self._resetTimer()
- self.timeLabel.setText("Resetting in {0} s".format(self.reset_time))
- self._startTimer()
- else:
- print "Invalid UPC"
- self.upc_entry.clear()
- def resizeEvent(self, event):
- self.overlay.resize(event.size())
- event.accept()
- def addWorker(self, worker):
- worker.message.connect(self.printMessage, QtCore.Qt.QueuedConnection)
- # connect the finished signal to method so that we are notified
- worker.finished.connect(self.workersFinished)
- self.threads.append(worker)
- def startWorkers(self):
- for worker in self.threads:
- worker.start()
- # no wait, no finished. you start the threads and leave.
- def workersFinished(self):
- if all(worker.isFinished() for worker in self.threads):
- # wait until all the threads finished
- #QtCore.QCoreApplication.instance().quit()
- print("Thread done")
- @QtCore.Slot(str)
- def printMessage(self, rfid):
- self.cur.execute("SELECT rfid, name, balance, picture from students")
- self.students_dic = self.cur.fetchall()
- foundID = False
- if rfid != "-" and not self.mainWidget.showingPic:
- for row in self.students_dic:
- if rfid == row[0]:
- foundID = True
- name = row[1]
- balance = Decimal(row[2])
- picture = row[3]
- total = 0
- for i in self.total:
- total += i[3]
- balance -= Decimal(total)
- print("Found RFID!")
- print("Amount to charge is " + str(total))
- exec_string = "UPDATE students SET (balance) = (" + str(balance) + ") WHERE rfid = '"+str(rfid)+"'"
- self.cur.execute(exec_string)
- print("Balance = " + str(balance))
- print(picture)
- self.overlay.changePic("./{0}/1.PNG".format(picture))
- self.overlay.changeAttributes(name,balance,total)
- self.overlay.show()
- monthYear = time.strftime("%b %Y", time.localtime())
- day = time.strftime("%d", time.localtime())
- monthDir = "./{0}".format(monthYear)
- hms = time.strftime("%H-%M-%S", time.localtime())
- if not os.path.exists(monthDir):
- os.makedirs(monthDir)
- with open(monthDir+"/{0}.csv".format(day),"a+") as f:
- for i in self.total:
- f.write("{0},{1},{2},{3},{4}\n".format(hms,name,i[0],i[1],i[3]))
- with open(monthDir+"/total.csv","a+") as f:
- for i in self.total:
- f.write("{0},{1},{2},{3},{4}\n".format(hms,name,i[0],i[1],i[3]))
- self.clear()
- if not foundID:
- print("Could not find ID in database")
- self.add_rfid = AddRFID(self.cur,rfid)
- foundID = False
- else:
- print("No RFID registered yet")
- def clear(self):
- self.timeLabel.setText("")
- self.upc_entry.clear()
- self.total = []
- self.totalLabel.setText("0")
- self._stopTimer()
- self._resetTimer()
- for i in range(0,self.itemsGridLayout.rowCount()*2):
- item = self.itemsGridLayout.itemAt(0)
- if item is not None:
- widget = item.widget()
- if widget is not None:
- self.itemsGridLayout.removeWidget(widget)
- widget.deleteLater()
- def add_item(self,upc,name,alias,price):
- self.total.append((upc,name,alias,price))
- rows = self.itemsGridLayout.rowCount()
- itemName = QtGui.QLabel()
- itemName.setText(alias)
- itemPrice = QtGui.QLabel()
- itemPrice.setText(str(price))
- itemPrice.setStyleSheet("QLabel { color : yellow; font-size : 22pt;}")
- itemName.setStyleSheet("QLabel { color : yellow; font-size : 22pt;}")
- itemPrice.setAlignment(QtCore.Qt.AlignRight)
- self.itemsGridLayout.addWidget(itemName,rows,0)
- self.itemsGridLayout.addWidget(itemPrice,rows,1)
- def update_total(self):
- total = 0
- for i in self.total:
- total += i[3]
- self.totalLabel.setText(str(total))
- def _startTimer(self):
- if not self._running:
- self.clk.start()
- self._start = time.time() - self._elapsedtime
- self._update()
- self._running = True
- def _stopTimer(self):
- if self._running:
- self.clk.stop()
- self._running = False
- self.timeLabel.setText("")
- self.clear()
- def _resetTimer(self):
- if self._elapsedtime:
- self._start = time.time()
- self._elapsedtime = 0.0
- self._setTime(self._elapsedtime)
- self.timeLabel.setText("")
- def _update(self):
- if self._running:
- self._elapsedtime = time.time() - self._start
- self._setTime(self._elapsedtime)
- def _setTime(self, elap):
- minutes = int(elap/60)
- seconds = int(elap - minutes*60.0)
- if self._elapsedtime<self.reset_time:
- self.timeLabel.setText("Resetting in {0} s".format(self.reset_time-seconds))
- else:
- self.timeLabel.setText("")
- self._stopTimer()
- def main():
- app = QtGui.QApplication(sys.argv)
- ex = SnackOverflow()
- ex.startWorkers()
- sys.exit(app.exec_())
- if __name__ == '__main__':
- main()
- #def RFID_read_loop(self):
- # (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
- # if status == MIFAREReader.MI_OK:
- # print "Card detected"
- # (status,backData) = MIFAREReader.MFRC522_Anticoll()
- # if status == MIFAREReader.MI_OK:
- # print "Card read UID: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4])
- # rfid = str(backData[0])+str(backData[1])+str(backData[2])+str(backData[3])+str(backData[4])
- # for row in self.students_dic:
- # if backData == row[0]:
- # balance = Decimal(row[2])
- # total = 0
- # for i in total:
- # total += i
- # exec_string = "UPDATE students SET (balance) = (" + str(balance-total) + ") WHERE rfid = '"+str(rfid)+"'"
- # self.cur.execute(exec_string)
- # else:
- # print("Could not find ID in database")
- # self.total = []
- ####### CREATE NEW TABLE
- # try:
- # cur.execute('''CREATE TABLE COMPANY
- # (ID INT PRIMARY KEY NOT NULL,
- # NAME TEXT NOT NULL,
- # AGE INT NOT NULL,
- # ADDRESS CHAR(50),
- # SALARY REAL);''')
- # except:
- # print("Something went wrong when trying to create the table")
- # print "Table created successfully"
- #######
- ####### INSERT NEW VALUE
- #self.cur.execute("INSERT INTO students (name,rfid,balance) \
- # VALUES ('Jakob Løver',123456,100)");
- ######
- ###### EXTRACT DATA
- # self.cur.execute("SELECT student_id, name, balance from students")
- # rows = self.cur.fetchall()
- # for row in rows:
- # print "ID = ", row[0]
- # print "NAME = ", row[1]
- # print "BALANCE = ", row[2], "\n"
- ######
- #self.cur.execute("INSERT INTO students (name,rfid,balance) \
- # VALUES ('Jakob Løver',123456,100)");
- #self.cur.execute("SELECT upc, name, alias, price from items")
- #rows = self.cur.fetchall()
- # stud_id = self.upc_entry.text()
- # for row in rows:
- # if stud_id == row[0]:
- # print "ID = ", row[0]
- # print "NAME = ", row[1]
- # print "BALANCE = ", row[2], "\n"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement