Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
cd340eb345 | |||
a8ef87496c | |||
cef0df387c |
5
.cspell.json
Normal file
5
.cspell.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"version": "0.2",
|
||||
"language": "en",
|
||||
"words": ["FLAMP"]
|
||||
}
|
75
README.md
Normal file
75
README.md
Normal 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
99
fqt
@ -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
19
given.txt
Normal 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
180
index.html
Normal 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>
|
Loading…
Reference in New Issue
Block a user