add response when sending a S command
r2918 | jgn | 2010-05-12 12:15:24 +1000 (Wed, 12 May 2010) | 2 lines
This commit is contained in:
committed by
Douglas Clowes
parent
d2cf223047
commit
3b8b81a19b
@@ -43,6 +43,7 @@ struct RFAmpData {
|
||||
int transactInProg;
|
||||
int targetCurrent;
|
||||
char rfCmd[16];
|
||||
char statusCmd[5];
|
||||
};
|
||||
|
||||
void RFAmpKill(void *private)
|
||||
@@ -51,14 +52,15 @@ void RFAmpKill(void *private)
|
||||
free(data);
|
||||
}
|
||||
|
||||
enum transactionState {txNormalRead, txPreCheck};
|
||||
enum transactionState {txNormalRead, txPreSet, txPostSet, txCheckReply};
|
||||
|
||||
|
||||
/**
|
||||
* @brief Translates ASCII command string into a properly formatted command for the RF amplifier
|
||||
*/
|
||||
int RFAmpWriteStart (Ascon *a)
|
||||
{
|
||||
char *dynStrBuffer, errMsg[ERRLEN], statusCmd[5];
|
||||
char *dynStrBuffer, errMsg[ERRLEN];
|
||||
char ctype='X', address='0';
|
||||
unsigned char switches=0;
|
||||
int curr, freq, outOn, K1, K2, K3;
|
||||
@@ -105,7 +107,8 @@ int RFAmpWriteStart (Ascon *a)
|
||||
return 1;
|
||||
}
|
||||
if (curr < MINCURRSPEC || curr > MAXCURRSPEC) {
|
||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid current specifier %d, it should be between %d and %d. NOTE:divide by 10 to convert to Amps", curr, MINCURRSPEC, MAXCURRSPEC);
|
||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid current specifier %d, it should be between %d and %d. NOTE:divide by 10 to convert to Amps", \
|
||||
curr, MINCURRSPEC, MAXCURRSPEC);
|
||||
a->state = AsconWriteDone;
|
||||
a->noResponse = 1;
|
||||
AsconError(a, errMsg, 0);
|
||||
@@ -133,9 +136,9 @@ int RFAmpWriteStart (Ascon *a)
|
||||
AsconError(a, errMsg, 0);
|
||||
return 1;
|
||||
}
|
||||
sprintf(statusCmd,"%c%c%c%c", 2, address, 'L', 3);
|
||||
DynStringReplaceWithLen(a->wrBuffer, statusCmd, 0, LCMDLEN);
|
||||
data->transactInProg = txPreCheck;
|
||||
sprintf(data->statusCmd,"%c%c%c%c", 2, address, 'L', 3);
|
||||
DynStringReplaceWithLen(a->wrBuffer, data->statusCmd, 0, LCMDLEN);
|
||||
data->transactInProg = txPreSet;
|
||||
data->targetCurrent = curr;
|
||||
a->state = AsconWriting;
|
||||
a->noResponse = 0;
|
||||
@@ -163,77 +166,106 @@ int RFAmpReading (Ascon *a)
|
||||
|
||||
switches=opstate=K3=K2=K1=outOn=CC=CV=heat=0;
|
||||
|
||||
// Start reading when byte = 2 and stop when 3
|
||||
while ( ( rdChRet = AsconReadChar(a->fd, &chr) ) > 0) {
|
||||
a->start = DoubleTime();
|
||||
if (a->readState) {
|
||||
if (a->readState >= LASTBYTENUM) {
|
||||
a->readState = 0;
|
||||
if (a->readState > LASTBYTENUM) {
|
||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Packet larger than expected, size exceeds %d", LASTBYTENUM);
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
if (chr != 3) {
|
||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Unexpected value %X for packet end signal", chr);
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
if (0 == DynStringConcatChar(a->rdBuffer, '\0')) {
|
||||
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
|
||||
errNum = ENOMEM;
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
address = GetCharArray(a->rdBuffer)[0];
|
||||
ctype = GetCharArray(a->rdBuffer)[1];
|
||||
strncpy(curr, &GetCharArray(a->rdBuffer)[2], 2);
|
||||
strncpy(freq, &GetCharArray(a->rdBuffer)[4], 3);
|
||||
strncpy(voltage, &GetCharArray(a->rdBuffer)[7], 2);
|
||||
switches = GetCharArray(a->rdBuffer)[9];
|
||||
opstate = GetCharArray(a->rdBuffer)[10];
|
||||
if (data->transactInProg == txPreCheck) {
|
||||
data->transactInProg = txNormalRead;
|
||||
if (abs(data->targetCurrent - atoi(curr)) <= 5) {
|
||||
DynStringReplaceWithLen(a->wrBuffer, data->rfCmd,0, SCMDLEN);
|
||||
a->state = AsconWriting;
|
||||
a->noResponse = 1;
|
||||
a->wrPos = 0;
|
||||
} else {
|
||||
strcpy(errMsg, "ANSRFAMP: Step size should be <= 5 for current");
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
} else if (data->transactInProg == txNormalRead) {
|
||||
K3 = (switches & 0x08) >> 3;
|
||||
K2 = (switches & 0x04) >> 2;
|
||||
K1 = (switches & 0x02) >> 1;
|
||||
outOn = switches & 0x01;
|
||||
CC = (opstate & 0x04) >> 2;
|
||||
CV = (opstate & 0x02) >> 1;
|
||||
heat = opstate & 0x01;
|
||||
snprintf(replyStr, 128, "address=%c|type=%c|curr=%s|freq=%s|voltage=%s|K3=%d|K2=%d|K1=%d|O=%d|CC=%d|CV=%d|H=%d", address, ctype, curr, freq, voltage, K3, K2, K1, outOn, CC, CV, heat);
|
||||
if (0 == DynStringReplaceWithLen(a->rdBuffer, replyStr, 0, 128)) {
|
||||
strcpy(errMsg, "ANSRFAMP: DynStringReplace failed:");
|
||||
errNum = ENOMEM;
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
a->state = AsconReadDone;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
if (0 == DynStringConcatChar(a->rdBuffer, chr)) {
|
||||
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
|
||||
errNum = ENOMEM;
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
a->readState++;
|
||||
} else if (chr == 2) {
|
||||
a->readState = 1;
|
||||
}
|
||||
}
|
||||
if(data->transactInProg == txPostSet){
|
||||
data->transactInProg = txCheckReply;
|
||||
|
||||
DynStringReplaceWithLen(a->wrBuffer, data->statusCmd, 0, LCMDLEN);
|
||||
a->state = AsconWriting;
|
||||
a->noResponse = 0;
|
||||
a->wrPos = 0;
|
||||
}else{
|
||||
// Start reading when byte = 2 and stop when 3
|
||||
while ( ( rdChRet = AsconReadChar(a->fd, &chr) ) > 0) {
|
||||
a->start = DoubleTime();
|
||||
if (a->readState) {
|
||||
if (a->readState >= LASTBYTENUM) {
|
||||
a->readState = 0;
|
||||
if (a->readState > LASTBYTENUM) {
|
||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Packet larger than expected, size exceeds %d", LASTBYTENUM);
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
if (chr != 3) {
|
||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Unexpected value %X for packet end signal", chr);
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
if (0 == DynStringConcatChar(a->rdBuffer, '\0')) {
|
||||
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
|
||||
errNum = ENOMEM;
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
address = GetCharArray(a->rdBuffer)[0];
|
||||
ctype = GetCharArray(a->rdBuffer)[1];
|
||||
strncpy(curr, &GetCharArray(a->rdBuffer)[2], 2);
|
||||
strncpy(freq, &GetCharArray(a->rdBuffer)[4], 3);
|
||||
strncpy(voltage, &GetCharArray(a->rdBuffer)[7], 2);
|
||||
switches = (unsigned char)GetCharArray(a->rdBuffer)[9];
|
||||
opstate = GetCharArray(a->rdBuffer)[10];
|
||||
|
||||
if (data->transactInProg == txPreSet) {
|
||||
data->transactInProg = txPostSet;
|
||||
if (abs(data->targetCurrent - atoi(curr)) <= 5) {
|
||||
DynStringReplaceWithLen(a->wrBuffer, data->rfCmd,0, SCMDLEN);
|
||||
a->state = AsconWriting;
|
||||
a->noResponse = 0;
|
||||
a->wrPos = 0;
|
||||
} else {
|
||||
strcpy(errMsg, "ANSRFAMP: Step size should be <= 5 for current");
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
} else if (data->transactInProg == txCheckReply) {
|
||||
// TODO Compare rdBuffer to rfCmd if they match then set replyStr="OK" else set error message
|
||||
char tmpCurr[3], tmpFreq[4];
|
||||
unsigned char tmpSwitchs;
|
||||
|
||||
strncpy(tmpCurr, &data->rfCmd[3], 2);
|
||||
strncpy(tmpFreq, &data->rfCmd[5], 3);
|
||||
tmpSwitchs = (unsigned char)data->rfCmd[8];
|
||||
|
||||
if((atoi(curr) != atoi(tmpCurr)) ||
|
||||
(atoi(freq) != atoi(tmpFreq)) ||
|
||||
((switches & 0x7F) != (tmpSwitchs & 0x7F))){
|
||||
DynStringReplace(a->rdBuffer, "Warning: Writting Device Error!", 0);
|
||||
}else
|
||||
DynStringReplace(a->rdBuffer, "OK", 0);
|
||||
|
||||
a->state = AsconReadDone;
|
||||
data->transactInProg = txNormalRead;
|
||||
} else if (data->transactInProg == txNormalRead) {
|
||||
K3 = (switches & 0x08) >> 3;
|
||||
K2 = (switches & 0x04) >> 2;
|
||||
K1 = (switches & 0x02) >> 1;
|
||||
outOn = switches & 0x01;
|
||||
CC = (opstate & 0x04) >> 2;
|
||||
CV = (opstate & 0x02) >> 1;
|
||||
heat = opstate & 0x01;
|
||||
snprintf(replyStr, 128, "address=%c|type=%c|curr=%s|freq=%s|voltage=%s|K3=%d|K2=%d|K1=%d|O=%d|CC=%d|CV=%d|H=%d", \
|
||||
address, ctype, curr, freq, voltage, K3, K2, K1, outOn, CC, CV, heat);
|
||||
if (0 == DynStringReplaceWithLen(a->rdBuffer, replyStr, 0, 128)) {
|
||||
strcpy(errMsg, "ANSRFAMP: DynStringReplace failed:");
|
||||
errNum = ENOMEM;
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
a->state = AsconReadDone;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
if (0 == DynStringConcatChar(a->rdBuffer, chr)) {
|
||||
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
|
||||
errNum = ENOMEM;
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
}
|
||||
a->readState++;
|
||||
} else if (chr == 2) {
|
||||
a->readState = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rdChRet < 0) {
|
||||
AsconError(a, "ANSRFAMP: AsconReadChar failed:", errno);
|
||||
return 1;
|
||||
@@ -280,6 +312,7 @@ int RFAmpInit(Ascon *a, SConnection *con, int argc, char *argv[])
|
||||
data->transactInProg = txNormalRead;
|
||||
data->targetCurrent = 0;
|
||||
data->rfCmd[0] = '\0';
|
||||
data->statusCmd[0] = '\0';
|
||||
a->killPrivate = RFAmpKill;
|
||||
return AsconStdInit(a, con, argc, argv);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user