From 566f1ecefdfce7686650e60b41012bba2b3982d3 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Sun, 5 May 2024 11:28:20 -0400 Subject: [PATCH] Have display / stop functionality working generally, but textures not appearing properly. --- img/4kSnake.png | Bin 0 -> 22012 bytes include/state.hpp | 3 +- src/main.cpp | 164 +++++++++++++++++++++++++----------------- src/state.cpp | 23 +++++- test/test_messages.js | 28 +++++++- 5 files changed, 147 insertions(+), 71 deletions(-) create mode 100644 img/4kSnake.png diff --git a/img/4kSnake.png b/img/4kSnake.png new file mode 100644 index 0000000000000000000000000000000000000000..734133fcf7420f22e4e31d44a478d2c872ee3d1c GIT binary patch literal 22012 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 getExposure() { return exposure; } vector getPosition() { return { x, y, w, h }; } bool isError () { return ERROR; } - void setActive () { active = true; } + void setInactive () { active = false; } bool isActive () { return active; } }; diff --git a/src/main.cpp b/src/main.cpp index d40e531..3c5b18c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,9 +21,11 @@ #include using namespace std; +using namespace std::chrono; uint16_t PORT = 8081; const uint16_t BUFFER_SIZE = 2048; +int clientSocket = 0; GLuint imageTexture = 0; GLuint blankTexture = 0; @@ -34,15 +36,68 @@ GLint screenHeight = 0; Image img; State state; -void actionDisplay () { +uint64_t exposureTime = 0; +steady_clock::time_point startTime; +bool displaying = false; +bool completed = true; +bool timing = false; +/** + * State Message Variables + **/ + +bool receivedMessage = false; +string incomingMessage; +string outgoingMessage; + +mutex receivedMutex; +condition_variable receivedCondVar; + + +void actionDisplay () { + vector exposure = state.getExposure(); + if (exposure.size() == 0) { + displaying = true; + completed = true; + timing = false; + } else if (exposure.size() == 1) { + exposureTime = exposure[0]; + displaying = true; + completed = false; + timing = true; + startTime = steady_clock::now(); + while (!completed) { + // + } + } // multi channel case +} + +void actionStop () { + displaying = false; + completed = true; +} + +void postAction () { + if (state.isError()) { + outgoingMessage = state.createMessage(false); + } else { + outgoingMessage = state.createMessage(true); + } + const char* msg = outgoingMessage.c_str(); + int bytesSent = send(clientSocket, msg, strlen(msg), 0); + if (bytesSent < 0) { + cerr << "Error sending ACK to client" << endl; + } else { + cout << "Sent = " << outgoingMessage << endl; + } } void actionLoad () { + auto localStartTime = steady_clock::now(); string imagePath = state.getImage(); vector position = state.getPosition(); Mat image = img.loadImage(imagePath, position[0], position[1], position[2], position[3]); - glGenTextures(2, &imageTexture); + glGenTextures(1, &imageTexture); glBindTexture(GL_TEXTURE_2D, imageTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -51,19 +106,18 @@ void actionLoad () { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexImage2D(GL_TEXTURE_2D, // Type of texture + glTexSubImage2D(GL_TEXTURE_2D, // Type of texture 0, // Pyramid level (for mip-mapping) - 0 is the top level GL_RGB, // Internal colour format to convert to - image.cols, // Image width i.e. 640 for Kinect in standard mode - image.rows, // Image height i.e. 480 for Kinect in standard mode + image.cols, // Image width + image.rows, // Image height 0, // Border width in pixels (can either be 1 or 0) GL_RGB, // Input image format (i.e. GL_RGB, GL_RGBA, GL_BGR etc.) GL_UNSIGNED_BYTE, // Image data type image.ptr()); // The actual image data itself -} - -void actionStop () { - + auto localCurrentTime = steady_clock::now(); + auto localElapsedTime = duration_cast(localCurrentTime - localStartTime).count(); + cout << "actionLoad() [" << localElapsedTime << " ms]" << endl; } void loadBlank () { @@ -79,22 +133,52 @@ void loadBlank () { glTexImage2D(GL_TEXTURE_2D, // Type of texture 0, // Pyramid level (for mip-mapping) - 0 is the top level GL_RGB, // Internal colour format to convert to - blank.cols, // Image width i.e. 640 for Kinect in standard mode - blank.rows, // Image height i.e. 480 for Kinect in standard mode + blank.cols, // Image width + blank.rows, // Image height 0, // Border width in pixels (can either be 1 or 0) GL_RGB, // Input image format (i.e. GL_RGB, GL_RGBA, GL_BGR etc.) GL_UNSIGNED_BYTE, // Image data type blank.ptr()); // The actual image data itself } +void initImageTexture() { + glGenTextures(1, &imageTexture); +} + void display () { + if (state.isActive()) { + if (state.getAction() == LOAD) { + actionLoad(); + } else if (state.getAction() == DISPLAY) { + actionDisplay(); + } else if (state.getAction() == STOP) { + actionStop(); + } + state.setInactive(); + postAction(); + } + if (displaying && timing) { + auto currentTime = steady_clock::now(); + auto elapsedTime = duration_cast(currentTime - startTime).count(); + if (elapsedTime > exposureTime) { + cout << "Exposure = " << elapsedTime << " ms" << endl; + displaying = false; + completed = true; + } + } + glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glViewport(0, 0, screenWidth, screenHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); - glBindTexture(GL_TEXTURE_2D, blankTexture); + + if (displaying) { + glBindTexture(GL_TEXTURE_2D, imageTexture); + } else { + glBindTexture(GL_TEXTURE_2D, blankTexture); + } glBegin(GL_QUADS); // front face glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f); //bottom right @@ -114,47 +198,14 @@ void timer(int value) { glutTimerFunc(1, timer, 0); } -/** - * State Message Variables - **/ - -bool receivedMessage = false; -bool sendMessage = false; -string incomingMessage; -string outgoingMessage; - -mutex receivedMutex; -condition_variable receivedCondVar; - -mutex sendMutex; -condition_variable sendCondVar; - /** * **/ void processMessage () { if (receivedMessage) { - cout << "RECEIVED" << endl; state.receiveMessage(incomingMessage); receivedMessage = false; - - while (state.isActive()) { - if (state.getAction() == LOAD) { - actionLoad(); - } else if (state.getAction() == DISPLAY) { - actionDisplay(); - } else if (state.getAction() == STOP) { - actionStop(); - } - } - - if (state.isError()) { - outgoingMessage = state.createMessage(false); - } else { - outgoingMessage = state.createMessage(true); - } - sendMessage = true; } } @@ -174,32 +225,12 @@ void handleTCPConnection(int clientSocket) { { lock_guard lock(receivedMutex); receivedMessage = true; - sendMessage = false; incomingMessage = localIncomingMessage; receivedCondVar.notify_all(); } processMessage(); - bool localSendMessage; - string localOutgoingMessage; - - { - unique_lock lock(sendMutex); - sendCondVar.wait(lock, [&] { return sendMessage; }); - localSendMessage = sendMessage; - localOutgoingMessage = outgoingMessage; - } - - if (localSendMessage) { - const char* msg = localOutgoingMessage.c_str(); - int bytesSent = send(clientSocket, msg, strlen(msg), 0); - if (bytesSent < 0) { - cerr << "Error sending ACK to client" << endl; - break; - } - } - memset(buffer, 0, BUFFER_SIZE); } } @@ -209,7 +240,7 @@ void runTCPServer (int serverSocket) { struct sockaddr_in clientAddr; socklen_t clientAddrLen = sizeof(clientAddr); - int clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen); + clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen); if (clientSocket < 0) { cerr << "Error accepting client connection" << endl; continue; @@ -260,6 +291,7 @@ int main (int argc, char** argv) { glutDisplayFunc(display); glutTimerFunc(0, timer, 0); loadBlank(); + initImageTexture(); int serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket < 0) { diff --git a/src/state.cpp b/src/state.cpp index 9e0af90..5b4413e 100644 --- a/src/state.cpp +++ b/src/state.cpp @@ -16,7 +16,20 @@ bool State::imageExists (string& image) { void State::setAction (json& msgData) { action = static_cast(msgData["action"]); - cout << "Action = " << action << endl; + switch (action) { + case NONE: + cout << "Action = NONE" << endl; + break; + case LOAD: + cout << "Action = LOAD" << endl; + break; + case DISPLAY: + cout << "Action = DISPLAY" << endl; + break; + case STOP: + cout << "Action = STOP" << endl; + break; + } } void State::setImage (json& msgData) { @@ -45,9 +58,11 @@ void State::setPosition (json& msgData) { void State::setExposure (json& msgData) { if (msgData["exposure"].size() == 1) { exposure = { msgData["exposure"][0] }; - } else if (msgData["exposure"].size() == 3) { + cout << "Exposure = " << msgData["exposure"][0] << " ms" << endl; + } /*else if (msgData["exposure"].size() == 3) { exposure = { msgData["exposure"][0], msgData["exposure"][1], msgData["exposure"][2] }; - } else { + cout << "Exposure[0] = " << msgData["exposure"][0] << " ms, [1] = " << msgData["exposure"][1] << " ms, [2] = " << msgData["exposure"][2] << " ms" << endl; + }*/ else { error(); cerr << "Exposure array is incorrect length, " << msgData["exposure"].size() << endl; return; @@ -81,6 +96,8 @@ void State::receiveMessage (string msgString) { if (action == DISPLAY && msgData.contains("exposure")) { setExposure(msgData); } + + setActive(); } string State::createMessage (bool success) { diff --git a/test/test_messages.js b/test/test_messages.js index a683d71..028be34 100644 --- a/test/test_messages.js +++ b/test/test_messages.js @@ -1,4 +1,5 @@ const net = require('net'); +const { resolve } = require('path'); const serverAddress = 'localhost'; const serverPort = 8081; @@ -16,13 +17,38 @@ async function delay (ms) { client.connect(serverPort, serverAddress, async () => { const data = { action : 1, - image: 'filename.tif', + image: resolve('./img/4kSnake.png'), + position : { + x: 100, + y : 100, + w : 320, + h : 320 + } }; console.log('SENDING'); console.log(data); client.write(JSON.stringify(data)); await delay(2000); data.action = 2; + delete data.position + console.log('SENDING'); + console.log(data); + client.write(JSON.stringify(data)); + await delay(2000); + data.action = 3; + console.log('SENDING'); + console.log(data); + client.write(JSON.stringify(data)); + await delay(2000); + data.action = 1; + data.position = { x: 50, y : 50, w : 320, h : 320 }; + console.log('SENDING'); + console.log(data); + client.write(JSON.stringify(data)); + await delay(1000); + data.action = 2; + delete data.position; + data.exposure = [ 4000 ]; console.log('SENDING'); console.log(data); client.write(JSON.stringify(data));