|
|
1.1 ! root 1: /*************************************************************************** ! 2: * CTM.C - CyberMAXX support routines * ! 3: * uses: SERIAL1.LIB functions * ! 4: * Written by: Les Bird * ! 5: ***************************************************************************/ ! 6: ! 7: #define DOS4G ! 8: ! 9: #include "icorp.h" ! 10: #include <time.h> ! 11: #include "3d.h" ! 12: #include "commlib.h" ! 13: ! 14: PORT *sd; ! 15: ! 16: int iglassenabled; ! 17: ! 18: void ! 19: ctm_deinit(void) ! 20: { ! 21: if (cyberenabled) { ! 22: PortClose(sd); ! 23: cyberenabled=0; ! 24: } ! 25: } ! 26: ! 27: int ! 28: ctm_init(int port) ! 29: { ! 30: long cybcode=0,delayclock; ! 31: ! 32: sd=PortOpenGreenleafFast(port,9600L,'N',8,1); ! 33: if (sd->status == ASSUCCESS) { ! 34: cyberenabled=1; ! 35: WriteChar(sd,'X'); ! 36: delayclock=totalclock+CLKIPS; ! 37: while (totalclock < delayclock && cybcode < 3) { ! 38: if (SpaceUsedInRXBuffer(sd) == 0) { ! 39: continue; ! 40: } ! 41: switch (cybcode) { ! 42: case 0: ! 43: if (ReadChar(sd) == 'C') { ! 44: cybcode++; ! 45: } ! 46: break; ! 47: case 1: ! 48: if (ReadChar(sd) == 'T') { ! 49: cybcode++; ! 50: } ! 51: break; ! 52: case 2: ! 53: if (ReadChar(sd) == 'M') { ! 54: cybcode++; ! 55: } ! 56: break; ! 57: } ! 58: } ! 59: if (cybcode != 3) { ! 60: ctm_deinit(); ! 61: return(0); ! 62: } ! 63: WriteChar(sd,'C'); // CyberMAXX absolute coordinate mode ! 64: WriteChar(sd,'F'); // CyberMAXX binary transfer mode ! 65: WriteChar(sd,'M'); // CyberMAXX checksum byte ! 66: WriteChar(sd,'G'); // CyberMAXX continuous sample mode ! 67: cyberenabled=port+1; ! 68: return(1); ! 69: } ! 70: return(0); ! 71: } ! 72: ! 73: #if 0 ! 74: short ! 75: getserch(PORT *s) ! 76: { ! 77: return((short)ReadChar(s)); ! 78: } ! 79: #endif ! 80: ! 81: void ! 82: vio_deinit(void) ! 83: { ! 84: if (iglassenabled) { ! 85: PortClose(sd); ! 86: iglassenabled=0; ! 87: } ! 88: } ! 89: ! 90: void ! 91: vio_reset(void) ! 92: { ! 93: WriteChar(sd,'!'); ! 94: WriteChar(sd,'R'); ! 95: WriteChar(sd,0x0D); ! 96: } ! 97: ! 98: void ! 99: vio_setup(void) ! 100: { ! 101: WriteChar(sd,'!'); ! 102: WriteChar(sd,'M'); ! 103: WriteChar(sd,'2'); // cooked data mode ! 104: WriteChar(sd,','); ! 105: WriteChar(sd,'P'); // polled ! 106: WriteChar(sd,','); ! 107: WriteChar(sd,'B'); // binary ! 108: WriteChar(sd,0x0D); ! 109: } ! 110: ! 111: int ! 112: vio_init(int port) ! 113: { ! 114: long delayclock,tries=0; ! 115: ! 116: sd=PortOpenGreenleafFast(port,9600L,'N',8,1); ! 117: if (sd->status == ASSUCCESS) { ! 118: iglassenabled=0; ! 119: vio_reset(); ! 120: delayclock=totalclock+(CLKIPS>>1); ! 121: while (totalclock < delayclock && iglassenabled == 0 && tries < 10) { ! 122: if (SpaceUsedInRXBuffer(sd) == 0) { ! 123: continue; ! 124: } ! 125: if (ReadChar(sd) == 'O') { ! 126: iglassenabled=port+1; ! 127: } ! 128: else { ! 129: vio_reset(); ! 130: delayclock=totalclock+(CLKIPS>>1); ! 131: tries++; ! 132: } ! 133: } ! 134: if (iglassenabled == 0) { ! 135: vio_deinit(); ! 136: return(0); ! 137: } ! 138: vio_setup(); ! 139: return(1); ! 140: } ! 141: return(0); ! 142: } ! 143: ! 144: void ! 145: vio_read(short *yaw,short *pitch,short *roll) ! 146: { ! 147: short c,chk,chk2,yaw2,pitch2,roll2; ! 148: long delayclock; ! 149: PORT *s; ! 150: ! 151: s=sd; ! 152: if (SpaceUsedInTXBuffer(s) == 0) { ! 153: WriteChar(s,'S'); ! 154: } ! 155: if (iglassenabled) { ! 156: if (SpaceUsedInRXBuffer(s) < 8) { ! 157: return; ! 158: } ! 159: } ! 160: else if (cyberenabled) { ! 161: if (SpaceUsedInRXBuffer(s) < 7) { ! 162: return; ! 163: } ! 164: } ! 165: chk=0; ! 166: pitch2=yaw2=roll2=0; ! 167: if ((c=ReadChar(s)) == 0xFF || cyberenabled) { ! 168: if (iglassenabled) { ! 169: chk+=c; ! 170: yaw2=((c=ReadChar(s))<<8); // yaw high byte ! 171: } ! 172: else { ! 173: yaw2=c<<8; ! 174: } ! 175: chk+=c; ! 176: yaw2+=(c=ReadChar(s)); // yaw low byte ! 177: chk+=c; ! 178: pitch2=((c=ReadChar(s))<<8); // pitch high byte ! 179: chk+=c; ! 180: pitch2+=(c=ReadChar(s)); // pitch low byte ! 181: chk+=c; ! 182: roll2=((c=ReadChar(s))<<8); // roll high byte ! 183: chk+=c; ! 184: roll2+=(c=ReadChar(s)); // roll low byte ! 185: chk+=c; ! 186: chk2=ReadChar(s); // checksum ! 187: if ((chk&0xFF) == chk2 || cyberenabled) { ! 188: *yaw=yaw2; ! 189: *pitch=pitch2; ! 190: *roll=roll2; ! 191: } ! 192: } ! 193: ClearTXBuffer(s); ! 194: ClearRXBuffer(s); ! 195: } ! 196: ! 197: extern ! 198: short pitch, ! 199: roll, ! 200: yaw; ! 201: ! 202: void ! 203: whvrmon(void) ! 204: { ! 205: #if 0 ! 206: char tmpbuf[80]; ! 207: ! 208: sprintf(tmpbuf,"Y: %05d P: %05d R: %05d C: %05d",yaw,pitch,roll, ! 209: sd.rx.q->count); ! 210: printext256(0L,8L,31,-1,tmpbuf,1); ! 211: #endif ! 212: } ! 213:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.