diff --git a/src/C++/Driver/src/KobukiDriver/CKobuki.cpp b/src/C++/Driver/src/KobukiDriver/CKobuki.cpp index 8ed7dd3..597e6ba 100755 --- a/src/C++/Driver/src/KobukiDriver/CKobuki.cpp +++ b/src/C++/Driver/src/KobukiDriver/CKobuki.cpp @@ -282,7 +282,6 @@ int CKobuki::measure() { return 0; } - long double CKobuki::gyroToRad(signed short GyroAngle) { long double rad; @@ -569,76 +568,73 @@ void CKobuki::forward(int speedvalue) { /// @param degrees Rotation in degrees void CKobuki::Rotate(int degrees) { - // convert raidans to degrees - float radians = degrees * PI / 180.0; + // convert raidans to degrees + float radians = degrees * PI / 180.0; - // Calculate the rotation speed in radians per second - double radpersec = 1; + // Calculate the rotation speed in radians per second + double radpersec = 1; - // calculator rotation time and give absolute value - float rotation_time = std::abs(radians / radpersec); - - // Use original function to set the rotation speed in mm/s - setRotationSpeed(radians); + // calculator rotation time and give absolute value + float rotation_time = std::abs(radians / radpersec); - // Sleep for the calculated rotation time - std::this_thread::sleep_for(std::chrono::milliseconds(static_cast(rotation_time * 1000))); + // Use original function to set the rotation speed in mm/s + setRotationSpeed(radians); - // Stop the robot after the rotation - setRotationSpeed(0); + // Sleep for the calculated rotation time + std::this_thread::sleep_for( + std::chrono::milliseconds(static_cast(rotation_time * 1000))); + + // Stop the robot after the rotation + setRotationSpeed(0); } - void CKobuki::robotSafety(std::string *pointerToMessage) { - while (true) { - - if (parser.data.BumperCenter || parser.data.BumperLeft || parser.data.BumperRight || - parser.data.CliffLeft || parser.data.CliffCenter || parser.data.CliffRight) { - std::cout << "Safety condition triggered!" << std::endl; // Debug print - *pointerToMessage = "estop"; - forward(-100); // reverse the robot - - } - std::this_thread::sleep_for(std::chrono::milliseconds(static_cast(100))); - + while (true) { + if (parser.data.BumperCenter || parser.data.BumperLeft || + parser.data.BumperRight || parser.data.CliffLeft || + parser.data.CliffCenter || parser.data.CliffRight) { + std::cout << "Safety condition triggered!" << std::endl; // Debug print + *pointerToMessage = "estop"; + safetyActive = true; + forward(-100); // reverse the robot + safetyActive = false; } + std::this_thread::sleep_for(std::chrono::milliseconds(static_cast(100))); + } } void CKobuki::robotSafety() { - while (true) { - - if (parser.data.BumperCenter || parser.data.BumperLeft || parser.data.BumperRight || - parser.data.CliffLeft || parser.data.CliffCenter || parser.data.CliffRight) { - std::cout << "Safety condition triggered!" << std::endl; // Debug print - forward(-100); // reverse the robot - - } + while (true) { + if (parser.data.BumperCenter || parser.data.BumperLeft || + parser.data.BumperRight || parser.data.CliffLeft || + parser.data.CliffCenter || parser.data.CliffRight) { + std::cout << "Safety condition triggered!" << std::endl; // Debug print + forward(-100); // reverse the robot } + } } -void CKobuki::sendNullMessage(){ +void CKobuki::sendNullMessage() { - unsigned char message[11] = { - 0xaa, // Start byte 1 - 0x55, // Start byte 2 - 0x08, // Payload length (the first 2 bytes dont count) - 0x01, // payload type (0x01 = control command) - 0x04, // Control byte or additional identifier - 0x00, // Lower byte of speed value - 0x00, // Upper byte of speed value - 0x00, // Placeholder for radius - 0x00, // Placeholder for radius - 0x00 // Placeholder for checksum -}; + unsigned char message[11] = { + 0xaa, // Start byte 1 + 0x55, // Start byte 2 + 0x08, // Payload length (the first 2 bytes dont count) + 0x01, // payload type (0x01 = control command) + 0x04, // Control byte or additional identifier + 0x00, // Lower byte of speed value + 0x00, // Upper byte of speed value + 0x00, // Placeholder for radius + 0x00, // Placeholder for radius + 0x00 // Placeholder for checksum + }; - -message[10] = message[2] ^ message[3] ^ message[4] ^ message[5] ^ message[6] ^ - message[7] ^ message[8] ^ message[9]; + message[10] = message[2] ^ message[3] ^ message[4] ^ message[5] ^ message[6] ^ + message[7] ^ message[8] ^ message[9]; // Send the message uint32_t pocet; pocet = write(HCom, &message, 11); } - diff --git a/src/C++/Driver/src/KobukiDriver/CKobuki.h b/src/C++/Driver/src/KobukiDriver/CKobuki.h index d303826..0567df1 100755 --- a/src/C++/Driver/src/KobukiDriver/CKobuki.h +++ b/src/C++/Driver/src/KobukiDriver/CKobuki.h @@ -79,6 +79,7 @@ public: void robotSafety(std::string *pointerToMessage); void robotSafety(); //overload void sendNullMessage(); + bool safetyActive = false; KobukiParser parser; diff --git a/src/C++/Driver/src/main.cpp b/src/C++/Driver/src/main.cpp index e5c7f22..b8a7650 100644 --- a/src/C++/Driver/src/main.cpp +++ b/src/C++/Driver/src/main.cpp @@ -49,6 +49,10 @@ std::string readMQTT() void parseMQTT(std::string message) { + if(robot.safetyActive){ + std::cout << "Safety mode active. Ignoring command: " << message << std::endl; + return; + } if (message == "up") { robot.forward(1024); diff --git a/src/Python/flask/web/static/style.css b/src/Python/flask/web/static/style.css index b001428..4091957 100644 --- a/src/Python/flask/web/static/style.css +++ b/src/Python/flask/web/static/style.css @@ -1,8 +1,8 @@ body { - font-family: 'Poppins', sans-serif; - text-align: -webkit-center; - margin: 0; - padding: 0; + font-family: "Poppins", sans-serif; + text-align: -webkit-center; + margin: 0; + padding: 0; } /* This is my code for my navbar */ @@ -29,95 +29,114 @@ body { } .connectButton { - border-radius: 10px; - height: 100%; - width: 100px; - box-shadow: none; - border: none; - font-size: 1rem; - height: 40px; - background-color: #b3ffb3; - } + border-radius: 10px; + height: 100%; + width: 100px; + box-shadow: none; + border: none; + font-size: 1rem; + height: 40px; + background-color: #b3ffb3; +} /* end navbar */ .container { - display: flex; - justify-content: space-around; - align-items: center; - margin-top: 50px; - width: 80%; - background-color: white; - border-radius: 20px; - box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2); - padding: 40px; + display: flex; + justify-content: space-around; + align-items: center; + margin-top: 50px; + width: 80%; + background-color: white; + border-radius: 20px; + box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2); + padding: 40px; } .button-section { - position: relative; - width: 150px; - height: 150px; + position: relative; + width: 150px; + height: 150px; } .btn { - position: absolute; - background-color: #007BFF; - color: white; - border: none; - border-radius: 50%; - width: 60px; - height: 60px; - font-size: 1.2em; - text-align: center; - line-height: 60px; - cursor: pointer; - transition: transform 0.2s ease, background-color 0.2s ease; + position: absolute; + background-color: #007bff; + color: white; + border: none; + border-radius: 50%; + width: 60px; + height: 60px; + font-size: 1.2em; + text-align: center; + line-height: 60px; + cursor: pointer; + transition: transform 0.2s ease, background-color 0.2s ease; } /* Direction buttons */ -.btn:nth-child(1) { /* Left */ - top: 50%; - left: 50%; - transform: translate(-160%, -50%); +.btn:nth-child(1) { + /* Left */ + top: 50%; + left: 50%; + transform: translate(-160%, -50%); } -.btn:nth-child(2) { /* Up */ - top: 0; - left: 50%; - transform: translate(-50%, -35%); +.btn:nth-child(2) { + /* Up */ + top: 0; + left: 50%; + transform: translate(-50%, -35%); } -.btn:nth-child(3) { /* Right */ - top: 50%; - right: 0; - transform: translate(35%,-50%); +.btn:nth-child(3) { + /* Right */ + top: 50%; + right: 0; + transform: translate(35%, -50%); } -.btn:nth-child(4) { /* Down */ - bottom: 0; - left: 50%; - transform: translate(-50%, 35%); +.btn:nth-child(4) { + /* Down */ + bottom: 0; + left: 50%; + transform: translate(-50%, 35%); } -.btn:nth-child(5) { /* Stop Button */ - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: red; /* Distinct color for the stop button */ - width: 60px; /* Slightly larger for emphasis */ - height: 60px; /* Slightly larger for emphasis */ - line-height: 60px; /* Center text vertically */ +.btn:nth-child(5) { + /* Stop Button */ + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: red; /* Distinct color for the stop button */ + width: 60px; /* Slightly larger for emphasis */ + height: 60px; /* Slightly larger for emphasis */ + line-height: 60px; /* Center text vertically */ } /* Hover effects */ .btn:hover { - background-color: #0056b3; + background-color: #0056b3; } .btn:active { - background-color: #004494; + background-color: #004494; } .stop-button:hover { - background-color: darkred; /* Different hover color for the stop button */ + background-color: darkred; /* Different hover color for the stop button */ +} + +table { + width: 100%; + border-collapse: collapse; +} + +th,td { + border: 1px solid #ddd; + padding: 8px; +} + +th { + background-color: #f2f2f2; + text-align: left; } - \ No newline at end of file diff --git a/src/Python/flask/web/templates/index.html b/src/Python/flask/web/templates/index.html index eccf147..e5e26ef 100644 --- a/src/Python/flask/web/templates/index.html +++ b/src/Python/flask/web/templates/index.html @@ -1,8 +1,6 @@ -{% extends 'base.html' %} -{% block head %} +{% extends 'base.html' %} {% block head %} -{% endblock %} -{% block content %} +{% endblock %} {% block content %} @@ -22,12 +20,27 @@ - +

Sensor Data

+
+ + + + + + + + + + +
SensorValue
+