#!/bin/bash
###############################################################################################################
# Titel: sdsfrpoc
# Autor: Michael Kaden
# Datum: 14.09.2014
#
# Funktion:
# Dieses Skript ist ein Teilprogramm von fdtsds. 
# Enthält eine SDS-TL (Type 4) eine Empfangsquittungsanforderung im Message Header, so kann eine 
# "Delivery Report"-SDS an den Absender versandt werden. Empfangene Status-SDS können quittiert werden, in dem der empfangene
# Status an den Absender als Status-SDS zurückgesandt wird, wenn die SDS in die DB geschrieben werden konnte.
#
# Zweck:
# Das Script soll als Hintergrundprozess auf einem Statusmonitor-PC laufen, der mittels RS232-Schnittstellen (auch 
# USB/Seriell-Konverter oder Ethernet-Serial-Device-Server) mit einem PEI-Interface eines TETRA Funkgerätes verbunden ist. 
# Die in der MySQL-Datenbank gesammelten SDS können so in anderen Anwendungen, z.B. Einsatzführungssoftware, ausgewertet 
# werden, um z.B. Status-, Positions- oder Text-Informationen zu verarbeiten.
#
# Copyright (C) 2014 Michael Kaden
#
# Dieses Programm ist freie Software. Sie können es unter Beachtung der Nutzungsbedingungen benutzen, 
# weitergeben und modifizieren.
# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen von Nutzen sein wird, 
# aber OHNE IRGENDEINE GARANTIE, sogar ohne die Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN 
# BESTIMMTEN ZWECK. 
###############################################################################################################

# Config-File einlesen
source /usr/local/smi/sub/etc/sdsfrpoc.conf

# Konstanen und Variablen definieren
myname=$(echo $0 | $awk -F/ '{ print $NF }')

# alle MQTT-Messages des Read-Spoolers in einer Endlosschleife einlesen
while read -r line; do

	# hole aktuellen Timestamp
	now=$(date +%s)

	# erzeuge ein assoziatives Array um die JSON-Message zu speichern
	declare -A json
	
	# erstelle Liste der Keys im JSON-Objekt
	keys=$(echo "$line" | $jq -r 'keys[]')
	
	# übernehme JSON-Objekt in Array
	for i in $keys; do json[${i}]=$(echo "$line" | $jq -r .${i}); done

	if [ "${json[vis]}" = "1" ]; then
	
		# notify processing a new JSON-Objekt
		log "$myname" "processing new POCSAG JSON object"
	
		# write the json array content into the logfile
		for i in $keys; do log "$myname" "  $i: ${json[${i}]}"; done
		log "$myname" "done"
	
		log "$myname" "transforming POCSAG message to SDS-PDU"
	
		# build text from POCSAG message elements; Decodiere den Message-Text zurück aus "base64"
		text="${json[ric]} ${json[sub]} $(echo -n ${json[txt]} | $base64 -d)"
		#length=${#text}
		# todo: Textlänge bestimmen, wenn länger als SDS max aufteilen, markieren [3-1], [3-2], [3-3], und per mehrerer SDS publishen

		# creating SDS PDU
		TXT_PDU=$("$php" "$SDSencoder" --ProtoIdent 130 --MsgType 0 --DelivRepReq 0 --ShrtFmRep 0 --StorFwd 0 --MsgRef 255 --TimStmpUsd 0 --TxtCodSch 1 --Text "$text")
		TXT_PDU=$(echo $TXT_PDU | tr -d '\r\n" "')

		# creating SDS JSON object
		message="{ \"host\": \"$host\", \"pub\": \"smi/sub/sdsfrpoc\", \"sys\": \"sds\", \"ts\": \"$now\", \"type\": \"message\", \"dev\": \"${json[dev]}\", \"dir\": \"rx\", \"st\": \"12\", \"from\": \"$virtual_ISSI\", \"ft\": \"0\", \"to\": \"$virtual_ISSI\", \"tt\": \"0\", \"ln\": \"$(echo "${#TXT_PDU}*4" | bc)\", \"ud\": \"${TXT_PDU}\" }"

		# publishing SDS JSON object on MQTT
		$mosquitto_pub -t "$(eval echo $MqttMsgOut)" -m "$message"
		
		# clear json array
		unset json
		declare -A json
	
		# erstelle Liste der Keys im JSON-Objekt
		keys=$(echo "$message" | $jq -r 'keys[]')

		# übernehme JSON-Objekt in Array
		for i in $keys; do json[${i}]=$(echo "$message" | $jq -r .${i}); done

		# write the json array content into the logfile
		for i in $keys; do log "$myname" "  $i: ${json[${i}]}"; done

		log "$myname" "done"
	fi
	unset json
done < <($mosquitto_sub -t "$(eval echo $MqttMsgIn)")
exit 0

