From d332604f2665ff99682ecf7b4e218c111b4cc419 Mon Sep 17 00:00:00 2001
From: KF7EEL <kf7eel@qsl.net>
Date: Tue, 2 Mar 2021 12:41:03 -0800
Subject: [PATCH] add comment to map plots

---
 bridge_gps_data.py             |  10 +-
 gps_data.py                    |  10 +-
 scripts/dashboard/dashboard.py | 185 ++++++++++++++++++---------------
 3 files changed, 113 insertions(+), 92 deletions(-)

diff --git a/bridge_gps_data.py b/bridge_gps_data.py
index 0e45ab6..f0518ef 100755
--- a/bridge_gps_data.py
+++ b/bridge_gps_data.py
@@ -160,12 +160,12 @@ def aprs_send(packet):
         AIS.close()
         logger.info('Packet sent to APRS-IS.')
 
-def dashboard_loc_write(call, lat, lon, time):
+def dashboard_loc_write(call, lat, lon, time, comment):
     #try:
     dash_entries = ast.literal_eval(os.popen('cat /tmp/gps_data_user_loc.txt').read())
    # except:
     #    dash_entries = []
-    dash_entries.insert(0, {'call': call, 'lat': lat, 'lon': lon, 'time':time})
+    dash_entries.insert(0, {'call': call, 'lat': lat, 'lon': lon, 'time':time, 'comment': comment})
     with open("/tmp/gps_data_user_loc.txt", 'w') as user_loc_file:
             user_loc_file.write(str(dash_entries[:200]))
             user_loc_file.close()
@@ -366,7 +366,7 @@ def process_sms(_rf_src, sms):
         try:
             aprslib.parse(aprs_loc_packet)
             aprs_send(aprs_loc_packet)
-            dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, aprs_lat, aprs_lon, time())
+            dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, aprs_lat, aprs_lon, time(), comment)
             #logger.info('Sent manual position to APRS')
         except Exception as error_exception:
             logger.info('Exception. Not uploaded')
@@ -1550,7 +1550,7 @@ class routerHBP(HBSYSTEM):
                         float(lat_deg) < 91
                         float(lon_deg) < 121
                         aprs_send(aprs_loc_packet)
-                        dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, aprs_lat, aprs_lon, time())
+                        dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, aprs_lat, aprs_lon, time(), comment)
                         #logger.info('Sent APRS packet')
                     except Exception as error_exception:
                         logger.info('Error. Failed to send packet. Packet may be malformed.')
@@ -1652,7 +1652,7 @@ class routerHBP(HBSYSTEM):
                                 float(loc.lat)
                                 float(loc.lon)
                                 aprs_send(aprs_loc_packet)
-                                dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, str(loc.lat[0:7]) + str(loc.lat_dir), str(loc.lon[0:8]) + str(loc.lon_dir), time())
+                                dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, str(loc.lat[0:7]) + str(loc.lat_dir), str(loc.lon[0:8]) + str(loc.lon_dir), time(), comment)
                             except Exception as error_exception:
                                 logger.info('Failed to parse packet. Packet may be deformed. Not uploaded.')
                                 logger.info(error_exception)
diff --git a/gps_data.py b/gps_data.py
index cdac809..165c8a2 100644
--- a/gps_data.py
+++ b/gps_data.py
@@ -153,12 +153,12 @@ def aprs_send(packet):
         AIS.close()
         logger.info('Packet sent to APRS-IS.')
 
-def dashboard_loc_write(call, lat, lon, time):
+def dashboard_loc_write(call, lat, lon, time, comment):
     #try:
     dash_entries = ast.literal_eval(os.popen('cat /tmp/gps_data_user_loc.txt').read())
    # except:
     #    dash_entries = []
-    dash_entries.insert(0, {'call': call, 'lat': lat, 'lon': lon, 'time':time})
+    dash_entries.insert(0, {'call': call, 'lat': lat, 'lon': lon, 'time':time, 'comment': comment})
     with open("/tmp/gps_data_user_loc.txt", 'w') as user_loc_file:
             user_loc_file.write(str(dash_entries[:200]))
             user_loc_file.close()
@@ -357,7 +357,7 @@ def process_sms(_rf_src, sms):
         try:
             aprslib.parse(aprs_loc_packet)
             aprs_send(aprs_loc_packet)
-            dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, aprs_lat, aprs_lon, time.time())
+            dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, aprs_lat, aprs_lon, time.time(), comment)
             #logger.info('Sent manual position to APRS')
         except Exception as error_exception:
             logger.info('Exception. Not uploaded')
@@ -496,7 +496,7 @@ class DATA_SYSTEM(HBSYSTEM):
                         float(lat_deg) < 91
                         float(lon_deg) < 121
                         aprs_send(aprs_loc_packet)
-                        dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, aprs_lat, aprs_lon, time.time())
+                        dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, aprs_lat, aprs_lon, time.time(), comment)
                         #logger.info('Sent APRS packet')
                     except Exception as error_exception:
                         logger.info('Error. Failed to send packet. Packet may be malformed.')
@@ -598,7 +598,7 @@ class DATA_SYSTEM(HBSYSTEM):
                                 float(loc.lat)
                                 float(loc.lon)
                                 aprs_send(aprs_loc_packet)
-                                dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, str(loc.lat[0:7]) + str(loc.lat_dir), str(loc.lon[0:8]) + str(loc.lon_dir), time.time())
+                                dashboard_loc_write(str(get_alias(int_id(_rf_src), subscriber_ids)) + '-' + ssid, str(loc.lat[0:7]) + str(loc.lat_dir), str(loc.lon[0:8]) + str(loc.lon_dir), time.time(), comment)
                             except Exception as error_exception:
                                 logger.info('Failed to parse packet. Packet may be deformed. Not uploaded.')
                                 logger.info(error_exception)
diff --git a/scripts/dashboard/dashboard.py b/scripts/dashboard/dashboard.py
index 384f654..cfb2db3 100644
--- a/scripts/dashboard/dashboard.py
+++ b/scripts/dashboard/dashboard.py
@@ -202,94 +202,105 @@ def view_map():
     map_size = request.args.get('map_size')
     user_loc = ast.literal_eval(os.popen('cat /tmp/gps_data_user_loc.txt').read())
     last_known_list = []
-    try:
-        if track_call:
-            #folium_map = folium.Map(location=map_center, zoom_start=int(zoom_level))
-            #marker_cluster = MarkerCluster().add_to(folium_map)
-            for user_coord in user_loc:
-                user_lat = aprs_to_latlon(float(re.sub('[A-Za-z]','', user_coord['lat'])))
-                user_lon = aprs_to_latlon(float(re.sub('[A-Za-z]','', user_coord['lon'])))
-                if type(user_coord['time']) == str:
-                        loc_time = str(user_coord['time'])
-                if type(user_coord['time']) == int or type(user_coord['time']) == float:
-                        loc_time = datetime.fromtimestamp(user_coord['time']).strftime(time_format)
-                if 'S' in user_coord['lat']:
-                    user_lat = -user_lat
-                if 'W' in user_coord['lon']:
-                    user_lon = -user_lon
-                if user_coord['call'] not in last_known_list and user_coord['call'] == track_call:
-                    folium_map = folium.Map(location=[user_lat, user_lon], tiles=map_theme, zoom_start=15)
-                    marker_cluster = MarkerCluster().add_to(folium_map)
-                    folium.Marker([user_lat, user_lon], popup="""<i>
-                    <table style="width: 150px;">
+    #try:
+    if track_call:
+        #folium_map = folium.Map(location=map_center, zoom_start=int(zoom_level))
+        #marker_cluster = MarkerCluster().add_to(folium_map)
+        for user_coord in user_loc:
+            user_lat = aprs_to_latlon(float(re.sub('[A-Za-z]','', user_coord['lat'])))
+            user_lon = aprs_to_latlon(float(re.sub('[A-Za-z]','', user_coord['lon'])))
+            if type(user_coord['time']) == str:
+                    loc_time = str(user_coord['time'])
+            if type(user_coord['time']) == int or type(user_coord['time']) == float:
+                    loc_time = datetime.fromtimestamp(user_coord['time']).strftime(time_format)
+            if 'S' in user_coord['lat']:
+                user_lat = -user_lat
+            if 'W' in user_coord['lon']:
+                user_lon = -user_lon
+            loc_comment = ''
+            if 'comment' in user_coord:
+                loc_comment = """
+            <tr>
+            <td style="text-align: center;">Comment:</td>
+            </tr>
+            <tr>
+            <td style="text-align: center;"><strong>"""+ str(user_coord['comment']) +"""</strong></td>
+            </tr>"""
+            if user_coord['call'] not in last_known_list and user_coord['call'] == track_call:
+                folium_map = folium.Map(location=[user_lat, user_lon], tiles=map_theme, zoom_start=15)
+                marker_cluster = MarkerCluster().add_to(folium_map)
+                folium.Marker([user_lat, user_lon], popup="""<i>
+                <table style="width: 150px;">
+                <tbody>
+                <tr>
+                <td style="text-align: center;">Last Location:</td>
+                </tr>
+                <tr>
+                <td style="text-align: center;"><strong>"""+ str(user_coord['call']) +"""</strong></td>
+                </tr>
+                <tr>
+                <td style="text-align: center;"><em>"""+ loc_time +"""</em></td>
+                """ + loc_comment + """
+                </tr>
+                </tbody>
+                </table>
+                </i>
+                """, icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map)
+                last_known_list.append(user_coord['call'])
+            if user_coord['call'] in last_known_list and user_coord['call'] == track_call:
+                folium.CircleMarker([user_lat, user_lon], popup="""
+                <table style="width: 150px;">
+                <tbody>
+                <tr>
+                <td style="text-align: center;"><strong>""" + user_coord['call'] + """</strong></td>
+                </tr>
+                <tr>
+                <td style="text-align: center;"><em>""" + loc_time + """</em></td>
+                </tr>
+                </tbody>
+                </table>
+                """, tooltip=str(user_coord['call']), fill=True, fill_color="#3186cc", radius=4).add_to(marker_cluster)
+        #return folium_map._repr_html_()
+            if not reload_time:
+                reload_time = 120
+        if not map_size:
+            map_view = '''<table style="width: 1000px; height: 600px; margin-left: auto; margin-right: auto;" border="1">
                     <tbody>
                     <tr>
-                    <td style="text-align: center;">Last Location:</td>
-                    </tr>
-                    <tr>
-                    <td style="text-align: center;"><strong>"""+ str(user_coord['call']) +"""</strong></td>
-                    </tr>
-                    <tr>
-                    <td style="text-align: center;"><em>"""+ loc_time +"""</em></td>
+                    <td>
+                    ''' + folium_map._repr_html_() + '''</td>
                     </tr>
                     </tbody>
-                    </table>
-                    </i>
-                    """, icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map)
-                    last_known_list.append(user_coord['call'])
-                if user_coord['call'] in last_known_list and user_coord['call'] == track_call:
-                    folium.CircleMarker([user_lat, user_lon], popup="""
-                    <table style="width: 150px;">
-                    <tbody>
-                    <tr>
-                    <td style="text-align: center;"><strong>""" + user_coord['call'] + """</strong></td>
-                    </tr>
-                    <tr>
-                    <td style="text-align: center;"><em>""" + loc_time + """</em></td>
-                    </tr>
-                    </tbody>
-                    </table>
-                    """, tooltip=str(user_coord['call']), fill=True, fill_color="#3186cc", radius=4).add_to(marker_cluster)
-            #return folium_map._repr_html_()
-                if not reload_time:
-                    reload_time = 120
-            if not map_size:
-                map_view = '''<table style="width: 1000px; height: 600px; margin-left: auto; margin-right: auto;" border="1">
-                        <tbody>
-                        <tr>
-                        <td>
-                        ''' + folium_map._repr_html_() + '''</td>
-                        </tr>
-                        </tbody>
-                        </table>'''
-            if map_size == 'full':
-                map_view = folium_map._repr_html_()
+                    </table>'''
+        if map_size == 'full':
+            map_view = folium_map._repr_html_()
 
-            content = '''
-                    <head>
-                        <meta charset="UTF-8">
-                        <meta http-equiv="refresh" content="''' + str(reload_time) + """" > 
-                        <title>""" + dashboard_title + """ - Tracking """+ track_call + """</title>
-                    </head>
-                    <p style="text-align: center;"><strong>""" + dashboard_title + """ - Tracking """ + track_call + """</strong></p>
-                    <p style="text-align: center;"><em>Page automatically reloads every """ + str(reload_time) + """ seconds.</em></p>
-                    <p style="text-align: center;">
-                        <select name="sample" onchange="location = this.value;">
-                         <option value="view_map?track=""" + track_call + """&reload=120">2 Minutes</option>
-                         <option value="view_map?track=""" + track_call + """&reload=">Don't Reload</option>
-                         <option value="view_map?track=""" + track_call + """&reload=30">30 Seconds</option>
-                         <option value="view_map?track=""" + track_call + """&reload=5">5 Minutes</option>
-                         <option value="view_map?track=""" + track_call + """&reload=600">10 Minutes</option> 
-                        </select> 
-                    <p style="text-align: center;"><button onclick="self.close()">Close</button><!--<button onclick="history.back()">Back</button>-->
-                    </p>
-                     """ + map_view
-            return render_template('generic.html', title = dashboard_title, logo = logo, content = Markup(content))
-    except:
-        content = """<h1 style="text-align: center;">Station not found.</h1>
-                  <p style="text-align: center;"><button onclick="self.close()">Close Window</button>
-                </p>"""
+        content = '''
+                <head>
+                    <meta charset="UTF-8">
+                    <meta http-equiv="refresh" content="''' + str(reload_time) + """" > 
+                    <title>""" + dashboard_title + """ - Tracking """+ track_call + """</title>
+                </head>
+                <p style="text-align: center;"><strong>""" + dashboard_title + """ - Tracking """ + track_call + """</strong></p>
+                <p style="text-align: center;"><em>Page automatically reloads every """ + str(reload_time) + """ seconds.</em></p>
+                <p style="text-align: center;">
+                    <select name="sample" onchange="location = this.value;">
+                     <option value="view_map?track=""" + track_call + """&reload=120">2 Minutes</option>
+                     <option value="view_map?track=""" + track_call + """&reload=">Don't Reload</option>
+                     <option value="view_map?track=""" + track_call + """&reload=30">30 Seconds</option>
+                     <option value="view_map?track=""" + track_call + """&reload=5">5 Minutes</option>
+                     <option value="view_map?track=""" + track_call + """&reload=600">10 Minutes</option> 
+                    </select> 
+                <p style="text-align: center;"><button onclick="self.close()">Close</button><!--<button onclick="history.back()">Back</button>-->
+                </p>
+                 """ + map_view
         return render_template('generic.html', title = dashboard_title, logo = logo, content = Markup(content))
+    #except Exception as e:
+        #content = """<h1 style="text-align: center;">Station not found.</h1>
+                  #<p style="text-align: center;"><button onclick="self.close()">Close Window</button>
+                #</p>"""
+        #content = str(e)
+        #return render_template('generic.html', title = dashboard_title, logo = logo, content = Markup(content))
 
     if not track_call:
         folium_map = folium.Map(location=map_center, tiles=map_theme, zoom_start=int(zoom_level))
@@ -305,6 +316,15 @@ def view_map():
                 user_lat = -user_lat
             if 'W' in user_coord['lon']:
                 user_lon = -user_lon
+            loc_comment = ''
+            if 'comment' in user_coord:
+                loc_comment = """
+            <tr>
+            <td style="text-align: center;">Comment:</td>
+            </tr>
+            <tr>
+            <td style="text-align: center;"><strong>"""+ str(user_coord['comment']) +"""</strong></td>
+            </tr>"""
             if user_coord['call'] not in last_known_list:
                 folium.Marker([user_lat, user_lon], popup="""<i>
                 <table style="width: 150px;">
@@ -318,6 +338,7 @@ def view_map():
                 <tr>
                 <td style="text-align: center;"><em>""" + loc_time + """</em></td>
                 </tr>
+                """ + loc_comment + """
                 <tr>
                 <td style="text-align: center;"><strong><A href="view_map?track=""" + user_coord['call'] + """" target="_blank">Track Station</A></strong></td>
                 </tr>