Browse Source

updated heartbeat code to fix some edge cases

Signed-off-by: Jason Dela Cruz <[email protected]>
Jason Dela Cruz 2 years ago
parent
commit
cf2574403a

+ 0 - 2
Gems/O3DE/GeomNodes/Code/Source/Editor/Components/EditorGeomNodesComponent.cpp

@@ -160,8 +160,6 @@ namespace GeomNodes
             m_currentObject = gnParam->m_value;
             m_currentObject = gnParam->m_value;
             m_paramContext.m_group.Clear(); // clear the group/properties
             m_paramContext.m_group.Clear(); // clear the group/properties
             CreateDataElements(m_paramContext.m_group);
             CreateDataElements(m_paramContext.m_group);
-
-            // TODO: send a message to blender since we need to update the object rendered
         }
         }
         
         
         if(m_instance && !m_instance->IsValid())
         if(m_instance && !m_instance->IsValid())

+ 1 - 1
Gems/O3DE/GeomNodes/External/Bridge/Ipc.cpp

@@ -1169,7 +1169,7 @@ namespace Ipc
 
 
                 if (m_uMsgAddIdx == initialIdx)
                 if (m_uMsgAddIdx == initialIdx)
                 {
                 {
-                    AZ_Warning("App", false, "GNIPC: Unable to find room for new message; defaulting to overflow!");
+                    //AZ_Warning("App", false, "GNIPC: Unable to find room for new message; defaulting to overflow!");
                     break;
                     break;
                 }
                 }
             }
             }

+ 22 - 8
Gems/O3DE/GeomNodes/External/Scripts/GeomNodes.py

@@ -4,15 +4,14 @@ import os
 import time
 import time
 import datetime
 import datetime
 import json
 import json
-from messages import poll_for_messages
-from materials.blender_materials import print_materials_in_scene, get_o3de_materials
+from messages import poll_for_messages, PollReturn
+#from materials.blender_materials import print_materials_in_scene, get_o3de_materials
 
 
 dir = os.path.dirname(bpy.data.filepath)
 dir = os.path.dirname(bpy.data.filepath)
 if not dir in sys.path:
 if not dir in sys.path:
     sys.path.append(dir)
     sys.path.append(dir)
 
 
-
-from lib_loader import init_lib, MessageReader, MessageWriter
+from lib_loader import init_lib, MessageWriter
 
 
 def init(exePath, id):
 def init(exePath, id):
     init_lib(exePath, id)
     init_lib(exePath, id)
@@ -32,17 +31,32 @@ def run():
     #print(json.dumps(get_o3de_materials(), indent=4))
     #print(json.dumps(get_o3de_materials(), indent=4))
     #print_materials_in_scene()
     #print_materials_in_scene()
     
     
-    heartbeat_sent = False 
+    heartbeat_sent = False
+    heartbeat_wait_time = 0
+    heartbeat_time = 0
     while idle_time < 60:
     while idle_time < 60:
         from lib_loader import GNLibs
         from lib_loader import GNLibs
         idle_time = idle_time + update_rate
         idle_time = idle_time + update_rate
+        heartbeat_time = heartbeat_time + update_rate
 
 
         start = datetime.datetime.now()
         start = datetime.datetime.now()
-        reset, heartbeat_sent = poll_for_messages(idle_time, heartbeat_sent)
-        if reset:
+        poll_return = poll_for_messages()
+        if poll_return == PollReturn.MESSAGE:
             idle_time = 0
             idle_time = 0
-        if heartbeat_sent and idle_time >= 5: # if we haven't received a reply back after some time(~5 secs) we bail out
+        elif poll_return == PollReturn.HEARTBEAT:
+            heartbeat_time = 0
+            heartbeat_wait_time = 0
+            heartbeat_sent = False
+        
+        if heartbeat_sent == True:
+            heartbeat_wait_time = heartbeat_wait_time + update_rate
+        elif heartbeat_time >= 1: # send heartbeat every 2 secs
+            MessageWriter().from_buffer(bytes(json.dumps({'Heartbeat' : True }), "UTF-8")) # send a heartbeat message to the server
+            heartbeat_sent = True
+        
+        if heartbeat_sent and heartbeat_wait_time >= 1.5: # if we haven't received a reply back after some time(~5 secs) we bail out
             break
             break
+
         end = datetime.datetime.now()
         end = datetime.datetime.now()
         # print('Export time: ' + str((end-start).seconds + (end-start).microseconds/1000000) + 's', flush=True)
         # print('Export time: ' + str((end-start).seconds + (end-start).microseconds/1000000) + 's', flush=True)
         if bpy.app.background:
         if bpy.app.background:

+ 12 - 10
Gems/O3DE/GeomNodes/External/Scripts/messages.py

@@ -1,6 +1,7 @@
 import bpy
 import bpy
 import sys
 import sys
 import os
 import os
+from enum import Enum
 import datetime
 import datetime
 import json
 import json
 from lib_loader import MessageReader, MessageWriter
 from lib_loader import MessageReader, MessageWriter
@@ -10,6 +11,11 @@ from utils import get_geomnodes_obj
 import logging as _logging
 import logging as _logging
 _LOGGER = _logging.getLogger('GeomNodes.External.Scripts.messages')
 _LOGGER = _logging.getLogger('GeomNodes.External.Scripts.messages')
 
 
+class PollReturn(Enum):
+    NONE = 0
+    MESSAGE = 1
+    HEARTBEAT = 2
+
 def import_texture(Id, x, y):
 def import_texture(Id, x, y):
     #_LOGGER.debug(str(x) + ' ' + str(y))
     #_LOGGER.debug(str(x) + ' ' + str(y))
     image = bpy.data.images.new(Id + "_Image", width=x, height=y)
     image = bpy.data.images.new(Id + "_Image", width=x, height=y)
@@ -62,7 +68,7 @@ def update_gn_in_blender(msg_dict):
 
 
     return object_name
     return object_name
 
 
-def poll_for_messages(idle_time: int, heartbeat_sent: bool):
+def poll_for_messages():
     # poll if there are messages until we exhaust them.
     # poll if there are messages until we exhaust them.
     msg_str = MessageReader().as_string()
     msg_str = MessageReader().as_string()
     if len(msg_str) > 0:
     if len(msg_str) > 0:
@@ -71,7 +77,7 @@ def poll_for_messages(idle_time: int, heartbeat_sent: bool):
             msg_dict = json.loads(msg_str)
             msg_dict = json.loads(msg_str)
         except json.decoder.JSONDecodeError:
         except json.decoder.JSONDecodeError:
             if msg_str != "":
             if msg_str != "":
-                _LOGGER.debug('couldnt parse json: ' + msg_str)
+                print('couldnt parse json: ' + msg_str)
         else:
         else:
             if msg_dict is not None:
             if msg_dict is not None:
                 if 'FetchObjectParams' in msg_dict:
                 if 'FetchObjectParams' in msg_dict:
@@ -88,11 +94,7 @@ def poll_for_messages(idle_time: int, heartbeat_sent: bool):
                     map_id = msg_dict['MapId']
                     map_id = msg_dict['MapId']
                     from lib_loader import GNLibs
                     from lib_loader import GNLibs
                     GNLibs.ClearSHM(map_id)
                     GNLibs.ClearSHM(map_id)
-        heartbeat_sent = False
-        return True, heartbeat_sent # reset idle_time as we got a message from the server
-    else:
-        if idle_time > 2 and heartbeat_sent == False:
-            MessageWriter().from_buffer(bytes(json.dumps({'Heartbeat' : True }), "UTF-8")) # send a heartbeat message to the server
-            heartbeat_sent = True
-    
-    return False, heartbeat_sent
+                elif 'Alive' in msg_dict:
+                    return PollReturn.HEARTBEAT
+        return PollReturn.MESSAGE # reset idle_time as we got a message from the server
+    return PollReturn.NONE