targets/Win32/plc_Win32_main.c
branchsvghmi
changeset 3295 0375d801fff7
parent 2174 55611282b909
child 3296 3bcd5ec67521
--- a/targets/Win32/plc_Win32_main.c	Mon Aug 16 22:49:08 2021 +0200
+++ b/targets/Win32/plc_Win32_main.c	Tue Aug 17 12:29:36 2021 +0200
@@ -262,3 +262,63 @@
     DeleteCriticalSection(&Atomic64CS);
 }
 
+struct RT_to_nRT_signal_s {
+    HANDLE sem;
+};
+
+typedef struct RT_to_nRT_signal_s RT_to_nRT_signal_t;
+
+#define _LogAndReturnNull(text) \
+    {\
+    	char mstr[256] = text " for ";\
+        strncat(mstr, name, 255);\
+        LogMessage(LOG_CRITICAL, mstr, strlen(mstr));\
+        return NULL;\
+    }
+
+void *create_RT_to_nRT_signal(char* name){
+    RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)malloc(sizeof(RT_to_nRT_signal_t));
+
+    if(!sig) 
+    	_LogAndReturnNull("Failed allocating memory for RT_to_nRT signal");
+
+    sig->sem = CreateSemaphore(
+                            NULL,           // default security attributes
+                            1,  			// initial count
+                            1,  			// maximum count
+                            NULL);          // unnamed semaphore
+
+    if(sig->sem == NULL)
+    {
+    	char mstr[256];
+        snprintf(mstr, 255, "startPLC CreateSemaphore %s error: %d\n", name, GetLastError());
+        LogMessage(LOG_CRITICAL, mstr, strlen(mstr));
+        return NULL;
+    }
+
+    return (void*)sig;
+}
+
+void delete_RT_to_nRT_signal(void* handle){
+    RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle;
+
+    CloseHandle(python_sem);
+
+    free(sig);
+}
+
+int wait_RT_to_nRT_signal(void* handle){
+    int ret;
+    RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle;
+	return WaitForSingleObject(sig->sem, INFINITE);
+}
+
+int unblock_RT_to_nRT_signal(void* handle){
+    RT_to_nRT_signal_t *sig = (RT_to_nRT_signal_t*)handle;
+	return ReleaseSemaphore(sig->sem, 1, NULL);
+}
+
+void nRT_reschedule(void){
+    SwitchToThread();
+}
+