Index: trunk/webapps/dynamicdata/unifiedlog.html
===================================================================
--- trunk/webapps/dynamicdata/unifiedlog.html	(revision 433)
+++ trunk/webapps/dynamicdata/unifiedlog.html	(revision 433)
@@ -0,0 +1,9 @@
+<HTML><HEAD><meta http-equiv="refresh" content="5" /></HEAD><BODY><PRE>0:07:26 CMS Activated. S I-405 18.72 Edwards 'AMAZINGLY FEW,DISCOS,,,,'
+0:07:26 CMS Activated. N I-405 15.18 MAGNOLIA ST 'SLOW FOR THE,,CONE ZONE,,,'
+0:07:26 CMS Activated. S I-405 12.04 NEW HAMPSHIRE 'SLOW TRAFFIC,AHEAD,USE CAUTION,,,'
+0:07:26 CAD log entry, Incident #181, AAA: HELLO WORLD
+0:07:26 CAD log entry, Incident #181, AAA: SEND PIZZA
+0:07:26 CAD log entry, Incident #181, AAA: ABLE BAKER
+0:07:26 CAD log entry, Incident #181, AAA: EMANCIPATE
+0:07:26 CAD log entry, Incident #181, AAA: HEY EY
+0:07:26 CAD log entry, Incident #181, AAA: SUPER DUPER
Index: trunk/webapps/dynamicdata/highway_status.json
===================================================================
--- trunk/webapps/dynamicdata/highway_status.json	(revision 429)
+++ trunk/webapps/dynamicdata/highway_status.json	(revision 433)
@@ -4304,5 +4304,5 @@
        },
    "properties": 
-       {"street": "PAULARINO 2", "color": "lime", "perpx": "0.725068", "perpy": "-0.688678"}
+       {"street": "PAULARINO 2", "color": "yellow", "perpx": "0.725068", "perpy": "-0.688678"}
 },  
 {
@@ -4315,5 +4315,5 @@
        },
    "properties": 
-       {"street": "PAULARINO 2", "color": "lime", "perpx": "0.719864", "perpy": "-0.694115"}
+       {"street": "PAULARINO 2", "color": "yellow", "perpx": "0.719864", "perpy": "-0.694115"}
 },  
 {
@@ -4755,5 +4755,5 @@
        },
    "properties": 
-       {"street": "MACARTHU1", "color": "lime", "perpx": "-0.710326", "perpy": "0.703873"}
+       {"street": "MACARTHU1", "color": "red", "perpx": "-0.710326", "perpy": "0.703873"}
 },  
 {
@@ -4766,5 +4766,5 @@
        },
    "properties": 
-       {"street": "MACARTHU2", "color": "lime", "perpx": "-0.710326", "perpy": "0.703873"}
+       {"street": "MACARTHU2", "color": "red", "perpx": "-0.710326", "perpy": "0.703873"}
 },  
 {
@@ -4777,5 +4777,5 @@
        },
    "properties": 
-       {"street": "DYER 1", "color": "lime", "perpx": "0", "perpy": "0"}
+       {"street": "DYER 1", "color": "red", "perpx": "0", "perpy": "0"}
 },  
 {
@@ -4788,5 +4788,5 @@
        },
    "properties": 
-       {"street": "DYER 2", "color": "lime", "perpx": "-0.708914", "perpy": "0.705295"}
+       {"street": "DYER 2", "color": "red", "perpx": "-0.708914", "perpy": "0.705295"}
 },  
 {
@@ -4799,5 +4799,5 @@
        },
    "properties": 
-       {"street": "WARNER", "color": "lime", "perpx": "-0.711107", "perpy": "0.703084"}
+       {"street": "WARNER", "color": "red", "perpx": "-0.711107", "perpy": "0.703084"}
 },  
 {
@@ -4810,5 +4810,5 @@
        },
    "properties": 
-       {"street": "EDINGER 1", "color": "lime", "perpx": "0", "perpy": "0"}
+       {"street": "EDINGER 1", "color": "yellow", "perpx": "0", "perpy": "0"}
 },  
 {
@@ -12013,5 +12013,5 @@
        },
    "properties": 
-       {"street": "JAMBOREE1", "color": "lime", "perpx": "0.400805", "perpy": "0.916164"}
+       {"street": "JAMBOREE1", "color": "yellow", "perpx": "0.400805", "perpy": "0.916164"}
 },  
 {
@@ -12024,5 +12024,5 @@
        },
    "properties": 
-       {"street": "JAMBOREE2", "color": "lime", "perpx": "0.400805", "perpy": "0.916164"}
+       {"street": "JAMBOREE2", "color": "red", "perpx": "0.400805", "perpy": "0.916164"}
 },  
 {
@@ -12035,5 +12035,5 @@
        },
    "properties": 
-       {"street": "MACARTHUR 1", "color": "lime", "perpx": "0.408917", "perpy": "0.912572"}
+       {"street": "MACARTHUR 1", "color": "red", "perpx": "0.408917", "perpy": "0.912572"}
 },  
 {
@@ -12046,5 +12046,5 @@
        },
    "properties": 
-       {"street": "AIRPORT", "color": "lime", "perpx": "0.321527", "perpy": "0.9469"}
+       {"street": "AIRPORT", "color": "red", "perpx": "0.321527", "perpy": "0.9469"}
 },  
 {
@@ -12057,5 +12057,5 @@
        },
    "properties": 
-       {"street": "HOV AT 55N FLYOVER**", "color": "lime", "perpx": "0.271933", "perpy": "0.962316"}
+       {"street": "HOV AT 55N FLYOVER**", "color": "red", "perpx": "0.271933", "perpy": "0.962316"}
 },  
 {
@@ -12068,5 +12068,5 @@
        },
    "properties": 
-       {"street": "RED HILL", "color": "lime", "perpx": "0.126754", "perpy": "0.991934"}
+       {"street": "RED HILL", "color": "red", "perpx": "0.126754", "perpy": "0.991934"}
 },  
 {
Index: trunk/webapps/unifiedlogger/cms_watcher.py
===================================================================
--- trunk/webapps/unifiedlogger/cms_watcher.py	(revision 431)
+++ trunk/webapps/unifiedlogger/cms_watcher.py	(revision 433)
@@ -56,6 +56,9 @@
                     msgList[idx]['cms']['message']['phase2']['Line3'])
 
-# Compare previous messages to current messages to look for changes
-def compare():
+def setup():
+     extractMessages(initialize())
+
+# compare previous messages to current messages to look for changes
+def getLogEntries():
      global prevList, currList
      msgList = readFile()
@@ -80,8 +83,4 @@
      return results
 
-def setup():
-     msgList = initialize()
-     extractMessages(msgList)
-
 def main():
      global currList
@@ -90,5 +89,5 @@
      while True:
           # Look for changed messages
-          answer = compare()
+          answer = getLogEntries()
           # Output results
           for item in answer:
Index: trunk/webapps/unifiedlogger/cad_watcher.py
===================================================================
--- trunk/webapps/unifiedlogger/cad_watcher.py	(revision 433)
+++ trunk/webapps/unifiedlogger/cad_watcher.py	(revision 433)
@@ -0,0 +1,48 @@
+import json, time
+from copy import deepcopy
+
+# CAD comment log Watcher
+# Look for changes in the CAD comment log
+# jdalbey  7/6/2019
+
+lastLineNum = 0
+
+# Utility functions
+def isEmpty(cmsitem):
+    return cmsitem == ",,,,,"
+def isFull(cmsitem):
+    return not isEmpty(cmsitem)
+
+# Read the cms message file
+def readFile():     
+    text_file = open("../../CADcomments.log", "r")
+    lines = text_file.read().split('\n')
+    return lines
+    
+def setup():
+    # nothing needed for setup
+    return
+
+# Retrieve new messages from CAD comment log 
+def getLogEntries():
+    global lastLineNum
+    msgList = readFile()
+    currList = []
+    currList = msgList[lastLineNum:]    # new items since last file read
+    lastLineNum = len(msgList)-1
+    return currList
+
+def main():
+    setup()
+    # Loop Forever
+    while True:
+        # Look for changed messages
+        answer = getLogEntries()
+        # Output results
+        for item in answer:
+            print item
+        # wait 
+        time.sleep(5)
+
+if __name__ == "__main__":
+    main()
Index: trunk/webapps/unifiedlogger/logging_service.py
===================================================================
--- trunk/webapps/unifiedlogger/logging_service.py	(revision 431)
+++ trunk/webapps/unifiedlogger/logging_service.py	(revision 433)
@@ -1,3 +1,3 @@
-import cms_watcher, time, json
+import cms_watcher, cad_watcher, time, json
 # Unified Logging Service
 # jdalbey 7/6/2019
@@ -16,10 +16,15 @@
 
 def main():
+    # Delete any previously existing output file
+    f = open("../dynamicdata/unifiedlog.html", "w")
+    startHTML = "<HTML><HEAD><meta http-equiv=\"refresh\" content=\"5\" /></HEAD><BODY><PRE>"
+    f.write(startHTML);
+    f.close()            
     # List of the available plugin modules 
-    plugins = ["cms_watcher"]
+    plugins = ["cms_watcher","cad_watcher"]
     #FOR each plugin LOOP
     for plugin in plugins:
         # dynamically load the setup function for this plugin
-        plugmodule = locals()[plugin]
+        plugmodule = globals()[plugin]
         setupfunc = getattr(plugmodule, 'setup')
         #Call setup
@@ -33,20 +38,26 @@
     #    Reset Output Buffer
         output = ""
+        results = []
     #    FOR each plugin LOOP
         for plugin in plugins:
             # dynamically load the setup function for this plugin
-            plugmodule = locals()[plugin]
-            comparefunc = getattr(plugmodule, 'compare')
+            plugmodule = globals()[plugin]
+            getfunc = getattr(plugmodule, 'getLogEntries')
             
     #        Run the plugin process returning new log entries
-            results = comparefunc()          # Look for changed messages
+            results = getfunc()     
+            #    Append simulation time and the log entries to the Output Buffer
+            for item in results:
+                trimmed_item = item.strip()
+                if len(trimmed_item) > 0:
+                    output += timeStamp + " " + trimmed_item + "\n"
     #    END LOOP
-    #    Append simulation time and the log entries to the Output Buffer
-        for item in results:
-            output += timeStamp + " " + item + "\n"
     #    IF the Output Buffer has any contents THEN
         if len(output) > 0:
     #       Write (append) Output Buffer to unified log file 
-            print output
+            print output,
+            f = open("../dynamicdata/unifiedlog.html", "a")
+            f.write(output)
+            f.close()            
     #    END IF
     #    Wait one second
Index: trunk/webapps/common/js/revision_number.dat
===================================================================
--- trunk/webapps/common/js/revision_number.dat	(revision 429)
+++ trunk/webapps/common/js/revision_number.dat	(revision 433)
@@ -1,3 +1,3 @@
 
-    var revisionNumber = "426";
+    var revisionNumber = "431";
     
