247 lines
8.2 KiB
Bash
Executable File
247 lines
8.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# fqt - FLAMP Queue Touch'
|
|
#
|
|
# Simplify matching queue ID in FLAMP by changing file's date.
|
|
|
|
Help()
|
|
{
|
|
echo 'Usage: fqt \[OPTION\]... TIMESTAMP... FILE...'
|
|
echo 'Update a file'\''s timestamp helping recreate the hash, or queue id, in FLAMP.'
|
|
echo
|
|
echo 'options:'
|
|
echo ' -h display this help and exit'
|
|
echo ' --help display longer help and exit'
|
|
echo ' -v, --version output version information and exit'
|
|
echo
|
|
echo 'fqt is short for FLAMP Queue Touch'
|
|
}
|
|
|
|
LongHelp()
|
|
{
|
|
echo 'Example'
|
|
echo ' FLAMP text shown in FLDIGI:'
|
|
echo '/// BEGIN ///'
|
|
echo 'QST DE N0CALL'
|
|
echo
|
|
echo '<PROG 18 588E>{D5C6}FLAMP 2.2.07'
|
|
echo '<FILE 35 EEAC>{D5C6}20230610151423:flamp-file.k2s'
|
|
echo ' ^^^^^^^^^^^^^^--> --> --> --> Use these numbers -->\'
|
|
echo '<ID 26 6D1A>{D5C6}N0CALL Demonstration'
|
|
echo '<SIZE 13 4B1B>{D5C6}45 1 64 |'
|
|
echo '<DATA 53 5A03>{D5C6:1}[b64:start]VGhpcyBpcyBhIHRlc3QuCg== v'
|
|
echo '[b64:end]'
|
|
echo '<CNTL 10 2CBA>{D5C6:EOF} |'
|
|
echo '<CNTL 10 8CB6>{D5C6:EOT} v'
|
|
echo
|
|
echo 'QST DE N0CALL K |'
|
|
echo '/// END /// v'
|
|
echo ' vvvvvvvvvvvvvv <-- <-- <-- <-- <-- <-- <-- Here <-- <--/'
|
|
echo ' command: fqt 20230607013934 flamp-file.k2s'
|
|
echo
|
|
echo 'Tips'
|
|
echo ' If hash doesn'\''t match, try to'
|
|
echo ' Remove and re-Add the file in FLAMP'
|
|
echo ' Toggle Comp check box (usually compression, unless file is small)'
|
|
echo ' Change base64 (usually base64)'
|
|
echo ' Change Blk size (usually 64)'
|
|
echo
|
|
echo 'Information on hash in documentation'
|
|
echo 'FLAMP Amateur Multicast Protocol (AMP-2) - Version 3.0'
|
|
echo 'available at: <http://www.w1hkj.com/files/flamp/Amp-2.V3.0.Protocol.pdf>'
|
|
echo
|
|
echo ' 20130316010524:ShortMessage2.txt0base12896'
|
|
echo
|
|
echo ' Example format:'
|
|
echo
|
|
echo ' |20130316010524:ShortMessage2.txt|0|base128|96|'
|
|
echo ' | DTS : FN |C| B |BS|'
|
|
echo
|
|
echo ' DTS = Date/Time Stamp'
|
|
echo ' FN = File Name'
|
|
echo ' C = Compression 1=ON,0=OFF'
|
|
echo ' B = Base Conversion (base64, base128, or base256)'
|
|
echo ' BS = Block Size, 1 or more characters'
|
|
echo ' | = Field separator.'
|
|
echo
|
|
echo 'CRC-16/MODBUS 20230607013934:flamp-file.k2s1base6464 D5C6'
|
|
echo ' needs localtime file dated 20230606213934 America/New_York.'
|
|
echo
|
|
echo 'Usage: fqt [OPTION]... TIMESTAMP... FILE...'
|
|
echo 'Update a file'\''s timestamp helping recreate the hash, or queue id, in FLAMP.'
|
|
echo
|
|
echo 'TIMESTAMP is the string appearing in FLAMP header'
|
|
echo 'and is formatted YYYYmmddHHMMSS '
|
|
echo
|
|
echo 'A FILE argument that does not exist is created empty. (Not helpful.)'
|
|
echo
|
|
echo 'options:'
|
|
echo ' -h display short help and exit'
|
|
echo ' --help display this longer help and exit'
|
|
echo ' -v, --version output version information and exit'
|
|
echo
|
|
echo 'This should work across timezones and across Daylight Savings times.'
|
|
echo
|
|
echo 'fqt is short for FLAMP Queue Touch'
|
|
}
|
|
|
|
Version()
|
|
{
|
|
echo 'fqt - FLAMP Queue Touch'
|
|
echo 'Not Copyrighted'
|
|
echo 'No License'
|
|
echo 'This is free software: you are free to change and redistribute it.'
|
|
echo 'There is NO WARRANTY, to the extent permitted by law.'
|
|
echo
|
|
echo 'Use at your own risk!'
|
|
echo
|
|
echo 'Written by a ham.'
|
|
}
|
|
|
|
# Note that we use "$@" to let each command-line parameter expand to a
|
|
# separate word. The quotes around "$@" are essential!
|
|
# We need TEMP as the 'eval set --' would nuke the return value of getopt.
|
|
if ! TEMP=$(getopt -o '::hv' --long 'help,version' -n 'fqt' -- "$@") ;
|
|
then
|
|
echo 'Unexpected input. Terminating...' >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Note the quotes around "$TEMP": they are essential!
|
|
eval set -- "$TEMP"
|
|
unset TEMP
|
|
|
|
|
|
# getopt -l "help" -a -o "" -- "$@"
|
|
while true; do
|
|
case "$1" in
|
|
'-h')
|
|
Help
|
|
exit;;
|
|
'--help')
|
|
LongHelp
|
|
exit;;
|
|
'-v'|'--version')
|
|
Version
|
|
exit;;
|
|
'--') # Useless for this file?
|
|
shift
|
|
break;;
|
|
*) # Invalid option
|
|
echo 'Error: Invalid option'
|
|
exit 1;;
|
|
esac
|
|
done
|
|
|
|
GIVEN="$1"
|
|
#echo "$GIVEN"
|
|
# YYYYmmddHHMMSS
|
|
# 20230607013934
|
|
|
|
GIVEN_DATE=$(echo "$GIVEN" | sed 's/\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1-\2-\3 \4:\5:\6/')
|
|
#echo "$GIVEN_DATE"
|
|
# YYYY-mm-dd HH:MM:SS
|
|
# 2023-06-07 01:39:34
|
|
|
|
UTC_TOUCH="$(date -d "$GIVEN_DATE"Z +%Y%m%d%H%M.%S)"
|
|
#echo "$UTC_TOUCH"
|
|
# YYYYmmddHHMM.SS
|
|
# 202306062139.34
|
|
|
|
echo touch -mt "$UTC_TOUCH" "$2"
|
|
touch -mt "$UTC_TOUCH" "$2"
|
|
|
|
|
|
function calc_crc16( )
|
|
{
|
|
# Modified from
|
|
# https://github.com/onslauth/bash_crc16/blob/master/crc16-table.sh
|
|
|
|
# poly=0x8005
|
|
|
|
declare -a crc_16_table=(
|
|
0x0000 0xC0C1 0xC181 0x0140 0xC301 0x03C0 0x0280 0xC241
|
|
0xC601 0x06C0 0x0780 0xC741 0x0500 0xC5C1 0xC481 0x0440
|
|
0xCC01 0x0CC0 0x0D80 0xCD41 0x0F00 0xCFC1 0xCE81 0x0E40
|
|
0x0A00 0xCAC1 0xCB81 0x0B40 0xC901 0x09C0 0x0880 0xC841
|
|
0xD801 0x18C0 0x1980 0xD941 0x1B00 0xDBC1 0xDA81 0x1A40
|
|
0x1E00 0xDEC1 0xDF81 0x1F40 0xDD01 0x1DC0 0x1C80 0xDC41
|
|
0x1400 0xD4C1 0xD581 0x1540 0xD701 0x17C0 0x1680 0xD641
|
|
0xD201 0x12C0 0x1380 0xD341 0x1100 0xD1C1 0xD081 0x1040
|
|
0xF001 0x30C0 0x3180 0xF141 0x3300 0xF3C1 0xF281 0x3240
|
|
0x3600 0xF6C1 0xF781 0x3740 0xF501 0x35C0 0x3480 0xF441
|
|
0x3C00 0xFCC1 0xFD81 0x3D40 0xFF01 0x3FC0 0x3E80 0xFE41
|
|
0xFA01 0x3AC0 0x3B80 0xFB41 0x3900 0xF9C1 0xF881 0x3840
|
|
0x2800 0xE8C1 0xE981 0x2940 0xEB01 0x2BC0 0x2A80 0xEA41
|
|
0xEE01 0x2EC0 0x2F80 0xEF41 0x2D00 0xEDC1 0xEC81 0x2C40
|
|
0xE401 0x24C0 0x2580 0xE541 0x2700 0xE7C1 0xE681 0x2640
|
|
0x2200 0xE2C1 0xE381 0x2340 0xE101 0x21C0 0x2080 0xE041
|
|
0xA001 0x60C0 0x6180 0xA141 0x6300 0xA3C1 0xA281 0x6240
|
|
0x6600 0xA6C1 0xA781 0x6740 0xA501 0x65C0 0x6480 0xA441
|
|
0x6C00 0xACC1 0xAD81 0x6D40 0xAF01 0x6FC0 0x6E80 0xAE41
|
|
0xAA01 0x6AC0 0x6B80 0xAB41 0x6900 0xA9C1 0xA881 0x6840
|
|
0x7800 0xB8C1 0xB981 0x7940 0xBB01 0x7BC0 0x7A80 0xBA41
|
|
0xBE01 0x7EC0 0x7F80 0xBF41 0x7D00 0xBDC1 0xBC81 0x7C40
|
|
0xB401 0x74C0 0x7580 0xB541 0x7700 0xB7C1 0xB681 0x7640
|
|
0x7200 0xB2C1 0xB381 0x7340 0xB101 0x71C0 0x7080 0xB041
|
|
0x5000 0x90C1 0x9181 0x5140 0x9301 0x53C0 0x5280 0x9241
|
|
0x9601 0x56C0 0x5780 0x9741 0x5500 0x95C1 0x9481 0x5440
|
|
0x9C01 0x5CC0 0x5D80 0x9D41 0x5F00 0x9FC1 0x9E81 0x5E40
|
|
0x5A00 0x9AC1 0x9B81 0x5B40 0x9901 0x59C0 0x5880 0x9841
|
|
0x8801 0x48C0 0x4980 0x8941 0x4B00 0x8BC1 0x8A81 0x4A40
|
|
0x4E00 0x8EC1 0x8F81 0x4F40 0x8D01 0x4DC0 0x4C80 0x8C41
|
|
0x4400 0x84C1 0x8581 0x4540 0x8701 0x47C0 0x4680 0x8641
|
|
0x8201 0x42C0 0x4380 0x8341 0x4100 0x81C1 0x8081 0x4040
|
|
)
|
|
|
|
input="$1"
|
|
# crc=0 # for CRC-16/ARC
|
|
crc=65535 # for CRC-16/MODBUS
|
|
|
|
len=${#input}
|
|
for (( i = 0; i<len; i++ ))
|
|
do
|
|
char=${input:$i:1}
|
|
j=$( printf "%02x" "'$char" )
|
|
declare -i buf=0x${j}
|
|
crc=$(( crc_16_table[ ( crc ^ buf ) & 0xff ] ^ ( crc >> 8 ) ))
|
|
done
|
|
|
|
printf "%04X" $crc
|
|
}
|
|
|
|
crc16=$( calc_crc16 "123456789" )
|
|
echo "crc16 : 123456789 : $crc16"
|
|
echo "CRC-16/ARC BB3D"
|
|
echo "CRC-16/MODBUS 4B37"
|
|
|
|
DEMO=20230610151423:flamp-file.k2s1base6464
|
|
crc16=$( calc_crc16 "$DEMO" )
|
|
echo "crc16 : $DEMO : $crc16 "
|
|
echo "CRC-16/ARC D9F6"
|
|
echo "CRC-16/MODBUS D5C6"
|
|
|
|
echo
|
|
# echo UTC_TOUCH "$UTC_TOUCH"
|
|
CONVERT_BACK_TO_DATE=$(echo "$UTC_TOUCH" | sed 's/\(....\)\(..\)\(..\)\(..\)\(..\)\.\(..\)/\1-\2-\3 \4:\5:\6/')
|
|
echo CONVERT_BACK_TO_DATE "$CONVERT_BACK_TO_DATE"
|
|
OFFSET=$(date -d "$CONVERT_BACK_TO_DATE" +%z)
|
|
echo "$OFFSET"
|
|
FLAMP_DATE=$(TZ=':Zulu' date -d "$CONVERT_BACK_TO_DATE $OFFSET" +%Y%m%d%H%M%S)
|
|
echo FLAMP_DATE "$FLAMP_DATE"
|
|
CONVERT_BACK_TO_DATE=$(stat -c %y flamp-file.k2s)
|
|
echo CONVERT_BACK_TO_DATE "$CONVERT_BACK_TO_DATE"
|
|
FLAMP_DATE=$(TZ=':Zulu' date -d "$CONVERT_BACK_TO_DATE" +%Y%m%d%H%M%S)
|
|
echo FLAMP_DATE "$FLAMP_DATE"
|
|
DEMO1C="$FLAMP_DATE:${2}1base6464"
|
|
crc16=$( calc_crc16 "$DEMO1C" )
|
|
echo "Compression On : crc16 : $DEMO1C : $crc16"
|
|
DEMO1NC="$FLAMP_DATE:${2}0base6464"
|
|
crc16=$( calc_crc16 "$DEMO1NC" )
|
|
echo "Compression Off : crc16 : $DEMO1NC : $crc16"
|
|
echo
|
|
|
|
DEMO2="${1}:${2}1base6464"
|
|
crc16=$( calc_crc16 "$DEMO2" )
|
|
echo "crc16 : $DEMO2 : $crc16"
|