From 3b8b81a19b4aa6437a3a1d41c45b44671d79717b Mon Sep 17 00:00:00 2001 From: Jing Chen Date: Wed, 12 May 2010 12:15:24 +1000 Subject: [PATCH] add response when sending a S command r2918 | jgn | 2010-05-12 12:15:24 +1000 (Wed, 12 May 2010) | 2 lines --- site_ansto/hardsup/sct_rfamp.c | 187 +++++++++++++++++++-------------- 1 file changed, 110 insertions(+), 77 deletions(-) diff --git a/site_ansto/hardsup/sct_rfamp.c b/site_ansto/hardsup/sct_rfamp.c index 5743e2e9..62a87048 100644 --- a/site_ansto/hardsup/sct_rfamp.c +++ b/site_ansto/hardsup/sct_rfamp.c @@ -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); }