1
0
minibtx-acn/pc-software/test/cept.c

176 lines
6.2 KiB
C
Raw Normal View History

2018-06-01 10:49:06 +02:00
/*
####################################################################################
# #
# Bildschirmtricks miniBTX V1.0.0 #
# a (poor) cept protocol implementation #
# #
# Copyright (C) 2008 Philipp Fabian Benedikt Maier (aka. Dexter) #
# #
# This program 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 2 of the License, or #
# (at your option) any later version. #
# #
# This program 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 this program; if not, write to the Free Software #
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #
# #
#################################################################################### */
/* ## HEADER ########################################################################## */
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <ttybanana.h> /* TTY-Functions of libCodebananas */
#include <toolbanana.h> /* Tool-Functions of libCodebananas */
#include <unistd.h>
#include <string.h>
#include "cept.h" /* Include own header file */
/* #################################################################################### */
/* #################################################################################### */
/* Query CEPT terminal */
void systemCeptQuery(char *string, int length, char *response, char *port, int linkLayer)
{
int i;
int crc16 = 0;
memset(response, 0x00, sizeof(response));
printf("\n\r\n\rPerforming terminal query:\n\r");
if(length == 0)
printf("* Length of transmission data is null - omitting transmission pass ...\n\r");
else
{
if(linkLayer == CEPT_LINKLAYER)
printf("* Transmitting CEPT data block (linklayer secured) ...\n\r");
else
printf("* Transmitting CEPT data block ...\n\r");
if(linkLayer == CEPT_LINKLAYER)
{
printf("* Sending STX 0x%02x...\n\r", CEPT_STX);
ttyPutchar(port,CEPT_STX); /* Transmit STX-Token, form now on the transmission begins */
}
printf("* Sending Data...\n\r");
hexBinAsciiDump(string,length);
for(i=0;i<length;i++) /* Transmit data and calculate CRC */
{
ttyPutchar(port,string[i]);
crc16 = crcComputationCycle(string[i], 0xA001, crc16);
}
if(linkLayer == CEPT_LINKLAYER)
{
crc16 = crcComputationCycle(CEPT_ETX, 0xA001, crc16); /* Send the STX token - the token goes with in the CRC-calculation */
printf("* Sending ETX 0x%02x...\n\r", CEPT_ETX);
ttyPutchar(port,CEPT_ETX);
printf("* Adding lower CRC16 byte %02hhx...\n\r", (char)crc16);
ttyPutchar(port,(char)crc16); /* Transmit the CRC */
printf("* Adding higher CRC16 byte %02hhx...\n\r", (char)(crc16 >> 8));
ttyPutchar(port,(char)(crc16 >> 8));
}
}
printf("* Receiving response...\n\r");
usleep(CEPT_RESPONSE_TIMOUT); /* Wait some time to be sure that some response data is already in buffer when we start receiving) */
ttyReadNonblocking(port, response, CEPT_RESPONSE_TIMOUT); /* Read the data */
if(response[0] == '\0')
printf(" (no data received)\n\r");
else
hexBinAsciiDump(response,strlen(response));
printf("done!\n\r");
fflush(stdout);
return;
}
/* Filter keyboard input from terminal response (Rip off non printable chars and known protocol patterns) */
void systemCeptFilterKeyboardinput(char *responsedata, char *keyboarddata)
{
printf("\n\r\n\rFilter keyboard-data from Transmission response\n\r");
char *keyboarddataPointer;
char *responsedataPointer;
char *keyboarddataAheadPointer;
printf("* Ripping protocol fragments...\n\r");
keyboarddataPointer = keyboarddata;
responsedataPointer = responsedata;
do
{
/* Rip off the CEPT_DLE, 0x30/0x31 acknoledgement token */
if((*responsedataPointer == CEPT_DLE)&&((*(responsedataPointer+1) == 0x30)||(*(responsedataPointer+1) == 0x31)))
responsedataPointer+=2;
else
{
/* Replace Terminator and Initiator with printable characters */
if(*responsedataPointer == CEPT_INI)
*keyboarddataPointer = '*';
else if(*responsedataPointer == CEPT_TER)
*keyboarddataPointer = '#';
else
*keyboarddataPointer = *responsedataPointer;
/* Note: In a serious Videotex application you should NOT replace terminator and initiator
with thier printable pendants to avoid missunderstandings. */
keyboarddataPointer++;
responsedataPointer++;
}
} while(*responsedataPointer != '\0');
*keyboarddataPointer = '\0';
printf("* Ripping non printable characters...\n\r");
keyboarddataPointer = keyboarddata;
keyboarddataAheadPointer = keyboarddata;
do
{
if((*keyboarddataAheadPointer >= 0x20)&&(*keyboarddataAheadPointer <= 0x7E))
{
*keyboarddataPointer = *keyboarddataAheadPointer;
keyboarddataPointer++;
}
keyboarddataAheadPointer++;
} while(*keyboarddataAheadPointer != '\0');
*keyboarddataPointer = '\0';
printf("* The remaining data is:\n\r");
if(keyboarddata[0] == '\0')
printf(" (the string contained no keyboard data)\n\r");
else
hexBinAsciiDump(keyboarddata,strlen(keyboarddata));
fflush(stdout);
return;
}
/* #################################################################################### */