From 0ce77331504bc1e59a86604b989935cf78583a28 Mon Sep 17 00:00:00 2001 From: John Winans Date: Fri, 10 Jan 1992 10:02:30 +0000 Subject: [PATCH] converted to operate w/new bitbus driver --- src/devOpt/devBBInteract.c | 273 ++++++++++++++++--------------------- 1 file changed, 117 insertions(+), 156 deletions(-) diff --git a/src/devOpt/devBBInteract.c b/src/devOpt/devBBInteract.c index 9007610e9..1c7e01edd 100644 --- a/src/devOpt/devBBInteract.c +++ b/src/devOpt/devBBInteract.c @@ -1,5 +1,5 @@ /* devBBInteract.c */ -/* share/src/devOpt $Id$ +/* share/src/devOpt $Id$ * * Author: Ned D. Arnold * Date: 06/19/91 @@ -45,7 +45,6 @@ #include #include #include -#include #include #include #include @@ -55,53 +54,34 @@ #include #include #include +#include #include #include #include +#include +#include -#define BBREAD 1 -#define BBWRITE 2 -#define BBCMD 3 - -#define MAX_MSG_LENGTH 80 - -int bbWork(); - -struct bbIntCmd { - caddr_t list1; - caddr_t list2; - int (*bbWork)(); /* pointer to work function */ - int prio; /* pri for the callback for work finish funct */ - int link; /* link ID number */ - - struct bitBusMsg *txMsg; - struct bitBusMsg *rxMsg; - int rxMaxLen; - int status; - unsigned char rxCmd; - int wdAge; - int ageLimit; +extern struct { + long number; + DRVSUPFUN report; + DRVSUPFUN init; + DRVSUPFUN qReq; +} drvBitBus; +struct cmdPvt { int busy; long int count; }; -static struct bbIntCmd bbIntCmds[] = -{ - {0, 0, bbWork, 0, 0, NULL, NULL, 0, 0, 0, 0, 2}, - {0, 0, bbWork, 0, 0, NULL, NULL, 0, 0, 0, 0, 2}, - {0, 0, bbWork, 0, 0, NULL, NULL, 0, 0, 0, 0, 2}, - {0, 0, bbWork, 0, 0, NULL, NULL, 0, 0, 0, 0, 2}, - {0, 0, bbWork, 0, 0, NULL, NULL, 0, 0, 0, 0, 2}, - {0, 0, bbWork, 0, 0, NULL, NULL, 0, 0, 0, 0, 2} -}; -#define LIST_SIZE sizeof(bbIntCmds)/sizeof(struct bbIntCmd) +#define LIST_SIZE 10 + +static struct dpvtBitBusHead adpvt[LIST_SIZE]; /* declare other required variables used by more than one routine */ -int biDebug = 0; -int replyIsBack; +extern int bbDebug; +static int replyIsBack; int sendMsg(); int bbWork(); @@ -113,7 +93,7 @@ int showBbMsg(); int timingStudy(); static int firstTime = 1; -static SEM_ID msgReply; +static FAST_LOCK msgReply; int BI() @@ -124,8 +104,25 @@ BI() if(firstTime) { firstTime = 0; - msgReply = semCreate(); -/* BUG -- malloc all the message buffers in here too! */ + FASTLOCKINIT(&msgReply); + FASTUNLOCK(&msgReply); + FASTLOCK(&msgReply); /* Make sure is locked at the begining */ + + for (cnt = 0; cnt < LIST_SIZE; cnt++) + { + adpvt[cnt].finishProc = bbWork; + adpvt[cnt].priority = 0; + + adpvt[cnt].next = NULL; + adpvt[cnt].prev = NULL; + adpvt[cnt].txMsg.data = (unsigned char *)malloc(BB_MAX_DAT_LEN); + adpvt[cnt].txMsg.length = 7; + adpvt[cnt].txMsg.route = 0x40; + adpvt[cnt].rxMsg.data = (unsigned char *)malloc(BB_MAX_DAT_LEN); + adpvt[cnt].rxMsg.length = 7; + adpvt[cnt].syncLock = NULL; + adpvt[cnt].rxMaxLen = BB_MAX_MSG_LENGTH; + } } ans = 0; /* set loop not to exit */ @@ -159,23 +156,28 @@ BI() case 't': case 'T': /* Timing analysis */ - timingStudy(); + /*timingStudy();*/ break; case 'd': case 'D': /* Display message contents */ for (cnt = 1; cnt < LIST_SIZE; cnt++) /* for each message */ - showBbMsg(cnt); - break; + { + printf("message %d Transmit buffer:\n", cnt); + showBbMsg(&(adpvt[cnt].txMsg)); + printf("message %d Receive buffer:\n", cnt); + showBbMsg(&(adpvt[cnt].rxMsg)); + } + break; case 'q': case 'Q': /* quit */ break; - case 'r': /* turn off ibDebug */ + case 'r': /* turn off bbDebug */ bbDebug = 0; break; - case 'R': /* turn on ibDebug */ + case 'R': /* turn on bbDebug */ bbDebug = 1; break; } /* end case */ @@ -183,6 +185,7 @@ BI() return(0); } /* end of main */ +#ifdef DONT_DO_THIS static int timingStudy() { @@ -240,7 +243,7 @@ timingStudy() { pCmd[i]->count++; pCmd[i]->busy = 1; /* mark the xact as busy */ - qBbReq(BB_IO, pCmd[i]->link, 0, pCmd[1]->device, pCmd[i], 2); + (*(drvBitBus.qReq))(pCmd[i]->link, &(pCmd[i]), BB_Q_HIGH); reps--; if (reps%10000 == 0) { @@ -261,7 +264,7 @@ timingStudy() else i = LIST_SIZE; /* force an exit from the loop */ } - semTake(msgReply); + FASTLOCK(&msgReply); } endTime = tickGet(); @@ -282,6 +285,7 @@ timingStudy() } return(OK); } +#endif /* sendMsg() *************************************************** */ @@ -289,91 +293,33 @@ timingStudy() static int sendMsg() { - struct bbIntCmd *pCmd; - int inInt; /* input integer from operator */ int msgNum; /* index to array of messages */ - int ticks; /* # of ticks since message was sent */ - int maxTicks = 480; /* # of ticks to wait for reply (8 seconds) */ + printf("\nEnter Message # to Send (1 thru 5) > "); - if (!getInt(&inInt)) + if (!getInt(&msgNum)) return; /* if no entry, return to main menu */ - if((inInt >= LIST_SIZE) || (inInt < 0)) + if((msgNum >= LIST_SIZE) || (msgNum < 0)) return; - msgNum = inInt; - pCmd = &bbIntCmds[msgNum]; /* assign pointer to desired entry */ + adpvt[msgNum].ageLimit = 10; /* need to reset each time */ + (*(drvBitBus.qReq))(&(adpvt[msgNum]), BB_Q_HIGH); /* queue the msg */ - replyIsBack = FALSE; - ticks = 0; - - qBBReq(BB_IO, pCmd->link, 0, pCmd->device, pCmd, 2); /* queue the msg */ - - while (!replyIsBack && (ticks < maxTicks)) /* wait for reply msg */ - { - taskDelay(1); - ticks++; - } - - if (replyIsBack) - { - showBbMsg(msgNum); - } - else - printf("No Reply Received ...\n"); + FASTLOCK(&msgReply); /* wait for response to return */ + printf("response message:\n"); + showBbMsg(&(adpvt[msgNum].rxMsg)); } static int -bbWork(pCmd) -struct bbIntCmd *pCmd; +bbWork(pdpvt) +struct dpvtBitBusHead *pdpvt; { -char msgBuf[MAX_MSG_LENGTH + 1]; -int status; + if (bbDebug) + printf("BI's bbWork():entered\n"); - if (BIDebug || ibDebug) - logMsg("BI's bbWork() was called for command >%s<\n", pCmd->cmd); - - switch (pCmd->type) { - case 'w': - case 'W': /* write the message */ - status = writeBb(BB_IO, pCmd->link, 0, pCmd->device, pCmd->cmd, strlen(pCmd->cmd)); - if (status == ERROR) - strcpy(pCmd->resp, "BB TIMEOUT (while talking)"); - else - pCmd->resp[0] = '\0'; - break; - case 'r': - case 'R': /* write the command string */ - status = writeBb(BB_IO, pCmd->link, 0, pCmd->device, pCmd->cmd, strlen(pCmd->cmd)); - if (status == ERROR) - { - strcpy(pCmd->resp, "BB TIMEOUT (while talking)"); - break; - } - /* read the instrument */ - pCmd->resp[0] = 0; /* clear response string */ - status = readBb(BB_IO, pCmd->link, 0, pCmd->device, pCmd->resp, MAX_MSG_LENGTH); - - if (status == ERROR) - { - strcat(pCmd->resp, "BB TIMEOUT (while listening)"); - break; - } - else if (status > (MAX_MSG_LENGTH - 1)) /* check length of resp */ - { - printf("BB Response length equaled allocated space !!!\n"); - pCmd->resp[(MAX_MSG_LENGTH)-1] = '\0'; /* place \0 at end */ - } - else - { - pCmd->resp[status] = '\0'; /* terminate response with \0 */ - } - break; - } - pCmd->busy = 0; replyIsBack = TRUE; - semGive(msgReply); + FASTUNLOCK(&msgReply); return(0); } @@ -389,11 +335,10 @@ int status; static int configMsg() { - struct bbIntCmd *pCmd; - int msgNum; /* index to array of messages */ - int inInt; /* input integer from operator */ - unsigned char inChar; /* input char from operator */ - char inString[MAX_MSG_LENGTH]; /* input string from operator */ + int msgNum; /* index to array of messages */ + int inInt; + int cnt; + char str[100]; printf("\nEnter Message # to Configure (1 thru 5) > "); if (!getInt(&inInt)) @@ -402,36 +347,55 @@ configMsg() return; msgNum = inInt; - pCmd = &bbIntCmds[msgNum]; /* assign pointer to desired entry */ - printf("\n\n Configuring Send Message # %1.1d .... \n", msgNum); + printf("\n\n Configuring Send Message # %d at 0x%08.8X \n", msgNum, &(adpvt[msgNum].txMsg)); /* Prompt the Operator with the current value of each parameter If * only a is typed, keep current value, else replace value with * entered value */ - printf("\nenter Enter BB Link # [%2.2d] > ", (int) pCmd->link); - if (getInt(&inInt) == 1) - pCmd->link = inInt; + adpvt[msgNum].txMsg.link = 0; - printf("\nenter BB Node # [%2.2d] > ", pCmd->device); - if (getInt(&inInt) == 1) + printf("Enter BB Link (hex) [%02.2X]: ", (int) adpvt[msgNum].link); + gets(str); + if (sscanf(str, "%x", &inInt) == 1) + adpvt[msgNum].link = inInt; + + printf("Enter route (hex) [%02.2X]: ", adpvt[msgNum].txMsg.route); + gets(str); + if (sscanf(str, "%x", &inInt) == 1) + adpvt[msgNum].txMsg.route = inInt; + + printf("Enter Node (hex) [%02.2X]: ", adpvt[msgNum].txMsg.node); + gets(str); + if (sscanf(str, "%x", &inInt) == 1) + adpvt[msgNum].txMsg.node = inInt; + + printf("Enter tasks (hex) [%02.2X]: ", adpvt[msgNum].txMsg.tasks); + gets(str); + if (sscanf(str, "%x", &inInt) == 1) + adpvt[msgNum].txMsg.tasks = inInt; + + printf("Enter command (hex) [%02.2X]: ", adpvt[msgNum].txMsg.cmd); + gets(str); + if (sscanf(str, "%x", &inInt) == 1) + adpvt[msgNum].txMsg.cmd = inInt; + + adpvt[msgNum].txMsg.length = 7; + printf("Enter data 1 byte per line. Enter a dot to terminate list (hex)\n"); + for (cnt=0; cntdevice = inInt; + printf("[%02.2X]: ", adpvt[msgNum].txMsg.data[cnt]); + gets(str); + if (str[0] == '.') + break; + if (sscanf(str, "%x", &inInt) == 1) + adpvt[msgNum].txMsg.data[cnt] = inInt; + adpvt[msgNum].txMsg.length++; } - - printf("\nenter command type R, W, C [%c] > ", pCmd->type); - if (getChar(&inChar) == 1) - pCmd->type = inChar; - - printf("\nenter string to send (no quotes) [%.80s] > ", pCmd->cmd); - if (getString(inString) == 1) - strcpy(pCmd->cmd, inString); - - pCmd->resp[0]= 0; /* clear response string */ - - showBbMsg(msgNum); + printf("Transmit message #%d for BitBus link %d:\n", msgNum, adpvt[msgNum].link); + showBbMsg(&(adpvt[msgNum].txMsg)); } /* @@ -534,25 +498,22 @@ char *pString; } /* - * showBbMsg(msgNum) *********************************************** - * - * * Print the bb message contents onto the screen. * msgNum selects the message to be displayed - * */ static int -showBbMsg(msgNum) -int msgNum; - +showBbMsg(msg) +struct bitBusMsg *msg; { - struct bbIntCmd *pCmd = &bbIntCmds[msgNum]; + int i; - printf("\nMessage #%1.1d : ", msgNum); - printf("Link=%2.2d Adrs=%2.2d Type=%c\n", - (int)pCmd->link, pCmd->device, pCmd->type); - printf(" Command String : %.40s\n", pCmd->cmd); - printf(" Response String : %.40s\n", pCmd->resp); + printf(" link=%04.4X length=%02.2X route=%02.2X node=%02.2X tasks=%02.2X cmd=%02.2X\n", + msg->link, msg->length, msg->route, msg->node, msg->tasks, msg->cmd); + printf(" data :"); + for (i = 0; i < msg->length - 7; i++) + { + printf(" %02.2X", msg->data[i]); + } + putchar('\n'); } -