From 1eea07e7650f1f3ed1b5b9bc08ce5d78d6d45cef Mon Sep 17 00:00:00 2001 From: marcel Date: Mon, 31 Jan 2022 17:10:42 +0100 Subject: [PATCH] LoRa radio can be controlled via command line and web interface --- CHANGELOG.md | 3 +- aprs_utils/beacon_ax2.txt | 2 +- aprs_utils/crontab.pe1rxf | 2 +- aprs_utils/pe1rxf-aprs-server.cfg | 33 ++ aprs_utils/pe1rxf-aprs-server.cfg.defaults | 33 ++ aprs_utils/process_traffic.sh | 18 +- aprs_utils/send_beacon_lora_radio.sh | 52 ++++ aprs_utils/send_message.sh | 30 +- aprs_utils/set_beacon.sh | 42 ++- web-interface/index.php | 130 +++++++- web-interface/send_message.php | 339 ++++++++++++++++++++- 11 files changed, 668 insertions(+), 16 deletions(-) create mode 100755 aprs_utils/send_beacon_lora_radio.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index dfb5fd7..f9dfc78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ All notable changes to this project will be documented in this file. ## [0.0.1] - 2022-01-31 ### Added -- Lora support fo an SX1278 connected to the RPi GPIO +- Lora support for an SX1278 connected to the RPi GPIO (driver) +- Lora radio can be controlled via web interface and command line the same way the other two radios already could. ### Deprecated - RPi-LoRa-KISS-TNC shall be moved to a seperate repository diff --git a/aprs_utils/beacon_ax2.txt b/aprs_utils/beacon_ax2.txt index fb24596..8cbe378 100644 --- a/aprs_utils/beacon_ax2.txt +++ b/aprs_utils/beacon_ax2.txt @@ -1 +1 @@ -/usr/sbin/beacon -d "APRX29" -s ax2 '!5302.78NL00707.91E&LoRa APRS RX iGATE (https://meezenest.nl/pe1rxf)' +/usr/sbin/beacon -d "APRX29" -s ax2 '!5302.78N/00707.91E-https://meezenest.nl/pe1rxf' diff --git a/aprs_utils/crontab.pe1rxf b/aprs_utils/crontab.pe1rxf index 38e9378..1174975 100644 --- a/aprs_utils/crontab.pe1rxf +++ b/aprs_utils/crontab.pe1rxf @@ -40,4 +40,4 @@ #* * * * * /home/marcel/ham/aprs_utils/send_beacon_external_radio.sh #Send beacon on AX2 (LoRa internal radio) -#* * * * * /home/marcel/ham/aprs_utils/send_beacon_internal_lora.sh +#* * * * * /home/marcel/ham/aprs_utils/send_beacon_lora_radio.sh diff --git a/aprs_utils/pe1rxf-aprs-server.cfg b/aprs_utils/pe1rxf-aprs-server.cfg index 7087bd9..6de08c4 100644 --- a/aprs_utils/pe1rxf-aprs-server.cfg +++ b/aprs_utils/pe1rxf-aprs-server.cfg @@ -71,3 +71,36 @@ ax1_message4_id=Message 4 ax1_message4_text=Fourth message ax1_message4_destination=PE1RXF-7 ax1_message4_path=WIDE2-2 + +# LoRa radio settings +ax2_name=Digipeater LoRa +ax2_frequency=433.775 MHz + +# Beacon time LoRa radio (ax2) in minutes. 0-60, where 0 disables beaconing. +ax2_beacon_time=0 +ax2_beacon_destination=APRX29 +ax2_beacon_path=none +ax2_beacon_position=!5302.78N/00707.91E- +ax2_beacon_comment=https://meezenest.nl/pe1rxf +ax2_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax2.txt + +# Predefined messages +ax2_message1_id=Message 1 +ax2_message1_text=First message +ax2_message1_destination=PE1RXF-7 +ax2_message1_path=WIDE2-2 + +ax2_message2_id=Message 2 +ax2_message2_text=Second message +ax2_message2_destination=PE1RXF-7 +ax2_message2_path=WIDE2-2 + +ax2_message3_id=Message 3 +ax2_message3_text=Thirth message +ax2_message3_destination=PE1RXF-7 +ax2_message3_path=WIDE2-2 + +ax2_message4_id=Message 4 +ax2_message4_text=Fourth message +ax2_message4_destination=PE1RXF-7 +ax2_message4_path=WIDE2-2 diff --git a/aprs_utils/pe1rxf-aprs-server.cfg.defaults b/aprs_utils/pe1rxf-aprs-server.cfg.defaults index a1f82ba..18fe478 100644 --- a/aprs_utils/pe1rxf-aprs-server.cfg.defaults +++ b/aprs_utils/pe1rxf-aprs-server.cfg.defaults @@ -69,3 +69,36 @@ ax1_message4_text=Fourth message ax1_message4_destination=PE1RXF-7 ax1_message4_path=WIDE2-2 +# LoRa radio settings +ax2_name=Digipeater LoRa +ax2_frequency=433.775 MHz + +# Beacon time LoRa radio (ax2) in minutes. 0-60, where 0 disables beaconing. +ax2_beacon_time=0 +ax2_beacon_destination=APRX29 +ax2_beacon_path=none +ax2_beacon_position=!5302.78N/00707.91E- +ax2_beacon_comment=https://meezenest.nl/pe1rxf +ax2_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax2.txt + +# Predefined messages +ax2_message1_id=Message 1 +ax2_message1_text=First message +ax2_message1_destination=PE1RXF-7 +ax2_message1_path=WIDE2-2 + +ax2_message2_id=Message 2 +ax2_message2_text=Second message +ax2_message2_destination=PE1RXF-7 +ax2_message2_path=WIDE2-2 + +ax2_message3_id=Message 3 +ax2_message3_text=Thirth message +ax2_message3_destination=PE1RXF-7 +ax2_message3_path=WIDE2-2 + +ax2_message4_id=Message 4 +ax2_message4_text=Fourth message +ax2_message4_destination=PE1RXF-7 +ax2_message4_path=WIDE2-2 + diff --git a/aprs_utils/process_traffic.sh b/aprs_utils/process_traffic.sh index 05c4215..8f401fc 100755 --- a/aprs_utils/process_traffic.sh +++ b/aprs_utils/process_traffic.sh @@ -82,7 +82,15 @@ while read LINE PORT="ax1" fi - # Lets do something with the frame from channel 1 or 2 + # If call is still empty, frame not from channel 1 or 2, maybe from channel 3? + if [ -z $CALL ]; then + #CALL="$(grep -o -P "(?<=PE1RXF-3 R \*).+?\>"<<<$LINE)" + CALL="$(grep -oP "(?<=PE1RXF-3 R ).+?\>"<<<$LINE)" + + PORT="ax2" + fi + + # Lets do something with the frame from channel 1, 2 or 3 if [[ $CALL ]]; then # Remove last character from string @@ -92,10 +100,12 @@ while read LINE if [ $PORT == "ax0" ]; then #FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 R \*).+?:'<<<$LINE)" FULL_PATH="$(grep -oP "(?<=PE1RXF-1 R ).+?:"<<<$LINE)" - - else - #FULL_PATH="$(grep -o -P '(?<=PE1RXF-2 R \*).+?:'<<<$LINE)" + elif [ $PORT == "ax1" ]; then + #FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 R \*).+?:'<<<$LINE)" FULL_PATH="$(grep -oP "(?<=PE1RXF-2 R ).+?:"<<<$LINE)" + else + #FULL_PATH="$(grep -o -P '(?<=PE1RXF-3 R \*).+?:'<<<$LINE)" + FULL_PATH="$(grep -oP "(?<=PE1RXF-3 R ).+?:"<<<$LINE)" fi FULL_PATH="$(grep -o -P '(?<=\>).*'<<<$FULL_PATH)" diff --git a/aprs_utils/send_beacon_lora_radio.sh b/aprs_utils/send_beacon_lora_radio.sh new file mode 100755 index 0000000..e8f6b25 --- /dev/null +++ b/aprs_utils/send_beacon_lora_radio.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +################################################################################## +# Send beacon via APRS channel 2 (ax1) # +# # +# (C)2021 M.T. Konstapel https://meezenest.nl/mees # +# # +# This file is part of PE1RXF-APRS-server. # +# # +# PE1RXF-APRS-server is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# PE1RXF-APRS-server is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with PE1RXF-APRS-server. If not, see . # +# # +################################################################################## + +source /home/marcel/ham/aprs_utils/config.shlib; # load the config library functions + +ConfigFile="/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg" +BEACON_FILE="$(config_get ax2_beacon_file $ConfigFile)" + +if [ -f "$BEACON_FILE" ]; then + BEACON_TEXT=$(cat "$BEACON_FILE") + + # The BEACON_FILE holds the command for sending a beacon. So make this file part of the script. + # I shouldn't really do this, as it is a potential security risk. But the BEACON_FILE is as safe as this script itself. + # The BEACON_FILE can not be altered via the web interface, but only by the main program. So it should be ok. + # But this makes the code potential self altering, which is bad! Realy realy bad! + # But than again, is it really not the same as calling an external program from the script, as this program can also be alterred. + # Anyway, enough of my rambling, let's continue with the script. + + # To be safe, lets do some minimal safety checks before executing the external file: + + # BEACON_FILE should only have one line: + NR_OF_LINES=$(awk 'END { print NR }' $BEACON_FILE) + # And this line should contain the beacon command: + RESULT=$(grep "/usr/sbin/beacon" $BEACON_FILE) + + if [ -n "$RESULT" ] && [ $NR_OF_LINES -eq 1 ]; then + # Send the beacon + . $BEACON_FILE + fi + +fi diff --git a/aprs_utils/send_message.sh b/aprs_utils/send_message.sh index b67850f..2663d40 100755 --- a/aprs_utils/send_message.sh +++ b/aprs_utils/send_message.sh @@ -43,7 +43,7 @@ Help() echo echo "Syntax: set_beacon.sh [-i |-c |-p |-m ]" echo "Options:" - echo "-i AX.25 interface (ax0 or ax1)" + echo "-i AX.25 interface (ax0, ax1 or ax2)" echo "-c Destination call" echo "-p Path: 0=none, WIDE2-1, WIDE2-2, WIDE3-3 or call of digipeater" echo "-m Message to send." @@ -101,7 +101,7 @@ if [ "$Interface" == "ax0" ]; then echo "$APRS_FRAME" > "$AX0_APRS_TRANSMIT_DIR"message.msg #echo "$APRS_FRAME $AX0_APRS_TRANSMIT_DIR" -else +elif [ "$Interface" == "ax1" ]; then # Log message echo "$CURRENT_DATE_TIME,ax1,$Call,APRX29,$Message" >> $APRS_RECEIVED_MESSAGES_DIR$MESSAGE_FILE @@ -126,6 +126,32 @@ else #"$APRS_CMD" > tmp.tmp + /usr/sbin/beacon "${args[@]}" +elif [ "$Interface" == "ax2" ]; then + # Log message + echo "$CURRENT_DATE_TIME,ax2,$Call,APRX29,$Message" >> $APRS_RECEIVED_MESSAGES_DIR$MESSAGE_FILE + + # if call is less than 9 characters, add spaces at the end (according to the APRS protocol) + printf -v Call %-9.9s "$Call" + if [ "$Path" == "0" ]; then + APRS_FRAME="PE1RXF-3>APRX29::$Call:$Message" + args[0]=-d + args[1]="APRX29" + args[2]=-s + args[3]=ax2 + args[4]=":$Call:$Message" + else + APRS_FRAME="PE1RXF-3>APRX29,$Path::$Call:$Message" + args[0]=-d + args[1]="APRX29 $Path" + args[2]=-s + args[3]=ax2 + args[4]=":$Call:$Message" + fi + #echo "$APRS_FRAME" + + #"$APRS_CMD" > tmp.tmp + /usr/sbin/beacon "${args[@]}" fi diff --git a/aprs_utils/set_beacon.sh b/aprs_utils/set_beacon.sh index bc9440d..88b2b31 100755 --- a/aprs_utils/set_beacon.sh +++ b/aprs_utils/set_beacon.sh @@ -50,6 +50,8 @@ UpdateCrontab() # All those escaped characters were a nightmare, but in the end the resulting string was perfect. But executing the string directly from this script proved to be another nightmare: # It appears that bash inserts additional escape characters, resulting in the command not working. The solution below is not very elegant, but hey...it works! # Let's make a bash script, execute is and remove it again. + echo "#!/bin/bash" + echo "$sed_string" echo "#!/bin/bash" > $sed_tmp_command_file echo "$sed_string" >> $sed_tmp_command_file chmod u+x $sed_tmp_command_file @@ -82,7 +84,7 @@ ConstructBeaconFile() echo $ConstructBeaconFile_Beacon echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File - else + elif [ "${1}" == "ax1" ]; then ConstructBeaconFile_Destination="$(config_get ax1_beacon_destination $ConfigFile)" ConstructBeaconFile_Path="$(config_get ax1_beacon_path $ConfigFile)" ConstructBeaconFile_Position="$(config_get ax1_beacon_position $ConfigFile)" @@ -104,6 +106,30 @@ ConstructBeaconFile() ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination $ConstructBeaconFile_Path\" -s ax1 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'" fi echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File + + elif [ "${1}" == "ax2" ]; then + ConstructBeaconFile_Destination="$(config_get ax2_beacon_destination $ConfigFile)" + ConstructBeaconFile_Path="$(config_get ax2_beacon_path $ConfigFile)" + ConstructBeaconFile_Position="$(config_get ax2_beacon_position $ConfigFile)" + ConstructBeaconFile_Comment="$(config_get ax2_beacon_comment $ConfigFile)" + ConstructBeaconFile_File="$(config_get ax2_beacon_file $ConfigFile)" + + if [ "$ConstructBeaconFile_Path" == "none" ]; then + ConstructBeaconFile_Beacon="PE1RXF-3>$ConstructBeaconFile_Destination:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment" + else + ConstructBeaconFile_Beacon="PE1RXF-3>$ConstructBeaconFile_Destination,$ConstructBeaconFile_Path:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment" + fi + + echo "Beacon for ax2:" + echo $ConstructBeaconFile_Beacon + + if [ "$ConstructBeaconFile_Path" == "none" ]; then + ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination\" -s ax2 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'" + else + ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination $ConstructBeaconFile_Path\" -s ax2 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'" + fi + echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File + fi @@ -120,6 +146,7 @@ TimeInterval="-1" crontab_time_string="* * * * *" crontab_command_string_ax0="/home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh" crontab_command_string_ax1="/home/marcel/ham/aprs_utils/send_beacon_external_radio.sh" +crontab_command_string_ax2="/home/marcel/ham/aprs_utils/send_beacon_lora_radio.sh" crontab_full_string="#* * * * * /home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh" crontab_intermediate_file="/home/marcel/ham/aprs_utils/crontab.pe1rxf" sed_tmp_command_file="/home/marcel/ham/aprs_utils/sed.cmd" @@ -153,13 +180,15 @@ done if [ "$work_with_config_file" -eq "1" ]; then - for ax_port in ax0 ax1 + for ax_port in ax0 ax1 ax2 do Interface="$ax_port" if [ "$Interface" == "ax0" ]; then TimeInterval="$(config_get ax0_beacon_time $ConfigFile)" - else + elif [ "$Interface" == "ax1" ]; then TimeInterval="$(config_get ax1_beacon_time $ConfigFile)" + elif [ "$Interface" == "ax2" ]; then + TimeInterval="$(config_get ax2_beacon_time $ConfigFile)" fi # Let's generate new beacon files according to values in configuration file @@ -186,6 +215,9 @@ if [ "$work_with_config_file" -eq "1" ]; then elif [ "$Interface" == "ax1" ]; then crontab_full_string="$crontab_time_string $crontab_command_string_ax1" sed_string="sed -i \"/send_beacon_external_radio/c\\$crontab_full_string\" $crontab_intermediate_file" + elif [ "$Interface" == "ax2" ]; then + crontab_full_string="$crontab_time_string $crontab_command_string_ax2" + sed_string="sed -i \"/send_beacon_lora_radio/c\\$crontab_full_string\" $crontab_intermediate_file" else echo "No valid value. Using default." crontab_full_string="$crontab_time_string $crontab_command_string_ax0" @@ -199,6 +231,7 @@ if [ "$work_with_config_file" -eq "1" ]; then printf -- "Values read from file: %s$ConfigFile\n"; printf -- "ax0 beacon time: %s\n" "$(config_get ax0_beacon_time $ConfigFile)"; printf -- "ax1 beacon time: %s\n" "$(config_get ax1_beacon_time $ConfigFile)"; + printf -- "ax2 beacon time: %s\n" "$(config_get ax2_beacon_time $ConfigFile)"; # Read values from command line arguments else @@ -224,6 +257,9 @@ else elif [ "$Interface" == "ax1" ]; then crontab_full_string="$crontab_time_string $crontab_command_string_ax1" sed_string="sed -i \"/send_beacon_external_radio/c\\$crontab_full_string\" $crontab_intermediate_file" + elif [ "$Interface" == "ax2" ]; then + crontab_full_string="$crontab_time_string $crontab_command_string_ax2" + sed_string="sed -i \"/send_beacon_external_radio/c\\$crontab_full_string\" $crontab_intermediate_file" else echo "Syntax error!" Help diff --git a/web-interface/index.php b/web-interface/index.php index cd3fc49..60bffef 100644 --- a/web-interface/index.php +++ b/web-interface/index.php @@ -28,6 +28,11 @@ $_SESSION['period_ax1'] = $_POST['period_ax1']; $_SESSION['path_ax1'] = $_POST['path_ax1']; } + if ($_POST['comment_ax2']) { + $_SESSION['comment_ax2'] = $_POST['comment_ax2']; + $_SESSION['period_ax2'] = $_POST['period_ax2']; + $_SESSION['path_ax2'] = $_POST['path_ax2']; + } header("HTTP/1.1 303 See Other"); header("Location: http://$_SERVER[HTTP_HOST]/index.php"); @@ -54,7 +59,15 @@ # Wait for the changes to take effect sleep(1); } - + else if (isset($_SESSION['comment_ax2'])){ + $comment_ax2 = $_SESSION['comment_ax2']; + $period_ax2 = $_SESSION['period_ax2']; + $path_ax2 = $_SESSION['path_ax2']; + //echo "Set ax2: $comment_ax2, $period_ax2, $path_ax2"; + save_settings("ax2", $period_ax2, 0, $path_ax2, 0, $comment_ax2); + # Wait for the changes to take effect + sleep(1); + } session_unset(); session_destroy(); @@ -124,6 +137,11 @@ if ($c) change_parameter_value("ax1_beacon_path", $c); if ($e) change_parameter_value("ax1_beacon_comment", $e); } + else if ($form == "ax2" ) { + change_parameter_value("ax2_beacon_time", $a); + if ($c) change_parameter_value("ax2_beacon_path", $c); + if ($e) change_parameter_value("ax2_beacon_comment", $e); + } # now make new file with new configuration for the main loop to find. shell_exec("cp $destination_config_file $newly_made_config_file"); @@ -168,6 +186,12 @@ $ax1_beacon_time = search_parameter_in_config_file("ax1_beacon_time"); $ax1_beacon_path = search_parameter_in_config_file("ax1_beacon_path"); + $ax2_name = search_parameter_in_config_file("ax2_name"); + $ax2_frequency = search_parameter_in_config_file("ax2_frequency"); + $ax2_beacon_comment = search_parameter_in_config_file("ax2_beacon_comment"); + $ax2_beacon_time = search_parameter_in_config_file("ax2_beacon_time"); + $ax2_beacon_path = search_parameter_in_config_file("ax2_beacon_path"); + ?>
@@ -184,6 +208,13 @@
  • Beacon interval:
  • Path:
  • +
      +
    • ()

    • +
    • Beacon:
    • +
    • Beacon interval:
    • +
    • Path:
    • +
    +
    @@ -213,7 +244,7 @@

    Heard last 24 hours

    -
    +

    DIRECT

    @@ -240,7 +271,7 @@

    -
    +

    DIRECT

    @@ -266,6 +297,34 @@ ?>

    + +
    +

    +

    + DIRECT

    + "; + } + } + echo "
    DIGIPEATED

    "; + $csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_stations_heard_digipeated.log")); + + for ($i = 0; $i < count($csv); $i++) { + if ($csv[$i][1] == "ax2") { + echo $csv[$i][2]; + echo "
    "; + } + } + + ?> +

    +
    +

      Back

    @@ -310,6 +369,23 @@ ?> +

    ()

    +

    + "; + } + } + + ?> +

    +

      Back

    @@ -391,6 +467,39 @@
    +
    + +
    @@ -298,7 +355,22 @@ ?> +

    ()

    +

    + "; + } + } + + ?> +

      Back

    @@ -340,6 +412,23 @@ ?> +

    ()

    +

    + "; + } + } + + ?> +

    +

      Back

    @@ -717,6 +806,188 @@ + +
    +
    +
    +

    Message

    + + + + + + + +
    + +
    + > +
    + > +
    + > +
    +
    + + +
    + +
    + +
    +
    +
    +
    +
    +
    +

    Message

    + + + + + + + +
    + > +
    + > +
    + > +
    + > +
    +
    + + +
    + +
    + +
    +
    +
    +
    +
    +
    +

    Message

    + + + + + + + +
    + > +
    + > +
    + > +
    + > +
    +
    + + +
    + +
    + +
    +
    +
    +
    +
    +
    +

    Message

    + + + + + + + +
    + > +
    + > +
    + > +
    + > +
    +
    + + +
    + +
    + +
    +
    +
    +
    +
    +
    +

    Message

    + + + + + + + +
    + > +
    + > +
    + > +
    + > +
    +
    + + +
    + +
    + +
    +
    +
    + @@ -784,6 +1055,37 @@ document.getElementById("popupForm_ax1_message4").style.display = "none"; } + function openForm_ax2_message0() { + document.getElementById("popupForm_ax2_message0").style.display = "block"; + } + function closeForm_ax2_message0() { + document.getElementById("popupForm_ax2_message0").style.display = "none"; + } + function openForm_ax2_message1() { + document.getElementById("popupForm_ax2_message1").style.display = "block"; + } + function closeForm_ax2_message1() { + document.getElementById("popupForm_ax2_message1").style.display = "none"; + } + function openForm_ax2_message2() { + document.getElementById("popupForm_ax2_message2").style.display = "block"; + } + function closeForm_ax2_message2() { + document.getElementById("popupForm_ax2_message2").style.display = "none"; + } + function openForm_ax2_message3() { + document.getElementById("popupForm_ax2_message3").style.display = "block"; + } + function closeForm_ax2_message3() { + document.getElementById("popupForm_ax2_message3").style.display = "none"; + } + function openForm_ax2_message4() { + document.getElementById("popupForm_ax2_message4").style.display = "block"; + } + function closeForm_ax2_message4() { + document.getElementById("popupForm_ax2_message4").style.display = "none"; + } + function show_send_messages() { document.getElementById("main_page").style.display = "none"; document.getElementById("received_messages").style.display = "none"; @@ -820,6 +1122,41 @@ modify this software provided this notice appears on all copies. */ + function SubmitClicked_ax2_message0() + { + document.getElementById("submit_ax2_message0").style.display = "none"; // to undisplay + document.getElementById("submit_done_ax2_message0").style.display = "block"; // to display + document.getElementById("cancel_ax2_message0").style.display = "none"; // to display + return true; + } + function SubmitClicked_ax2_message1() + { + document.getElementById("submit_ax2_message1").style.display = "none"; // to undisplay + document.getElementById("submit_done_ax2_message1").style.display = "block"; // to display + document.getElementById("cancel_ax2_message1").style.display = "none"; // to display + return true; + }function SubmitClicked_ax2_message2() + { + document.getElementById("submit_ax2_message2").style.display = "none"; // to undisplay + document.getElementById("submit_done_ax2_message2").style.display = "block"; // to display + document.getElementById("cancel_ax2_message2").style.display = "none"; // to display + return true; + } + function SubmitClicked_ax2_message3() + { + document.getElementById("submit_ax2_message3").style.display = "none"; // to undisplay + document.getElementById("submit_done_ax2_message3").style.display = "block"; // to display + document.getElementById("cancel_ax2_message3").style.display = "none"; // to display + return true; + } + function SubmitClicked_ax2_message4() + { + document.getElementById("submit_ax2_message4").style.display = "none"; // to undisplay + document.getElementById("submit_done_ax2_message4").style.display = "block"; // to display + document.getElementById("cancel_ax2_message4").style.display = "none"; // to display + return true; + } + function SubmitClicked_ax1_message0() { document.getElementById("submit_ax1_message0").style.display = "none"; // to undisplay