Skip to content
This repository was archived by the owner on Feb 21, 2021. 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

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/tools/visualStates_py/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions src/tools/visualStates_py/.idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions src/tools/visualStates_py/.idea/visualStates_py.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1,124 changes: 1,124 additions & 0 deletions src/tools/visualStates_py/.idea/workspace.xml

Large diffs are not rendered by default.

54 changes: 40 additions & 14 deletions src/tools/visualStates_py/codegen/cpp/runtimegui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,60 +21,71 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <cstring>
#include <sstream>
#include <iostream>
#include <unistd.h>

RunTimeGui::RunTimeGui() {
// create shared memory
createSharedMem();
createSharedMemAndSemaphore();
pthread_create(&threadIPC, NULL, &RunTimeGui::loopStaticIPC, this);
ipcData[0] == '0';

}

void RunTimeGui::emitRunningStateById(int id) {
std::stringstream strstream;
strstream << "emitRunningStateById " << id;
strstream << "emitRunningStateById " << id << " ";
msgQueue.push(strstream.str());
// std::cout << "running state:" << id << std::endl;
}

void RunTimeGui::emitLoadFromRoot() {
std::stringstream strstream;
// strstream << "emitLoadFromRoot";
msgQueue.push(strstream.str());
// msgQueue.push(strstream.str());
}

void RunTimeGui::emitActiveStateById(int id) {
std::stringstream strstream;
// strstream << "emitActiveStateById " << id;
msgQueue.push(strstream.str());
// msgQueue.push(strstream.str());
}

void* RunTimeGui::loopStaticIPC(void* owner) {
((RunTimeGui*)owner)->loopIPC();
}

void RunTimeGui::loopIPC() {
struct sembuf sb = {0, 0, 0}; /* set to allocate resource */
int semop_result;
while(true) {
// std::cout <<"data:"<< std::endl;
// for (int i = 0; i < 1024; i++) {
// std::cout << ipcData[i];
// }
// std::cout << ":data" << std::endl;
// std::cout << "msg.size=" << msgQueue.size() << std::endl;
if (msgQueue.size() > 0) {
if (ipcData[0] == '0') {
std::string msg = msgQueue.front();
msgQueue.pop();
strncpy(ipcData, msg.c_str(), 1024);
}
sb.sem_op = 0;
semop_result = semop(sem_id, &sb, 1);
std::string msg = msgQueue.front();
std::cout << "sending msg:" << msg << std::endl;
msgQueue.pop();
strncpy(ipcData, msg.c_str(), 1024);
sb.sem_op = 1;
semop_result = semop(sem_id, &sb, 1);
}

usleep(1000);
// usleep(1000);
}
}

void RunTimeGui::createSharedMem() {
void RunTimeGui::createSharedMemAndSemaphore() {
key_t fkey;
int shmid;
int mode;
int numTrial = 15;
int numTrial = 10;
int trial = 0;

while (trial < numTrial) {
Expand All @@ -83,6 +94,7 @@ void RunTimeGui::createSharedMem() {
} else {
break;
}

trial++;
usleep(100000); // sleep for 100 milliseconds
}
Expand All @@ -94,9 +106,23 @@ void RunTimeGui::createSharedMem() {
return;
}

trial = 0;
while (trial < numTrial) {
if ((sem_id = semget(9, 1, 0)) == -1) {
std::cerr << "semget error with id 9 try for " << trial << std::endl;
} else {
break;
}

trial++;
usleep(100000); // sleep for 100 milliseconds
}

ipcData = (char*) shmat(shmid, (void *)0, 0);
if (ipcData == (char *)(-1)) {
std::cerr << "error shmat" << std::endl;
return;
}


}
3 changes: 2 additions & 1 deletion src/tools/visualStates_py/codegen/cpp/runtimegui.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@
class RunTimeGui {
protected:
pthread_t threadIPC;
int sem_id;
std::queue<std::string> msgQueue;
char* ipcData;

void createSharedMem();
void createSharedMemAndSemaphore();

public:
RunTimeGui();
Expand Down
3 changes: 2 additions & 1 deletion src/tools/visualStates_py/codegen/cpp/temporaltransition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
#include "temporaltransition.h"
#include <sys/time.h>

TemporalTransition::TemporalTransition(int id, int destinationId, int elapsedTime):Transition(id, destinationId) {
TemporalTransition::TemporalTransition(int id, int destinationId, int elapsedTime):
Transition(id, destinationId) {
this->elapsedTime = elapsedTime;
}

Expand Down
2 changes: 2 additions & 0 deletions src/tools/visualStates_py/codegen/cpp/transition.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
#ifndef TRANSITION_H
#define TRANSITION_H

class State;

class Transition {
protected:
int id;
Expand Down
48 changes: 26 additions & 22 deletions src/tools/visualStates_py/codegen/python/runtimegui.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ def __init__(self, parent=None):

self.memory = None
self.ipcThread = None
self.semaphore = None

def createTreeView(self):
dockWidget = QDockWidget()
Expand Down Expand Up @@ -209,37 +210,40 @@ def getStateList(self, state, stateList):
def loopIPC(self):
while True:
msg = self.getIPCMessage()
if msg is not None and len(msg) > 0:
methodName = msg.split(' ')[0]
id = int(msg.split(' ')[1])
if methodName == 'emitRunningStateById':
self.emitRunningStateById(id)
else:
print('unknown method name')

time.sleep(1.0/1000)
if msg is not None:
if len(msg) > 0:
msg = msg.strip()
methodName = msg.split(' ')[0]
id = int(msg.split(' ')[1])
if methodName == 'emitRunningStateById':
self.emitRunningStateById(id)
else:
print('unknown method name')

# time.sleep(1.0/1000)

def activateIPC(self):
try:
self.memory = sysv_ipc.SharedMemory(123456, sysv_ipc.IPC_CREX)
self.memory = sysv_ipc.SharedMemory(123456, flags=sysv_ipc.IPC_CREAT, size = 1024)
except:
print('cannot create or open share mem with id 123456')
return

# create sempahore
try:
self.semaphore = sysv_ipc.Semaphore(9, flags=sysv_ipc.IPC_CREAT, initial_value=0)
except:
# if memory exists just open shared memory
self.memory = sysv_ipc.SharedMemory(123456)
print('cannot create or open semaphore with id 9')
self.memory.remove()
return

self.ipcThread = Thread(target=self.loopIPC)
self.ipcThread.start()

def getIPCMessage(self):
if self.memory is not None:
data = self.memory.read().decode()
if data[0] != '0':
self.memory.write('0'.encode())
i = data.find('\0')
if i != -1:
data = data[:i]
return data

return None
self.semaphore.acquire()
data = self.memory.read().decode()
return data



Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
from codegen.python.transition import Transition
from time import time

class TemporalTransition(Transition, object):
def __init__(self, id, destinationId, elapsedTime):
class TemporalTransition(Transition):
def __init__(self, id, destinationId, elapsedTime):
super(TemporalTransition, self).__init__(id, destinationId)
# elapsed time in milliseconds
self.elapsedTime = elapsedTime
Expand Down
Binary file added src/tools/visualStates_py/cpptest
Binary file not shown.
Loading