Skip to content
This repository was archived by the owner on Jun 14, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vscode/arduino.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"board": "arduino:avr:uno",
"programmer": "avrisp",
"port": "COM7",
"port": "COM9",
"sketch": "transmitter\\transmitter.ino"
}
9 changes: 1 addition & 8 deletions itemlist_retriever.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import json # used to convert string obtained from database to a dictionary
import time # used to sleep the program for a certain amount of time
from serial import Serial # used to connect to the serial port
from serial.tools import list_ports # used to list all the serial ports
import mysql.connector # used to connect to the database
from credentials import CREDENTIALS # used to store the credentials for the database
from os import name as os_name # used to check the operating system
Expand Down Expand Up @@ -78,12 +77,6 @@ def close(self):
self.ser.close()


class BotCommander:
def __init__(self, db, ser):
self.db = db
self.ser = ser


def main():
db = DatabaseConnection(CREDENTIALS)
ser = SerialConnection(BAUDRATE)
Expand Down Expand Up @@ -112,4 +105,4 @@ def main():

if __name__ == "__main__":
main()
# test()
# test()
108 changes: 108 additions & 0 deletions test_itemlist_retriever.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import unittest
from unittest.mock import patch
from itemlist_retriever import DatabaseConnection, SerialConnection


class TestDatabaseConnection(unittest.TestCase):
def setUp(self):
self.credentials = {
"host": "localhost",
"user": "root",
"password": "password",
"database": "test_db",
}
self.db = DatabaseConnection(self.credentials)

def test_fetch_all_items(self):
expected_items = {1: ["item1", "item2"], 2: ["item3", "item4"]}
with patch.object(self.db.conn, "cursor") as mock_cursor:
mock_cursor.return_value.fetchall.return_value = [
(1, '["item1", "item2"]'),
(2, '["item3", "item4"]'),
]
items_dict = self.db.fetch_all_items()
self.assertEqual(items_dict, expected_items)


class TestSerialConnection(unittest.TestCase):
def setUp(self):
self.baudrate = 9600
self.ser = SerialConnection(self.baudrate)

def test_write(self):
with patch.object(self.ser.ser, "write") as mock_write:
data = "test data"
self.ser.write(data)
mock_write.assert_called_once_with(data.encode())

def test_read(self):
with patch.object(self.ser.ser, "readline") as mock_readline:
mock_readline.return_value.decode.return_value = "test"
result = self.ser.read()
self.assertEqual(result, "test")

def test_close(self):
with patch.object(self.ser.ser, "close") as mock_close:
self.ser.close()
mock_close.assert_called_once()


if __name__ == "__main__":
unittest.main()
import unittest
from unittest.mock import patch
from itemlist_retriever import DatabaseConnection, SerialConnection, main


class TestDatabaseConnection(unittest.TestCase):
def setUp(self):
self.credentials = {
"host": "localhost",
"user": "root",
"password": "password",
"database": "test_db",
}
self.db = DatabaseConnection(self.credentials)

def test_fetch_all_items(self):
expected_items = {1: ["item1", "item2"], 2: ["item3", "item4"]}
with patch.object(self.db.conn, "cursor") as mock_cursor:
mock_cursor.return_value.fetchall.return_value = [
(1, '["item1", "item2"]'),
(2, '["item3", "item4"]'),
]
items_dict = self.db.fetch_all_items()
self.assertEqual(items_dict, expected_items)


class TestSerialConnection(unittest.TestCase):
def setUp(self):
self.baudrate = 9600
self.ser = SerialConnection(self.baudrate)

def test_write(self):
with patch.object(self.ser.ser, "write") as mock_write:
data = "test data"
self.ser.write(data)
mock_write.assert_called_once_with(data.encode())

def test_read(self):
with patch.object(self.ser.ser, "readline") as mock_readline:
mock_readline.return_value.decode.return_value = "test"
result = self.ser.read()
self.assertEqual(result, "test")

def test_close(self):
with patch.object(self.ser.ser, "close") as mock_close:
self.ser.close()
mock_close.assert_called_once()


class TestMain(unittest.TestCase):
def test_main(self):
# TODO: Add your test case for the main function here
pass


if __name__ == "__main__":
unittest.main()
63 changes: 60 additions & 3 deletions transmitter/transmitter.ino
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
// RST D9 D8
// 3.3V 3.3V 3.3V

#define servoPin 8 // Set servo pin
#define servoPin 3 // Set servo pin
String previousUID = "0"; // Do not change //
String previousRFIDUID = "0"; // Do not change //
String fromSerialUID = "0"; // Do not change //
Expand All @@ -25,8 +25,15 @@ int printCounter = 0; // Do not change //
int pickUpTimeout = 1500; // Set timeout for picking up item
int serialBaudRate = 9600; // Set serial baud rate
int optimizationDelay = 50; // Fine tune this value to optimize performance
int firstMainLoop = 1; // Do not change //
Servo myServo; // Do not change //
MFRC522 card(10, 9); // SDA, RST set up for MEGA
int motor1pin1 = 2; // pin 2 on L293D
int motor1pin2 = 4; // pin 7 on L293D
int motor2pin1 = 7; // pin 10 on L293D
int motor2pin2 = 8; // pin 15 on L293D
int enable1pin = 5; // pin 1 on L293D
int enable2pin = 6; // pin 9 on L293D

void setup()
{
Expand All @@ -35,18 +42,31 @@ void setup()
card.PCD_Init();
card.PCD_DumpVersionToSerial();
myServo.attach(servoPin);
pinMode(motor1pin1, OUTPUT);
pinMode(motor1pin2, OUTPUT);
pinMode(motor2pin1, OUTPUT);
pinMode(motor2pin2, OUTPUT);
pinMode(enable1pin, OUTPUT);
pinMode(enable2pin, OUTPUT);
analogWrite(enable1pin, 150);
analogWrite(enable2pin, 150);
}

void loop()
{
// Check if there is a new RFID from DB
if (firstMainLoop == 1)
{
makeStartupNoiseUsingServo();
firstMainLoop = 0;
}
if (readSerialFlag == "0")
{
// if there is a new RFID from DB, set flag to 1
fromSerialUID = readSerial();
if (fromSerialUID != "0")
{
readSerialFlag = "1";
moveForward();
}
}
delay(optimizationDelay);
Expand Down Expand Up @@ -77,6 +97,7 @@ void loop()
{
if (printCounter % 11 == 0)
{
void makeStartupNoiseUsingServo();
Serial.println("Waiting for RFID from RFID reader");
}
}
Expand Down Expand Up @@ -144,9 +165,45 @@ String readRFIDUID()
return fromRFIDString.length() != 0 ? fromRFIDString : previousRFIDUID;
}

void moveForward()
{
digitalWrite(motor1pin1, HIGH);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, HIGH);
digitalWrite(motor2pin2, LOW);
}

void pickItem()
{
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, LOW);
delay(4000);
for (int i = 0; i <= 150; i += 45)
{
myServo.write(i);
delay(50);
}
for (int i = 150; i >= 0; i -= 45)
{
myServo.write(i);
delay(50);
}
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, HIGH);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, HIGH);
}

void makeStartupNoiseUsingServo()
{
myServo.write(90);
delay(100);
myServo.write(0);
delay(100);
myServo.write(90);
delay(2000);
delay(100);
myServo.write(0);
delay(100);
}