Skip to content

Commit

Permalink
First draft adding client code, skeleton of server code.
Browse files Browse the repository at this point in the history
  • Loading branch information
grf14003 committed Dec 1, 2019
1 parent 8bcf32f commit 94cc09c
Show file tree
Hide file tree
Showing 11 changed files with 305 additions and 113 deletions.
46 changes: 33 additions & 13 deletions breadcrumbs/include/Algorithm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,47 @@
#ifndef ALGORITHM_HPP
#define ALGORITHM_HPP

#include "IOProcessor.hpp"
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include <vector>

#include "DataSyncThread.hpp"

// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")

#define DEFAULT_PORT 10101

class Algorithm
{
public:
explicit Algorithm(IOProcessor* ins, SIZE_T num_inputs, IOProcessor* outs, SIZE_T num_outputs);
explicit Algorithm(size_t numProcs);

virtual VOID loop() = 0;
virtual BOOLEAN loopCondition() { return FALSE; };
virtual void loop() = 0;
virtual bool loopCondition() { return false; };

VOID startIOProcessors();
VOID waitForIOProcessors();
VOID stopIOProcessors();
void serverThreadRuntime();
static DWORD serverThreadInit(LPVOID pThreadArgs)
{
Algorithm* pAlgorithmThread = (Algorithm*)pThreadArgs;
pAlgorithmThread->serverThreadRuntime();
return NULL;
}

// Updates Algorithm key/value store with IO key/value stores
VOID pollInputs();
// Updates IO key/value stores with Algorithm key/value store
VOID pollOutputs();
// Updates Algorithm key/value store with IO key/value updates
void pollForUpdates();
private:
SIZE_T numInputs, numOutputs;
IOProcessor* inputs, *outputs;
HANDLE hThread;
DWORD dwThreadId;
bool continueThread = false;

size_t numIO;
std::vector<DataSyncThread> ioComms;

void startServer();
};

#endif
7 changes: 7 additions & 0 deletions breadcrumbs/include/AlgorithmServer.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

#ifndef ALGORITHM_SERVER_HPP
#define ALGORITHM_SERVER_HPP

#define ALGORITHM_PORT "10101"

#endif
10 changes: 10 additions & 0 deletions breadcrumbs/include/Attribute.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

#ifndef ATTRIBUTE_HPP
#define ATTRIBUTE_HPP

typedef struct BinaryAttributeStructure {
char key[8];
unsigned char length[2];
} bAttrib;

#endif
49 changes: 49 additions & 0 deletions breadcrumbs/include/DataSyncThread.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@

#ifndef DATA_SYNC_THREAD_HPP
#define DATA_SYNC_THREAD_HPP

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

#include "Attribute.hpp"
#include "AlgorithmServer.hpp"

// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

/*
This class contains the thread for communicating back and forth along a socket to sync attributes
*/
class DataSyncThread
{
private:
SOCKET sock;
HANDLE hThread;
DWORD dwThreadId;
bool continueThread = false;
public:
DataSyncThread(SOCKET s) { sock = s; };

// Synchronous functions
void threadRuntime();
static DWORD threadInit(LPVOID pThreadArgs)
{
DataSyncThread* pDataSyncThread = (DataSyncThread*)pThreadArgs;
pDataSyncThread->threadRuntime();
return NULL;
}
int recvBytes(void* buffer, size_t numBytes);

// Async control
void startComms();
bool stopComms();
int connectToAlgorithm(char* serverName);
};

#endif
36 changes: 10 additions & 26 deletions breadcrumbs/include/IOProcessor.hpp
Original file line number Diff line number Diff line change
@@ -1,41 +1,25 @@
/*
*
* Stores the interface for building a sensor thread
* implementation.
*
*/


#ifndef SENSOR_INTERFACE_HPP
#define SENSOR_INTERFACE_HPP
#ifndef IO_PROCESSOR_HPP
#define IO_PROCESSOR_HPP


#include <stdio.h>
#include <Windows.h>


/*
This class is the class that abstracts the io processor side of the data exchange between
IO processors and algorithms
*/
class IOProcessor
{
public:
IOProcessor(LPCVOID pThreadArgs) { threadArgs = pThreadArgs; };

// Thread routine for implementation to override
virtual VOID threadRuntime(IOProcessor *ioProc) = 0;
// Thread initialization, should not be called directly!
static DWORD threadInit(LPVOID pThreadArgs);
IOProcessor() {};

// Async control
UINT8 startThread();
BOOL waitForThread();

// Sync control
BOOLEAN bufferDataAvailable();
SIZE_T getBufferData(LPCSTR* bufferKeyArray, LPCSTR* bufferValueArray);
VOID setDataStoreValue(LPCSTR key, LPCVOID value, SIZE_T valueSize);
protected:
LPCVOID threadArgs;
DWORD dwThreadId;
HANDLE hThread;
unsigned int startComms();
bool stopComms();

};

Expand Down
24 changes: 24 additions & 0 deletions breadcrumbs/scripts/startbfs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@

import os
import multiprocessing as mp
import subprocess


def start_program(command):
cmd_list = command.split(" ")
return subprocess.call(cmd_list)


def start_program_no_hang(command):
print("Running %s from cwd %s" % (command, os.getcwd()))
proc = mp.Process(target=start_program, args=(command,))
proc.start()
return proc


def main():
start_program_no_hang("start cmd.exe /k \"..\\bin\\Breadcrumbs.exe\"")


if __name__ == "__main__":
main()
9 changes: 1 addition & 8 deletions breadcrumbs/src/Breadcrumbs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,7 @@

int main()
{

// Initialization
int threadID = 0;
IOProcessor *processor = new VirtualOutputProcessor((LPCVOID) &threadID);
Algorithm* algorithm = new AlgoBreadcrumbs(NULL, 0, processor, 1);

// Starting
algorithm->startIOProcessors();
Algorithm* algorithm = new AlgoBreadcrumbs(NULL, 0, 1);

// Loop
while (algorithm->loopCondition())
Expand Down
55 changes: 28 additions & 27 deletions breadcrumbs/src/algos/Algorithm.cpp
Original file line number Diff line number Diff line change
@@ -1,41 +1,42 @@

#include "Algorithm.hpp"

Algorithm::Algorithm(IOProcessor* ins, SIZE_T numIns, IOProcessor* outs, SIZE_T numOuts)
Algorithm::Algorithm(size_t numProcs)
{
numInputs = numIns; numOutputs = numOuts;
inputs = ins; outputs = outs;
numIO = numProcs;
ioComms.reserve(numIO);

startServer();
}

VOID Algorithm::startIOProcessors()
void Algorithm::pollForUpdates()
{
int i;
for (i = 0; i < numInputs; i++)
(inputs + i)->startThread();
for (i = 0; i < numOutputs; i++)
(outputs + i)->startThread();
/*
Polls DataSyncThreads for new updates
Updates master storage accordingly
*/
for (DataSyncThread dst : ioComms)
{
// TODO: Implement this!
}
}

VOID Algorithm::waitForIOProcessors()
void Algorithm::startServer()
{
int i;
for (i = 0; i < numInputs; i++)
(inputs + i)->waitForThread();
for (i = 0; i < numOutputs; i++)
(outputs + i)->waitForThread();
/*
Starts the server socket thread
*/
continueThread = true;
hThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
serverThreadInit, // thread function name
this, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier
}

VOID Algorithm::stopIOProcessors()
void Algorithm::serverThreadRuntime()
{
waitForIOProcessors();
}

VOID Algorithm::pollInputs()
{

}

VOID Algorithm::pollOutputs()
{


}
Empty file.
Loading

0 comments on commit 94cc09c

Please sign in to comment.