//	cwtest1.c	gg630504 hg9ieg linux.ubuntu.gcc utf-8
//	2020-12-23 - 2020-12-28 - 2022-03-01
// $ sudo usermod -a -G dialout $USER
// $ sudo apt-get update
// $ sudo apt-get install gcc
// $ sudo apt-get install make

#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <time.h>
#include <unistd.h>

#include "ggstd.h"

#include "ggch.h"
#include "ggcw.h"
#include "ggfs.h"

#define _bdTest		8.0		// sebesség, baud, >1, https://hg9ieg.hu/szamolo/_sz/BT_BCW.html
#define szFnKey		"/dev/ttyUSB0"	// LD-C103

#define fMark		fTrue		// jel, adás
#define fSpace		fFalse		// szünet

typedef struct	{
useconds_t	_tclk1;		// elemi idő órajelben: CLOCKS_PER_SEC/_bdTest
BW		bwKey;		// LD-C103 RTS modemvezérlő mint billentyű: TIOCM_RTS
F		fFirst;		// első vagy első szünet karakter(ek)

FD		fdAct;		// állomány
W		wSpace;		// előjegyzett szünet hossza elemi időben 1, 3, 7
}		CWTX;		// adás státusz

typedef CWTX *	PCWTX;

CWTX		cwtx = { CLOCKS_PER_SEC/_bdTest, TIOCM_RTS, fTrue };	// adás státusz

//---------------------------------------------------------------------
// modemvezérlő bit beállítása
R	RModemFdBwF( FD, BW, F );
R	RModemFdBwF( fd_, bw_, f_ )
FD	fd_;	// állomány
BW	bw_;	// bitek maszkja
F	f_;	// beállítás
{
return( ioctl( fd_, f_ ? TIOCMBIS : TIOCMBIC, &bw_ )!=0 ? -errno : rSucceed );
}

//---------------------------------------------------------------------
// távírójelet/távírószünetet ad
R		RCwTxPcwtxFW( PCWTX, F, W );
R		RCwTxPcwtxFW( pcwtx_, f_, w_ )
PCWTX		pcwtx_;	// adás státusz
F		f_;	// jel/szünet
W		w_;	// jel/szünet hossza elemi időben

{
R		r;
IX		ix;

r = rSucceed;
if( (r=RModemFdBwF( pcwtx_->fdAct, pcwtx_->bwKey, f_ ))!=rSucceed ) goto ret;
for( ix = 0; ix<w_; ix++ )
	if( (r=usleep( pcwtx_->_tclk1 ))<0 ) goto ret;
ret:
return( r );
}

//---------------------------------------------------------------------
// egy unicode karaktert ad távíróban
R		RCwTxPcwtxCu( PCWTX, CU );
R		RCwTxPcwtxCu( pcwtx_, cu_ )
PCWTX		pcwtx_;		// adás státusz
CU		cu_;		// adandó unicode karakter

{
R		r;
CWC		cwc;

r = rSucceed;
if( (cwc=CwcFromCu( cu_ ))!=0 )	// távírókód unicode-ból
	{
	if( cwc==cwcSpace )	// szóköz
		{
		if( !pcwtx_->fFirst )
			pcwtx_->wSpace = 7;	// előjegyzett távírószünet
		}
	else	{
		pcwtx_->fFirst = fFalse;
		// előjegyzett szünet
		if( (r=RCwTxPcwtxFW( pcwtx_, fSpace, pcwtx_->wSpace ))!=rSucceed ) goto ret;

		while( !(cwc==cwcEnd) )
			{
			// hosszú (3) vagy rövid (1) távírójel
			if( (r=RCwTxPcwtxFW( pcwtx_, fMark, cwc & cwcBit ? 3 : 1 ))!=rSucceed ) goto ret;
			// következő távírójel beléptetése
			ShiftCwc( cwc );
			if( cwc!=cwcEnd )
				{
				// karakteren belüli 1 szünet
				if( (r=RCwTxPcwtxFW( pcwtx_, fSpace, 1 ))!=rSucceed ) goto ret;
				}
			}

		pcwtx_->wSpace = 3;	// előjegyzett szünet
		}
	}
else	{ r = rNotFound; goto ret; }
ret:
return( r );
}

//---------------------------------------------------------------------
// szöveget ad távíróban
R		RCwTxPcwtxSz( PCWTX, SZ );
R		RCwTxPcwtxSz( pcwtx_, sz_ )
PCWTX		pcwtx_;		// adás státusz
SZ		sz_;		// adandó szöveg UTF-8

{
CU		cu;
R		r;

r = rSucceed;
while( (cu=CuFromPsz( &sz_ ))!=cuEos && (r=RCwTxPcwtxCu(  pcwtx_, cu ))>=0 )
	;
if( (r=RModemFdBwF( pcwtx_->fdAct, pcwtx_->bwKey, fSpace ))!=rSucceed ) goto ret;
ret:
return( r );
}

//---------------------------------------------------------------------
int		main( cv_, pszv_, psze_ )
int		cv_;	// be:		paraméterek száma
char**		pszv_;	// be:		paraméterek tömbje
char**		psze_;	// be:		környezet tömbje
			// vissza:	hibakód abszolút értéke
{
R		r;

r = rSucceed;

//-------
fprintf( stdout, szPrgr "/cwtest1/" __DATE__ " " __TIME__ "\n" );

fprintf( stdout, "%s, %6.1f baud, %6.1f ms\n", szFnKey, _bdTest, 1000.0/_bdTest );

if( (cwtx.fdAct = open( szFnKey, O_RDWR | O_NOCTTY | O_NDELAY ))<0 )
	{ r = -errno; goto ret; }

if( (r=RModemFdBwF( cwtx.fdAct, cwtx.bwKey, fSpace ))!=rSucceed ) goto ret;	// szünet

if( (r=RCwTxPcwtxSz( &cwtx, "Hello world!" ))!=rSucceed ) goto ret;

if( (r=close( cwtx.fdAct ))<0 ) goto ret;

//-------
ret:
fprintf( stdout, "Hibakód: %d\n", r );
return( r<0 ? -r : r );
}

