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