diff --git a/.gitIgnore b/.gitIgnore index b3a4eded7e783af755537bce552574d2367d2bec..e47a2094745063755a5aca6a35db6aa378b85503 100644 --- a/.gitIgnore +++ b/.gitIgnore @@ -1,3 +1,7 @@ CreateDB.py venv -*.sql \ No newline at end of file +*.sql +practice/ +dataset/ +ui/ +__pycache__/ diff --git a/src/features/WaitingList.py b/src/features/WaitingList.py new file mode 100644 index 0000000000000000000000000000000000000000..4cfdba29a6093ddfd56d8e8acbcf0efee6e88ab9 --- /dev/null +++ b/src/features/WaitingList.py @@ -0,0 +1,120 @@ +import mysql.connector +from PyQt5 import QtCore, QtGui, QtWidgets + +class QueryWaitingList: + def __init__(self): + self.con = mysql.connector.connect( + host = 'localhost', + user = 'root', + password = '', + db = 'toptrackr',) + + self.dbcursor = self.con.cursor() + + + def getDataCustomerWaitingList(self): + data = self.dbcursor.execute("SELECT IDCustomer, FirstName, LastName, Email, contact_number, card_number FROM customer JOIN waiting_list ON customer.IDCustomer = waiting_list.IDCustomerPremium") + data = self.dbcursor.fetchall() + return data + + def addCustomerPremium(self, id_customer_premium, contact_number, card_number): + self.dbcursor.execute("INSERT INTO customer_premium(id_customer_premium, contact_number, card_number) VALUES (%s, %s, %s)", (id_customer_premium, contact_number, card_number)) + self.con.commit() + + def deleteCustomerFromWaitingList(self, id_customer_premium): + self.dbcursor.execute(f"DELETE FROM waiting_list WHERE IDCustomerPremium = {id_customer_premium}") + self.con.commit() + +class Ui_WaitingList(object): + def setupUi(self, WaitingList): + WaitingList.setObjectName("WaitingList") + WaitingList.resize(712, 588) + self.WaitingListTable = QtWidgets.QTableWidget(WaitingList) + self.WaitingListTable.setGeometry(QtCore.QRect(10, 10, 691, 471)) + self.WaitingListTable.setObjectName("WaitingListTable") + self.WaitingListTable.setColumnCount(6) + self.WaitingListTable.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.WaitingListTable.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.WaitingListTable.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.WaitingListTable.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.WaitingListTable.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.WaitingListTable.setHorizontalHeaderItem(4, item) + item = QtWidgets.QTableWidgetItem() + self.WaitingListTable.setHorizontalHeaderItem(5, item) + + self.WaitingListTable.verticalHeader().setDefaultSectionSize(40) + self.WaitingListTable.setColumnWidth(5, 150) + + self.loadData() + + self.retranslateUi(WaitingList) + QtCore.QMetaObject.connectSlotsByName(WaitingList) + + def retranslateUi(self, WaitingList): + _translate = QtCore.QCoreApplication.translate + WaitingList.setWindowTitle(_translate("WaitingList", "Frame")) + item = self.WaitingListTable.horizontalHeaderItem(0) + item.setText(_translate("WaitingList", "ID Customer")) + item = self.WaitingListTable.horizontalHeaderItem(1) + item.setText(_translate("WaitingList", "Full Name")) + item = self.WaitingListTable.horizontalHeaderItem(2) + item.setText(_translate("WaitingList", "New Column")) + item = self.WaitingListTable.horizontalHeaderItem(3) + item.setText(_translate("WaitingList", "Credit Number")) + item = self.WaitingListTable.horizontalHeaderItem(4) + item.setText(_translate("WaitingList", "Contact Number")) + item = self.WaitingListTable.horizontalHeaderItem(5) + item.setText(_translate("WaitingList", "Verification")) + + def loadData(self): + db = QueryWaitingList() + data = db.getDataCustomerWaitingList() + self.WaitingListTable.setRowCount(len(data)) + + tableRow = 0 + for row in data: + self.WaitingListTable.setItem(tableRow, 0, QtWidgets.QTableWidgetItem(str(row[0]))) + self.WaitingListTable.setItem(tableRow, 1, QtWidgets.QTableWidgetItem(row[1] + ' ' + row[2])) + self.WaitingListTable.setItem(tableRow, 2, QtWidgets.QTableWidgetItem(row[3])) + self.WaitingListTable.setItem(tableRow, 3, QtWidgets.QTableWidgetItem(row[4])) + self.WaitingListTable.setItem(tableRow, 4, QtWidgets.QTableWidgetItem(row[5])) + + layout = QtWidgets.QHBoxLayout() + acceptBtn = QtWidgets.QPushButton("Accept", clicked= lambda : self.accept(data[int(acceptBtn.sender().objectName())][0], data[int(acceptBtn.sender().objectName())][4], data[int(acceptBtn.sender().objectName())][5])) + acceptBtn.setObjectName(str(tableRow)) + rejectBtn = QtWidgets.QPushButton("Reject", clicked= lambda : self.reject(data[int(rejectBtn.sender().objectName())][0])) + rejectBtn.setObjectName(str(tableRow)) + layout.addWidget(acceptBtn) + layout.addWidget(rejectBtn) + + cellWidget = QtWidgets.QWidget() + cellWidget.setLayout(layout) + + self.WaitingListTable.setCellWidget(tableRow, 5, cellWidget) + + tableRow += 1 + + def accept(self, id_customer_premium, contact_number, card_number): + db = QueryWaitingList() + db.addCustomerPremium(id_customer_premium, contact_number, card_number) + db.deleteCustomerFromWaitingList(id_customer_premium) + self.loadData() + + def reject(self, id_customer_premium): + db = QueryWaitingList() + db.deleteCustomerFromWaitingList(id_customer_premium) + self.loadData() + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + WaitingList = QtWidgets.QFrame() + ui = Ui_WaitingList() + ui.setupUi(WaitingList) + WaitingList.show() + sys.exit(app.exec_()) \ No newline at end of file diff --git a/src/features/__pycache__/db.cpython-39.pyc b/src/features/__pycache__/db.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..468628ebc68c4bab6cc4bb6dc2091f157115253a Binary files /dev/null and b/src/features/__pycache__/db.cpython-39.pyc differ diff --git a/src/features/db.py b/src/features/db.py new file mode 100644 index 0000000000000000000000000000000000000000..b9e18fc949188e38dc37cb98bb149cda60cf3ed7 --- /dev/null +++ b/src/features/db.py @@ -0,0 +1,14 @@ +import mysql.connector + +# ! Temporary credential +id_cred = 101 +name_cred = "Ferguso" + +db = mysql.connector.connect( + host="localhost", + user="root", + passwd="root", + database="toptrackr" +) + +mycursor = db.cursor() \ No newline at end of file diff --git a/src/features/input_data.py b/src/features/input_data.py new file mode 100644 index 0000000000000000000000000000000000000000..a2f20f215fa7c1f082f58d90ed5f33a154c76341 --- /dev/null +++ b/src/features/input_data.py @@ -0,0 +1,116 @@ +from PyQt5 import QtCore, QtGui, QtWidgets +from db import db, mycursor, id_cred +import datetime + +class input_data(QtWidgets.QWidget): + def __init__(self): + super().__init__() + self.Frame = QtWidgets.QFrame() + self.setupUi() + self.Frame.show() + + def setupUi(self): + self.Frame.setObjectName("Frame") + self.Frame.resize(376, 280) + self.Frame.setStyleSheet("background-color: rgb(238, 238, 238);") + self.Frame.setFrameShape(QtWidgets.QFrame.Panel) + self.Frame.setFrameShadow(QtWidgets.QFrame.Raised) + + self.setupComboBox() + self.setupButtonBox() + self.setupDateInput() + self.setupLabel() + self.setupMeasureInput() + + self.retranslateUi() + QtCore.QMetaObject.connectSlotsByName(self.Frame) + + def setupComboBox(self): # * Combobox - kendaraan atau listrik + self.comboBox = QtWidgets.QComboBox(self.Frame) + self.comboBox.setGeometry(QtCore.QRect(50, 20, 241, 31)) + self.comboBox.setFont(self.createFont("Lucida Console", 10)) + self.comboBox.setEditable(False) + self.comboBox.setObjectName("comboBox") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.setItemIcon(0, QtGui.QIcon('src/resources/img/lamp.png')) + self.comboBox.setItemIcon(1, QtGui.QIcon('src/resources/img/motorbike.png')) + self.comboBox.currentTextChanged.connect(self.changeUnit) + + def setupButtonBox(self): # * Button save or discard + self.buttonBox = QtWidgets.QDialogButtonBox(self.Frame) + self.buttonBox.setGeometry(QtCore.QRect(210, 240, 156, 23)) + self.buttonBox.setFont(self.createFont("Lucida Console", 10)) + self.buttonBox.setAcceptDrops(False) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Save) + self.buttonBox.setObjectName("buttonBox") + self.buttonBox.accepted.connect(self.save) + self.buttonBox.rejected.connect(self.discard) + + def setupDateInput(self): # * Date Input + self.dateEdit = QtWidgets.QDateEdit(self.Frame) + self.dateEdit.setGeometry(QtCore.QRect(110, 100, 121, 31)) + self.dateEdit.setFont(self.createFont("Lucida Console", 10)) + self.dateEdit.setObjectName("dateEdit") + + def setupLabel(self): # * Label + self.label = QtWidgets.QLabel(self.Frame) + self.label.setGeometry(QtCore.QRect(240, 150, 71, 16)) + self.label.setFont(self.createFont("Lucida Console", 10)) + self.label.setObjectName("label") + + def setupMeasureInput(self): # * Measurement input + self.doubleSpinBox = QtWidgets.QDoubleSpinBox(self.Frame) + self.doubleSpinBox.setGeometry(QtCore.QRect(110, 140, 121, 31)) + self.doubleSpinBox.setFont(self.createFont("Lucida Console", 10)) + self.doubleSpinBox.setObjectName("doubleSpinBox") + + def retranslateUi(self): + _translate = QtCore.QCoreApplication.translate + self.Frame.setWindowTitle(_translate("Frame", "Frame")) + self.comboBox.setItemText(0, _translate("Frame", "Listrik")) + self.comboBox.setItemText(1, _translate("Frame", "Kendaraan bermotor")) + self.label.setText(_translate("Frame", "kWh")) + + def discard(self): + pass + # Go back to summary window + + def save(self): + inDatabase = False + dateInForm = self.dateEdit.date().toPyDate().strftime('%Y-%m-%d') + mycursor.execute(f"SELECT EXISTS(SELECT * FROM carbon_trace WHERE TanggalInput = '{dateInForm}' AND ID_Customer = {id_cred})") + for x in mycursor: + if x[0] == 1: + inDatabase = True + break + + if inDatabase: + if self.comboBox.currentText() == "Listrik": + mycursor.execute(f"UPDATE carbon_trace SET KuantitasListrik = {self.doubleSpinBox.value()} WHERE TanggalInput = '{dateInForm}' AND ID_Customer = {id_cred}") + else: + mycursor.execute(f"UPDATE carbon_trace SET KuantitasJarakMotor = {self.doubleSpinBox.value()} WHERE TanggalInput = '{dateInForm}' AND ID_Customer = {id_cred}") + else: + if self.comboBox.currentText() == "Listrik": + mycursor.execute(f"INSERT INTO carbon_trace (ID_Customer, TanggalInput, KuantitasListrik) VALUES ({id_cred}, '{dateInForm}', {self.doubleSpinBox.value()} )") + else: + mycursor.execute(f"INSERT INTO carbon_trace (ID_Customer, TanggalInput, KuantitasJarakMotor) VALUES ({id_cred}, '{dateInForm}', {self.doubleSpinBox.value()} )") + db.commit() + + def changeUnit(self): + if self.comboBox.currentText() == "Listrik": + self.label.setText("kWh") + else: + self.label.setText("km") + + def createFont(self, fontName, fontSize): + font = QtGui.QFont() + font.setFamily(fontName) + font.setPointSize(fontSize) + return font + +# if __name__ == "__main__": +# import sys +# app = QtWidgets.QApplication(sys.argv) +# ui = input_data() +# sys.exit(app.exec_()) \ No newline at end of file diff --git a/src/features/progress_bar_pallete.py b/src/features/progress_bar_pallete.py new file mode 100644 index 0000000000000000000000000000000000000000..f0f9aaa4c2fcae0ac6ac5dd7682c271354ce0c56 --- /dev/null +++ b/src/features/progress_bar_pallete.py @@ -0,0 +1,27 @@ +default = """ +QProgressBar{ + border: 2px solid grey; + border-radius: 5px; + text-align: center +} + +QProgressBar::chunk { + background-color: green; + width: 10px; + margin: 1px; +} +""" + +overload = """ +QProgressBar{ + border: 2px solid grey; + border-radius: 5px; + text-align: center +} + +QProgressBar::chunk { + background-color: red; + width: 10px; + margin: 1px; +} +""" \ No newline at end of file diff --git a/src/features/summary_data.py b/src/features/summary_data.py new file mode 100644 index 0000000000000000000000000000000000000000..a6893a908a434d4b1ca5687fca27d8e19f774dc3 --- /dev/null +++ b/src/features/summary_data.py @@ -0,0 +1,236 @@ +from PyQt5 import QtCore, QtGui, QtWidgets +from db import db, mycursor, name_cred +from datetime import date, datetime +from input_data import * +from progress_bar_pallete import * + +performance = { + "Buruk": f"You can try to do better, upgrade to\npremium and see our tips and trick", + "Menengah": f"You are doing great, but you can do better\nby upgrade to premium and see the tips and trick", + "Baik": f"You are doing excellent job\nto decrease the emission" +} + +class summary_data(QtWidgets.QWidget): + def __init__(self): + super().__init__() + self.Frame = QtWidgets.QFrame() + self.setupUi() + self.Frame.show() + + def setupUi(self): + self.Frame.setObjectName("Frame") + self.Frame.resize(696, 491) + self.Frame.setStyleSheet("background-color: rgb(238, 238, 238);") + self.Frame.setFrameShape(QtWidgets.QFrame.Panel) + self.Frame.setFrameShadow(QtWidgets.QFrame.Raised) + + self.setupLabel() + self.setupLabelTotal() + self.setupLabelElectricity() + self.setupLabelMotorbike() + self.setupProgressBar1() + self.setupProgressBar2() + self.setupPushButton() + self.setupPushButtonWeekly() + self.setupPushButtonMonthly() + + self.retranslateUi() + QtCore.QMetaObject.connectSlotsByName(self.Frame) + + # * Frame component + def setupLabel(self): + self.label = QtWidgets.QLabel(self.Frame) + self.label.setGeometry(QtCore.QRect(180, 20, 291, 81)) + self.label.setFont(self.createFont("Lucida Console", 10)) + self.label.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop) + self.label.setWordWrap(False) + self.label.setObjectName("label") + + def setupLabelTotal(self): + self.label_total = QtWidgets.QLabel(self.Frame) + self.label_total.setObjectName("label_total") + self.label_total.setGeometry(QtCore.QRect(30, 130, 621, 121)) + self.label_total.setFont(self.createFont("Lucida Console", 10)) + self.label_total.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop) + self.label_total.setWordWrap(False) + + def setupLabelElectricity(self): + self.label_electricity = QtWidgets.QLabel(self.Frame) + self.label_electricity.setObjectName("label_electricity") + self.label_electricity.setGeometry(QtCore.QRect(94, 279, 170, 81)) + self.label_electricity.setFont(self.createFont("Lucida Console", 10)) + self.label_electricity.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop) + self.label_electricity.setWordWrap(False) + + def setupLabelMotorbike(self): + self.label_motorbike = QtWidgets.QLabel(self.Frame) + self.label_motorbike.setObjectName("label_motorbike") + self.label_motorbike.setGeometry(QtCore.QRect(406, 280, 170, 81)) + self.label_motorbike.setFont(self.createFont("Lucida Console", 10)) + self.label_motorbike.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop) + self.label_motorbike.setWordWrap(False) + + def setupProgressBar1(self): + self.progressBarElectric = QtWidgets.QProgressBar(self.Frame) + self.progressBarElectric.setGeometry(QtCore.QRect(120, 370, 151, 31)) + self.progressBarElectric.setFont(self.createFont("Lucida Console", 10)) + self.progressBarElectric.setStyleSheet(default) + self.progressBarElectric.setObjectName("progressBarElectric") + + def setupProgressBar2(self): + self.progressBarMotor = QtWidgets.QProgressBar(self.Frame) + self.progressBarMotor.setGeometry(QtCore.QRect(430, 370, 151, 31)) + self.progressBarMotor.setFont(self.createFont("Lucida Console", 10)) + self.progressBarMotor.setStyleSheet(default) + self.progressBarMotor.setObjectName("progressBarMotor") + + def setupPushButton(self): + self.pushButton = QtWidgets.QPushButton(self.Frame) + self.pushButton.setGeometry(QtCore.QRect(270, 440, 131, 31)) + self.pushButton.setFont(self.createFont("Lucida Console", 10)) + self.pushButton.setObjectName("pushButton") + + def setupPushButtonWeekly(self): + self.pushButton_weekly = QtWidgets.QPushButton(self.Frame) + self.pushButton_weekly.setObjectName("pushButton_weekly") + self.pushButton_weekly.setGeometry(QtCore.QRect(210, 80, 91, 31)) + self.pushButton_weekly.setStyleSheet("background-color: rgb(41, 255, 148);") + self.pushButton_weekly.clicked.connect(lambda: self.updateContent("Weekly")) + self.pushButton_weekly.clicked.connect(lambda: self.setGreen("Weekly")) + + def setupPushButtonMonthly(self): + self.pushButton_monthly = QtWidgets.QPushButton(self.Frame) + self.pushButton_monthly.setObjectName("pushButton_monthly") + self.pushButton_monthly.setGeometry(QtCore.QRect(340, 80, 91, 31)) + self.pushButton_monthly.clicked.connect(lambda: self.updateContent("Monthly")) + self.pushButton_monthly.clicked.connect(lambda: self.setGreen("Monthly")) + + # * Set the initial filling + def retranslateUi(self): + _translate = QtCore.QCoreApplication.translate + self.Frame.setWindowTitle(_translate("Frame", "Frame")) + self.progressBarElectric.setFormat(_translate("Frame", "%p%")) + self.label.setText(_translate("Frame", f"{date.today().strftime('%d %B %Y')}\nHello, {name_cred}")) + self.pushButton.setText(_translate("Frame", "Catat Emisi [+]")) + self.pushButton_weekly.setText(_translate("Frame", "Weekly")) + self.pushButton_monthly.setText(_translate("Frame", "Monthly")) + self.updateContent("Weekly") + + # * Utility for filling + def createFont(self, fontName, fontSize): + font = QtGui.QFont() + font.setFamily(fontName) + font.setPointSize(fontSize) + return font + + def updateContent(self, period): + self.label_motorbike.setText(f"Motorbike summary\n{self.sumMotorbikeEmission(period)} km") + self.label_electricity.setText(f"Electricity summary\n{self.sumElectricityEmission(period)} kWh") + self.label_total.setText(f"Carbon dioxide total\n{self.sumCarbonDioxide(period)} gram CO2\n\n{self.getPerformanceText(period)}") + + p, q = self.getPercentValue(period) + self.progressBarElectric.setValue(int(p)) + self.progressBarMotor.setValue(int(q)) + + if p == 100: + self.progressBarElectric.setStyleSheet(overload) + else: + self.progressBarElectric.setStyleSheet(default) + + if q == 100: + self.progressBarMotor.setStyleSheet(overload) + else: + self.progressBarMotor.setStyleSheet(default) + + def getPercentValue(self, period): + if period == "Monthly": + percentValElectric = self.sumElectricityEmission("Weekly") / 127 * 100 + percentValMotor = self.sumMotorbikeEmission("Weekly") / 50 * 100 + p = min(100, percentValElectric) + q = min(100, percentValMotor) + return p,q + elif period == "Weekly": + percentValElectric = self.sumElectricityEmission("Monthly") / 893 * 100 + percentValMotor = self.sumMotorbikeEmission("Monthly") / 300 * 100 + p = min(100, percentValElectric) + q = min(100, percentValMotor) + return p,q + + def setGreen(self, period): + if period == "Weekly": + self.pushButton_weekly.setStyleSheet("background-color: rgb(41, 255, 148);") + self.pushButton_monthly.setStyleSheet("background-color: rgb(238, 238, 238);") + elif period == "Monthly": + self.pushButton_monthly.setStyleSheet("background-color: rgb(41, 255, 148);") + self.pushButton_weekly.setStyleSheet("background-color: rgb(238, 238, 238);") + + # * Measurement utility + def sumMotorbikeEmission(self, period): + if(period == "Weekly"): + dateBegin, dateLast = self.getRangeDate() + mycursor.execute(f"SELECT SUM(KuantitasJarakMotor) FROM carbon_trace WHERE ID_Customer = {id_cred} AND TanggalInput BETWEEN '{dateBegin}' AND '{dateLast}'") + elif(period == "Monthly"): + today = date.today() + # today = datetime.date(2022, 1, 14) # ! For testing + mycursor.execute(f"SELECT SUM(KuantitasJarakMotor) FROM carbon_trace WHERE ID_Customer = {id_cred} AND MONTH(TanggalInput) = {today.month} AND YEAR(TanggalInput) = {today.year}") + val = mycursor.fetchall() + if val[0][0] is None: + return 0 + return val[0][0] + + def sumElectricityEmission(self, period): + if(period == "Weekly"): + dateBegin, dateLast = self.getRangeDate() + mycursor.execute(f"SELECT SUM(KuantitasListrik) FROM carbon_trace WHERE ID_Customer = {id_cred} AND TanggalInput BETWEEN '{dateBegin}' AND '{dateLast}'") + elif(period == "Monthly"): + today = date.today() + # today = datetime.date(2022, 1, 14) # ! For testing + mycursor.execute(f"SELECT SUM(KuantitasListrik) FROM carbon_trace WHERE ID_Customer = {id_cred} AND MONTH(TanggalInput) = {today.month} AND YEAR(TanggalInput) = {today.year}") + val = mycursor.fetchall() + if val[0][0] is None: + return 0 + return val[0][0] + + def sumCarbonDioxide(self, period): + if(period == "Weekly"): + return (self.sumElectricityEmission("Weekly") * 385) + (self.sumMotorbikeEmission("Weekly") * 132) + elif(period == "Monthly"): + return (self.sumElectricityEmission("Monthly") * 385) + (self.sumMotorbikeEmission("Monthly") * 132) + + def getPerformanceText(self, period): + if period == "Weekly": + totalEmission = self.sumCarbonDioxide("Weekly") + if totalEmission <= 3000: + return performance["Baik"] + elif totalEmission > 3000 and totalEmission < 7000: + return performance["Menengah"] + else: + return performance["Buruk"] + elif period == "Monthly": + totalEmission = self.sumCarbonDioxide("Monthly") + if totalEmission <= 13000: + return performance["Baik"] + elif totalEmission > 13000 and totalEmission < 30000: + return performance["Menengah"] + else: + return performance["Buruk"] + + def getRangeDate(self): + today = date.today() + # today = datetime.date(2022, 1, 14) # ! For testing + if today.strftime("%A") == "Monday": + lastMonday = today + else: + lastMonday = today - datetime.timedelta(days=today.weekday()) + + if today.strftime("%A") == "Sunday": + nextSunday = today + else: + nextSunday = today + datetime.timedelta( (6-today.weekday()) % 7 ) + return lastMonday, nextSunday + +# if __name__ == "__main__": +# import sys +# app = QtWidgets.QApplication(sys.argv) +# ui = summary_data() +# sys.exit(app.exec_()) \ No newline at end of file diff --git a/src/resources/img/lamp.png b/src/resources/img/lamp.png new file mode 100644 index 0000000000000000000000000000000000000000..498af51e2b5ceee4c57665ad9b33434d2aadf3cd Binary files /dev/null and b/src/resources/img/lamp.png differ diff --git a/src/resources/img/motorbike.png b/src/resources/img/motorbike.png new file mode 100644 index 0000000000000000000000000000000000000000..6611ff46aa6ee7d1403e622f8cb82285acc2fac6 Binary files /dev/null and b/src/resources/img/motorbike.png differ