/***************************************************************************** * File Name: tpqueue.c Test Port Queues * * Description: Thread safe Charcter, Byte, ULONG queues. * CAUTION: Thread Safety may be lost going from 68k to RISC processor, * because increment & test is not atomic? This is not observed. * Modification History: * NAME DATE DESCRIPTION * * *****************************************************************************/ #include /* GreenHills Integrity RTOS */ #include /* Artysen IBM 440 card */ #include /* for printf() ftn prototype */ #include /* for exit() ftn prototype */ #include /* for strcpy() ftn prototype */ #include #include #include #include #include "tpmacros.h" #include "tpsizes.h" #include "tptypes.h" Queue toTPQtab; /* Tx QTab */ Queue toITQtab; /* Tx QTab */ Queue frTPQtab; /* Rx QTab */ Queue toAPQtab; /* Tx QTab */ Queue frAPQtab; /* Rx QTab */ Queue toACQtab; /* Tx QTab */ Queue frACQtab; /* Rx QTab */ Queue toTCPQtab; /* Tx QTab */ Queue frTCPQtab; /* Rx QTab */ Queue jamtoACQtab; /* Tx QTab */ Queue txMCQtab; // Tx Msg OpCode QTab /*-------------------------------------------------------*/ char toTPQbuf [TPTXQSIZE]; /* Tx Bgnd Queue */ char toITQbuf [TPITQSIZE]; /* Tx Interrupt Queue */ char frTPQbuf [TPRXQSIZE]; /* Rx Bgnd Queue */ unsigned long toAPQbuf [APTXQSIZE]; /* Tx Queue Antenna Positioner Unit*/ unsigned long frAPQbuf [APRXQSIZE]; /* Rx Queue */ unsigned char toACQbuf [ACTXQSIZE]; /* Tx Queue Antenna Control Unit */ unsigned char frACQbuf [ACRXQSIZE]; /* Rx Queue */ unsigned char toTCPQbuf [IPTXQSIZE]; /* Tx Queue */ unsigned char frTCPQbuf [IPRXQSIZE]; /* Rx Queue */ unsigned char jamtoACQbuf [ACTXQSIZE]; /* Tx Queue */ unsigned char toMCQbuf [TXMCQSIZE]; /* Tx Event Code Queue */ /******************************************************* Initializes Queue Structure. *******************************************************/ void makebQ(ULONG items, Queue *Qtab) { Qtab->Qsize = items; Qtab->count = Qtab->maxcount = Qtab->trafficcount = Qtab->overflowflag = Qtab->overflowcount = Qtab->nextin = Qtab->nextout = 0; } /******************************************************* * Call to Initialize all Queues *******************************************************/ void init_Queues(void) { makebQ(TPTXQSIZE,&toTPQtab); /* make test port output Q */ makebQ(TPITQSIZE,&toITQtab); /* make test port output Q */ makebQ(TPRXQSIZE,&frTPQtab); /* make test port input Q */ makebQ(APTXQSIZE,&toAPQtab); /* make ACU output Q */ makebQ(APRXQSIZE,&frAPQtab); /* make ACR input Q */ makebQ(IPTXQSIZE,&toTCPQtab); /* make TCP output Q */ makebQ(IPRXQSIZE,&frTCPQtab); /* make TCP input Q */ makebQ(ACTXQSIZE,&toACQtab); /* make AC output Q */ makebQ(ACRXQSIZE,&frACQtab); /* make AC input Q */ makebQ(ACTXQSIZE,&jamtoACQtab); makebQ(TXMCQSIZE,&txMCQtab); /* Tx Event Code output Q */ } /******************************************************* * Put character at *charptr into byte Queue * Qptr is pointer to Qtab * Returns: * True if ok. * False if Q full. ********************************************************/ BOOL putQMsgCode(unsigned char *charptr) { Queue *Qptr; /* Tab */ unsigned long int in; /* index to next in storage */ Qptr = &txMCQtab; if (Qptr->count >= Qptr->Qsize) { Qptr->overflowcount++; /* count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ toMCQbuf[in] = *charptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; /* add.w #1,(4,a2) Interrupt okay */ (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /*******************************************************/ BOOL putQtoAP(unsigned long *ptr) { Queue *Qptr; /* Tab */ unsigned long in; /* index to next in storage */ Qptr = &toAPQtab; if (Qptr->count >= Qptr->Qsize) { Qptr->overflowcount++; /* count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ toAPQbuf[in] = *ptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; /* add.w #1,(4,a2) Interrupt okay */ (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /********************************************************/ BOOL putQfrAP(unsigned long *ptr) { Queue *Qptr; /* Tab */ unsigned long in; /* index to next in storage */ Qptr = &frAPQtab; if (Qptr->count >= Qptr->Qsize) { Qptr->overflowcount++; /* count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ frAPQbuf[in] = *ptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /********************************************************/ BOOL putQtoAC(unsigned char *charptr) { Queue *Qptr; /* Tab */ unsigned long in; /* index to next in storage */ Qptr = &toACQtab; if (Qptr->count >= Qptr->Qsize) { Qptr->overflowcount++; /* count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ toACQbuf[in] = *charptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; /* add.w #1,(4,a2) Interrupt okay */ (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /********************************************************/ BOOL putQfrAC(unsigned char *charptr) { Queue *Qptr; /* Tab */ unsigned long in; /* index to next in storage */ Qptr = &frACQtab; if (Qptr->count >= Qptr->Qsize) { Qptr->overflowcount++; /* count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ frACQbuf[in] = *charptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /********************************************************/ BOOL putQtoTCP(unsigned char *charptr) { Queue *Qptr; /* Tab */ unsigned long int in; /* index to next in storage */ Qptr = &toTCPQtab; if (Qptr->count == Qptr->Qsize) { Qptr->overflowcount++; /* count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ toTCPQbuf[in] = *charptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /********************************************************/ BOOL putQfrTCP(unsigned char *charptr) { Queue *Qptr; /* Tab */ unsigned long int in; /* index to next in storage */ Qptr = &frTCPQtab; if (Qptr->count >= Qptr->Qsize) { Qptr->overflowcount++; /* count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ frTCPQbuf[in] = *charptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /*------------------------------------------------------- ** Background Test Port Queue - tprintf() & xprintf() queue. **-------------------------------------------------------*/ BOOL putQtoTP(char *charptr) { Queue *Qptr; /* Tab */ unsigned long int in; /* index to next in storage */ Qptr = &toTPQtab; if (Qptr->count >= Qptr->Qsize) { /** Qptr->overflowcount++; * count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ toTPQbuf[in] = *charptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /*------------------------------------------------------- ** Interrupt Test Port Queue - iprintf() queue. **-------------------------------------------------------*/ BOOL putQtoIT(char *charptr) { Queue *Qptr; /* Tab */ unsigned long in; /* index to next in storage */ Qptr = &toITQtab; if (Qptr->count == Qptr->Qsize) { /** Qptr->overflowcount++; * count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ toITQbuf[in] = *charptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /********************************************************/ BOOL putQfrTP(char *charptr) { Queue *Qptr; /* Tab */ unsigned long in; /* index to next in storage */ Qptr = &frTPQtab; if (Qptr->count >= Qptr->Qsize) { Qptr->overflowcount++; /* count overflows */ Qptr->overflowflag++; /* flag recent overflow */ return (FALSE); /* Q is full */ } in = Qptr->nextin; if (++in >= Qptr->Qsize) in = 0; /* wrap around */ frTPQbuf[in] = *charptr; /* move char into Qbuf */ Qptr->nextin = in; /* updated pointer */ (Qptr->count)++; (Qptr->trafficcount)++; /* could watch in bgnd? */ if (Qptr->count > Qptr->maxcount) /* update max count */ Qptr->maxcount = Qptr->count; return(TRUE); /* Q is O.K., not full */ } /******************************************************* * Get character from byte Queue * by Qptr and return in *charptr. * Returns: * False if Queue empty. (pointer of zero) * True if Queue not empty. (pointer to char - non zero) *******************************************************/ BOOL getQMsgCode(unsigned char *charptr) { Queue *Qptr; unsigned long out; Qptr = &txMCQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *charptr = toMCQbuf[out]; /* return char to caller */ Qptr->count--; /* sub.w #1,(4,a2) Interrupt okay */ Qptr->nextout = out; return(TRUE); } /*******************************************************/ BOOL getQtoCP(unsigned long *ptr) { Queue *Qptr; unsigned long out; Qptr = &toAPQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *ptr = toAPQbuf[out]; /* return char to caller */ Qptr->count--; /* sub.w #1,(4,a2) Interrupt okay !!!DEBUG */ Qptr->nextout = out; return(TRUE); } /*******************************************************/ BOOL getQfrAP(unsigned long *ptr) { Queue *Qptr; unsigned long out; Qptr = &frAPQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *ptr = frAPQbuf[out]; /* return ULONG to caller */ Qptr->count--; Qptr->nextout = out; return(TRUE); } /*******************************************************/ BOOL getQtoAC(unsigned char *charptr) { Queue *Qptr; unsigned long out; Qptr = &toACQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *charptr = toACQbuf[out]; /* return char to caller */ Qptr->count--; /* sub.w #1,(4,a2) Interrupt okay */ Qptr->nextout = out; return(TRUE); } /*******************************************************/ BOOL getQfrAC(unsigned char *charptr) { Queue *Qptr; unsigned long out; Qptr = &frACQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *charptr = frACQbuf[out]; /* return char to caller */ Qptr->count--; Qptr->nextout = out; return(TRUE); } /*******************************************************/ BOOL getQtoTCP(unsigned char *charptr) { Queue *Qptr; unsigned long out; Qptr = &toTCPQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *charptr = toTCPQbuf[out]; /* return char to caller */ Qptr->count--; Qptr->nextout = out; return(TRUE); } /*******************************************************/ BOOL getQfrTCP(unsigned char *charptr) { Queue *Qptr; unsigned long out; Qptr = &frTCPQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *charptr = frTCPQbuf[out]; /* return char to caller */ Qptr->count--; Qptr->nextout = out; return(TRUE); } /*-----------------------------------------------------*/ BOOL getQtoTP(char *charptr) { Queue *Qptr; unsigned long out; Qptr = &toTPQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *charptr = toTPQbuf[out]; /* return char to caller */ Qptr->count--; Qptr->nextout = out; return(TRUE); } /*-----------------------------------------------------*/ BOOL getQtoIT(char *charptr) { Queue *Qptr; unsigned long out; Qptr = &toITQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *charptr = toITQbuf[out]; /* return char to caller */ Qptr->count--; Qptr->nextout = out; return(TRUE); } /*******************************************************/ BOOL getQfrTP(char *charptr) { Queue *Qptr; unsigned long out; Qptr = &frTPQtab; if (Qptr->count == 0) /* if Queue empty */ return(FALSE); out = Qptr->nextout; /* Get pointer for out char */ if (++out >= Qptr->Qsize) out = 0; /* wrap around */ *charptr = frTPQbuf[out]; /* return char to caller */ Qptr->count--; Qptr->nextout = out; return(TRUE); } /*******************************************************/