From a8714c9a7d4b75a18096b9ef515044faa5223aa0 Mon Sep 17 00:00:00 2001 From: KF7EEL Date: Sun, 28 Feb 2021 13:49:22 -0800 Subject: [PATCH] add emergency feature --- bridge_gps_data.py | 17 +++ gps_data.py | 19 ++- scripts/dashboard/dashboard.py | 175 ++++++++++++++----------- scripts/dashboard/templates/index.html | 11 ++ 4 files changed, 148 insertions(+), 74 deletions(-) diff --git a/bridge_gps_data.py b/bridge_gps_data.py index 3b65e24..e35fb18 100644 --- a/bridge_gps_data.py +++ b/bridge_gps_data.py @@ -184,6 +184,18 @@ def dashboard_bb_write(call, dmr_id, time, bulletin): logger.info('User bulletin entry saved.') #logger.info(dash_bb) +def sos_write(dmr_id, time, message): + user_settings = ast.literal_eval(os.popen('cat ./user_settings.txt').read()) + try: + sos_call = user_settings[dmr_id][0]['call'] + '-' + user_settings[dmr_id][1]['ssid'] + except: + sos_call = str(get_alias((dmr_id), subscriber_ids)) + sos_info = {'call': sos_call, 'dmr_id': dmr_id, 'time': time, 'message':message} + with open("/tmp/gps_data_user_sos.txt", 'w') as sos_file: + sos_file.write(str(sos_info)) + sos_file.close() + logger.info('Saved SOS.') + # Send email via SMTP function def send_email(to_email, email_subject, email_message): global smtp_server @@ -264,6 +276,11 @@ def process_sms(_rf_src, sms): logger.info('Failed to send email.') logger.info(error_exception) logger.info(str(traceback.extract_tb(error_exception.__traceback__))) + elif '@SOS' in sms: + sos_write(int_id(_rf_src), 'time', sms) + elif '@REM SOS' == sms: + os.remove('/tmp/gps_data_user_sos.txt') + logger.info('Removing SOS') elif '@MH' in sms: grid_square = re.sub('@MH ', '', sms) if len(grid_square) < 6: diff --git a/gps_data.py b/gps_data.py index ed0eef8..0dbef2c 100644 --- a/gps_data.py +++ b/gps_data.py @@ -177,6 +177,18 @@ def dashboard_bb_write(call, dmr_id, time, bulletin): logger.info('User bulletin entry saved.') #logger.info(dash_bb) +def sos_write(dmr_id, time, message): + user_settings = ast.literal_eval(os.popen('cat ./user_settings.txt').read()) + try: + sos_call = user_settings[dmr_id][0]['call'] + '-' + user_settings[dmr_id][1]['ssid'] + except: + sos_call = str(get_alias((dmr_id), subscriber_ids)) + sos_info = {'call': sos_call, 'dmr_id': dmr_id, 'time': time, 'message':message} + with open("/tmp/gps_data_user_sos.txt", 'w') as sos_file: + sos_file.write(str(sos_info)) + sos_file.close() + logger.info('Saved SOS.') + # Send email via SMTP function def send_email(to_email, email_subject, email_message): global smtp_server @@ -233,7 +245,7 @@ def user_setting_write(dmr_id, setting, value): def process_sms(_rf_src, sms): if sms == 'ID': - logger.info(str(get_alias(int_id(from_id), subscriber_ids)) + ' - ' + str(int_id(from_id))) + logger.info(str(get_alias(int_id(_rf_src), subscriber_ids)) + ' - ' + str(int_id(_rf_src))) elif sms == 'TEST': logger.info('It works!') elif '@ICON' in sms: @@ -257,6 +269,11 @@ def process_sms(_rf_src, sms): logger.info('Failed to send email.') logger.info(error_exception) logger.info(str(traceback.extract_tb(error_exception.__traceback__))) + elif '@SOS' in sms: + sos_write(int_id(_rf_src), 'time', sms) + elif '@REM SOS' == sms: + os.remove('/tmp/gps_data_user_sos.txt') + logger.info('Removing SOS') elif '@MH' in sms: grid_square = re.sub('@MH ', '', sms) if len(grid_square) < 6: diff --git a/scripts/dashboard/dashboard.py b/scripts/dashboard/dashboard.py index 517140b..949b44f 100644 --- a/scripts/dashboard/dashboard.py +++ b/scripts/dashboard/dashboard.py @@ -21,7 +21,7 @@ This is a web dashboard for the GPS/Data application. ''' -from flask import Flask, render_template, request, Response +from flask import Flask, render_template, request, Response, Markup import ast, os from dashboard_settings import * import folium @@ -114,6 +114,39 @@ def get_bb_data(): return str('

Bulletin Board

' + tbl_hdr + bb_hdr + tmp_bb + tbl_ftr) except: return str('

No data

') + +def check_emergency(): + # open emergency txt + try: + sos_file = ast.literal_eval(os.popen('cat /tmp/gps_data_user_sos.txt').read()) + value = Markup(""" +

EMERGENCY ACTIVATION

+

 

+ + + + + + + + + + + + + + + +
From:""" + sos_file['call'] + """ - """ + str(sos_file['dmr_id']) + """
Message:""" + sos_file['message'] + """
Time:""" + sos_file['time'] + """
+

 

+ +
+ + """) + return value + except: + return '' + def aprs_to_latlon(x): degrees = int(x) // 100 minutes = x - 100*degrees @@ -121,8 +154,9 @@ def aprs_to_latlon(x): @app.route('/') def index(): + value = Markup('The HTML String') #return get_data() - return render_template('index.html', title = dashboard_title, logo = logo) + return render_template('index.html', title = dashboard_title, logo = logo, emergency = check_emergency()) @app.route('/bulletin_board') def dash_bb(): return get_bb_data() @@ -130,10 +164,7 @@ def dash_bb(): @app.route('/positions') def dash_loc(): return get_loc_data() - #return render_template('index.html', data = str(get_data())) -##@app.route('//') -##def render_static(page_name): -## return render_template('%s.html' % page_name, title = dashboard_title, logo = logo, description = description) + @app.route('/help/') def help(): #return get_data() @@ -148,70 +179,71 @@ def view_map(): track_call = request.args.get('track') user_loc = ast.literal_eval(os.popen('cat /tmp/gps_data_user_loc.txt').read()) last_known_list = [] - 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 '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="Stamen Toner", zoom_start=15) - marker_cluster = MarkerCluster().add_to(folium_map) - # folium.Marker([user_lat, user_lon], popup="" + 'Last Location: \n' + str(user_coord['call']) + '' + '\n' + user_coord['time'] + "", icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map) - folium.Marker([user_lat, user_lon], popup=""" - - - - - - - - - - - - -
Last Location:
"""+ str(user_coord['call']) +"""
"""+ user_coord['time'] +"""
-
- """, 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.Marker([user_lat, user_lon], popup="" + '' + str(user_coord['call']) + '' + '\n' + user_coord['time'] + "", tooltip=str(user_coord['call'])).add_to(marker_cluster) - folium.CircleMarker([user_lat, user_lon], popup=""" - - - - - - - - - -
""" + user_coord['call'] + """
""" + user_coord['time'] + """
- """, 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 - return '{} {}'.format(''' - - - """ + dashboard_title + """ - Tracking """+ track_call + """

""" + dashboard_title + """ - Tracking """ + track_call + """

-

Page automatically reloads every """ + str(reload_time) + """ seconds.

-

- -

-

""", folium_map._repr_html_()) - + 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 '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="Stamen Toner", zoom_start=15) + marker_cluster = MarkerCluster().add_to(folium_map) + folium.Marker([user_lat, user_lon], popup=""" + + + + + + + + + + + + +
Last Location:
"""+ str(user_coord['call']) +"""
"""+ user_coord['time'] +"""
+
+ """, 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=""" + + + + + + + + + +
""" + user_coord['call'] + """
""" + user_coord['time'] + """
+ """, 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 + return '{} {}'.format(''' + + + """ + dashboard_title + """ - Tracking """+ track_call + """

""" + dashboard_title + """ - Tracking """ + track_call + """

+

Page automatically reloads every """ + str(reload_time) + """ seconds.

+

+ +

+

""", folium_map._repr_html_()) + except: + return """

Station not found.

+

""" if not track_call: folium_map = folium.Map(location=map_center, tiles="Stamen Toner", zoom_start=int(zoom_level)) marker_cluster = MarkerCluster().add_to(folium_map) @@ -223,7 +255,6 @@ def view_map(): if 'W' in user_coord['lon']: user_lon = -user_lon if user_coord['call'] not in last_known_list: - #folium.Marker([user_lat, user_lon], popup="" + 'Last Location: \n' + str(user_coord['call']) + '' + '\n' + user_coord['time'] + '\nTrack Station""", icon=folium.Icon(color="red", icon="record"), tooltip=str(user_coord['call'])).add_to(folium_map) folium.Marker([user_lat, user_lon], popup=""" @@ -245,8 +276,6 @@ def view_map(): """, 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: - #folium.Marker([user_lat, user_lon], popup="" + '' + str(user_coord['call']) + '' + '\n' + user_coord['time'] + "", tooltip=str(user_coord['call'])).add_to(marker_cluster) - #folium.CircleMarker([user_lat, user_lon], popup="" + '' + str(user_coord['call']) + '' + '\n' + user_coord['time'] + "", tooltip=str(user_coord['call']), fill=True, fill_color="#3186cc", radius=4).add_to(marker_cluster) folium.CircleMarker([user_lat, user_lon], popup="""
diff --git a/scripts/dashboard/templates/index.html b/scripts/dashboard/templates/index.html index df45a38..bbd02d1 100644 --- a/scripts/dashboard/templates/index.html +++ b/scripts/dashboard/templates/index.html @@ -16,12 +16,23 @@ p { max-width: 1200px; min-width: 1200px; margin: auto; +} + .emergency_button { + display: block; + width: 100%; + border: none; + background-color: ##ff0000; + padding: 14px 28px; + font-size: 16px; + cursor: pointer; + text-align: center; }
{% include 'header.html' %} +{{emergency}}

Page automatically reloads every 2 minutes.

Bulletin Board RSS Feed