Compare commits

...

3 Commits

Author SHA1 Message Date
cd340eb345 Web tool - given a hash, compute day and time 2023-08-03 16:55:24 -04:00
a8ef87496c Change Markdown language presentation 2023-06-12 16:47:53 -04:00
cef0df387c Lots of ideas 2023-06-12 16:37:47 -04:00
5 changed files with 377 additions and 1 deletions

5
.cspell.json Normal file
View File

@ -0,0 +1,5 @@
{
"version": "0.2",
"language": "en",
"words": ["FLAMP"]
}

75
README.md Normal file
View File

@ -0,0 +1,75 @@
# fqt - FLAMP Queue Touch
## Desired Use Cases
Do a lot of checking.
Prompt user. They don't use this tool often. Guide them and prompt them.
Allow prompts to be overridden with `-y|--yes` or `-f|--force` and by piping `yes` command?
```console
$ fqt filename.k2s
2023-06-02 02:00:00 -04:00
2023-06-01 22:00:00 Z
Yes Compression, base 64, block size 64: D6F6
No Compression, base 64, block size 64 : A123
$ fqt -z filename.k2s
2023-06-02 02:00:00 -04:00
2023-06-01 22:00:00 Z
Yes Compression, base 64, block size 64: D6F6
$ fqt -r filename.k2s
2023-06-02 02:00:00 -04:00
2023-06-01 22:00:00 Z
No Compression, base 64, block size 64 : A123
$ fqt -b128 filename.k2s
2023-06-02 02:00:00 -04:00
2023-06-01 22:00:00 Z
Yes Compression, base 128, block size 64: D6F6
No Compression, base 128, block size 64 : A123
$ fqt -s96 filename.k2s
2023-06-02 02:00:00 -04:00
2023-06-01 22:00:00 Z
Yes Compression, base 64, block size 96: D6F6
No Compression, base 64, block size 96 : A123
$ fqt --base256 --block-size=96 filename.k2s
2023-06-02 02:00:00 -04:00
2023-06-01 22:00:00 Z
Yes Compression, base 256, block size 96: D6F6
No Compression, base 256, block size 96 : A123
$ fqt 20230610151423 filename.k2s
Before:
2023-06-02 02:00:00 -04:00
2023-06-01 22:00:00 Z
Yes Compression, base 64, block size 64: D6F6
No Compression, base 64, block size 64 : A123
After:
2023-06-10 15:14:23 -04:00
2023-06-10 11:14:23 Z
Yes Compression, base 64, block size 64: EF45
No Compression, base 64, block size 64 : 5D4E
```
```text
-b64, --base64 Select encoding scheme.
-b128, --base128 Default is base64.
-b256, --base256
-s, --block-size=SIZE Sets block size in multiples of 16, default 64.
-z, --use-compression compression yes, common for large files like bulletins.
-r, --no-compression compression no, common for smaller files like signatures.
--no-date Suppress dates display in output.
-h, --display-hash Display hash alone.
-q, --quiet Minimal output.
-f, -y, --force, --yes No prompting before changing file date.
```

99
fqt
View File

@ -64,6 +64,9 @@ LongHelp()
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
@ -145,5 +148,99 @@ UTC_TOUCH="$(date -d "$GIVEN_DATE"Z +%Y%m%d%H%M.%S)"
# YYYYmmddHHMM.SS
# 202306062139.34
#echo touch -mt "$UTC_TOUCH" "$2"
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"

19
given.txt Normal file
View File

@ -0,0 +1,19 @@
given:
20230607013934
-04 hours (because my computer is EDT?)
output:
202306062139.34
2023 06 07 01 39 34
2023-06-07 01:39:34
2023-06-07 01:39:34-0400
# 20230607013934
GIVEN=20230607013934
GIVEN_DATE=$(echo $GIVEN | sed 's/\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1-\2-\3 \4:\5:\6/')
# 2023-06-07 01:39:34
UTC="$(date -d "$GIVEN_DATE"Z +%Y%m%d%H%M.%S)"

180
index.html Normal file
View File

@ -0,0 +1,180 @@
<!DOCTYPE html>
<!-- cSpell:ignore blocksize Cbase hhmmss modbus XXYY yaacov -->
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Queue Computer</title>
<!-- <link rel="stylesheet" href="./style.css"> -->
<!-- <link rel="icon" href="./favicon.ico" type="image/x-icon"> -->
</head>
<body>
<script>
/**
* Calculates the buffers CRC16.
*
* @param buffer the data buffer.
* @return the calculated CRC16.
*
* Source: github.com/yaacov/node-modbus-serial
*/
const crc16 = (buffer) => {
let crc = 0xffff;
// let crc = 0x0000;
let odd;
for (let i = 0; i < buffer.length; i++) {
crc = crc ^ buffer[i];
for (let j = 0; j < 8; j++) {
odd = crc & 0x0001;
crc = crc >> 1;
if (odd) {
crc = crc ^ 0xa001;
}
}
}
return crc.toString(16).toUpperCase();
};
const encoder = new TextEncoder();
const doThing = () => {
updateString();
const start = new Date();
let itr = 0;
const matches = [];
const staticFront = front(); // Single document call is faster in loop critical path
const staticBack = back(); // Single document call is faster in loop critical path
const queue = document.getElementById("queue").value;
for (let day = 1; day < 31; day++) {
for (let hour = 0; hour < 24; hour++) {
for (let minute = 0; minute < 60; minute++) {
for (let second = 0; second < 60; second++) {
itr++;
const dtg =
// 123456789 : 4B37
// "20230610151423:flamp-file.k2s1base6464" : D5C6
// "20230610" +
// ("00" + hour).slice(-2) +
// ("00" + minute).slice(-2) +
// ("00" + second).slice(-2) +
// ":flamp-file.k2s1base6464";
staticFront +
("00" + day).slice(-2) +
("00" + hour).slice(-2) +
("00" + minute).slice(-2) +
("00" + second).slice(-2) +
staticBack;
const res = crc16(encoder.encode(dtg));
if (res === queue) {
matches.push([
("00" + day).slice(-2) +
" " +
("00" + hour).slice(-2) +
":" +
("00" + minute).slice(-2) +
":" +
("00" + second).slice(-2),
dtg,
]);
console.log({
msg: "MATCH!!!",
dtg,
time: hour + ":" + minute + ":" + second,
res,
itr,
});
}
// console.log({ res });
}
}
}
}
const end = new Date();
let report = matches.map((arr) => arr.join(" - ")).join("\n");
console.log({
matchesCount: matches.length,
matches,
itr,
start,
end,
diff: end.getTime() - start.getTime(),
});
report =
report +
"\n\nFound " +
matches.length +
" matches in " +
(end.getTime() - start.getTime()) +
" milliseconds.";
document.getElementById("results").value = report;
};
const front = () => document.getElementById("date").value;
const back = () =>
":" +
document.getElementById("filename").value +
(document.getElementById("compressed").checked ? "1" : "0") +
document.getElementById("encoding").value +
document.getElementById("blocksize").value;
const updateString = () => {
document.getElementById("dtgAndMore").innerHTML =
front() + "DDhhmmss" + back();
};
</script>
<main>
<h1>Queue Computer for the Month</h1>
<p>
<label for="queue">Queue</label>
<input id="queue" value="D5C6" onchange="updateString()" /><br />
<label for="date">Date</label>
<input id="date" value="202306" onchange="updateString()" /><br />
<label for="filename">Filename</label>
<input
id="filename"
value="flamp-file.k2s"
onchange="updateString()"
/><br />
<label for="compressed">Compressed</label>
<input
type="checkbox"
id="compressed"
checked
onchange="updateString()"
/><br />
<label for="encoding">Encoding</label>
<select id="encoding" value="base64" onchange="updateString()">
<option value="base64" selected>base64</option>
<option value="base128">base128</option>
<option value="base256">base256</option></select
><br />
<label for="blocksize">BlockSize</label>
<select id="blocksize" value="64" onchange="updateString()">
<option value="32">32</option>
<option value="64" selected>64</option>
<option value="128">128</option>
<option value="256">256</option></select
><br />
<label id="dtgAndMore">YYYYMMDDhhmmss:filenameCbaseXXYY</label>
</p>
<button onclick="doThing()">Do the Thing!</button><br />
<label for="results">Results</label>
<textarea type="text" cols="55" rows="12" id="results" value=""></textarea
><br />
</main>
<!-- <script src="index.js"></script> -->
</body>
</html>