- Added missing file charbychar.c which contains a protocol handler
which writes char by char, thereby waiting for the echo character to be received in between.
This commit is contained in:
73
charbychar.c
Normal file
73
charbychar.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* charbychar.c
|
||||||
|
*
|
||||||
|
* This is a variation of the standard AsonHandler which implements
|
||||||
|
* a char by char mode while sending. This means, that the protocol
|
||||||
|
* handler waits for the echoed character from the device before sending
|
||||||
|
* the next character.
|
||||||
|
*
|
||||||
|
* Created on: Apr 1, 2010
|
||||||
|
* Author: koennecke
|
||||||
|
*/
|
||||||
|
#include <errno.h>
|
||||||
|
#include <ascon.h>
|
||||||
|
#include <ascon.i>
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------
|
||||||
|
* I am abusing the echo field as a flag if we are reading
|
||||||
|
* an echo char or not
|
||||||
|
-----------------------------------------------------------*/
|
||||||
|
static int CharByCharHandler(Ascon *a)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char chr;
|
||||||
|
|
||||||
|
switch(a->state){
|
||||||
|
case AsconWriting:
|
||||||
|
if(a->wrPos < GetDynStringLength(a->wrBuffer)){
|
||||||
|
ret = AsconWriteChars(a->fd,GetCharArray(a->wrBuffer)+a->wrPos,1);
|
||||||
|
if (ret < 0) {
|
||||||
|
AsconError(a, "ASC4", errno); /* sets state to AsconFailed */
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
a->wrPos++;
|
||||||
|
a->private = (void *)1;
|
||||||
|
a->state = AsconReading;
|
||||||
|
a->start = DoubleTime();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
a->private = NULL;
|
||||||
|
a->state = AsconWriteDone;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case AsconReading:
|
||||||
|
/**
|
||||||
|
* Here I rely on the fact that the base
|
||||||
|
* handler, in AsconReadStart, clears the
|
||||||
|
* rdBuffer of amassed echo characters.
|
||||||
|
*/
|
||||||
|
ret = AsconStdHandler(a);
|
||||||
|
if(ret == 1){
|
||||||
|
if(a->private != NULL){
|
||||||
|
a->state = AsconWriting;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return AsconStdHandler(a);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
void AddCharByCharProtocoll()
|
||||||
|
{
|
||||||
|
AsconProtocol *prot = NULL;
|
||||||
|
|
||||||
|
prot = calloc(sizeof(AsconProtocol), 1);
|
||||||
|
prot->name = strdup("charbychar");
|
||||||
|
prot->init = AsconStdInit;
|
||||||
|
prot->handler = CharByCharHandler;
|
||||||
|
AsconInsertProtocol(prot);
|
||||||
|
}
|
Reference in New Issue
Block a user