72 const double fullscale[6] = { -0.5, -0.5, -0.5,
81 if ( -3.0 < vert_acc )
84 for ( axis = 0; axis < 3; axis++ )
89 double lin_pos, lin_acc;
100 lin_acc = grav_acc - vert_acc;
111 while ( ang_pos < -SGD_2PI/3 ) {
114 while ( ang_pos > 2*SGD_2PI/3 ) {
120 fprintf ( chair_FILE,
"RAY %s, %8.3f rad %8.3f m/s/s =>",
121 ((axis==0)?
"Roll ":((axis==1)?
"Pitch":
"Yaw ")),
131 chair_rising += ( lin_acc - chair_rising ) * dt * 0.5;
133 chair_height += ( chair_rising - chair_height ) * dt * 0.5;
134 lin_pos = chair_height;
138 if ( fabs ( ang_pos - chair_heading ) > SGD_PI )
140 if ( ang_pos < chair_heading )
141 chair_heading -= SGD_2PI;
142 else chair_heading += SGD_2PI;
145 ang_pos -= chair_heading;
149 chair_heading += ang_pos * dt * 0.2;
151 if ( fabs(ang_pos) > SGD_PI_2 )
152 chair_heading += ang_pos / 3;
156 chair_vertical[axis] += ( dt / 3 ) *
157 ( lin_acc / vert_acc + ang_pos
158 - chair_vertical[axis] );
160 lin_acc -= chair_vertical[axis] * vert_acc;
162 ang_pos -= chair_vertical[axis];
169 fprintf ( chair_FILE,
" %8.3f deg %8.3f cm.\n",
170 ang_pos * 60.0, lin_pos * 100.0 );
175 for ( subaxis = axis; subaxis < 6; subaxis += 3 )
176 {
unsigned short *dac;
178 buf [ 3*subaxis ] = subaxis;
179 dac = (
unsigned short *) ( buf + 1 + 3*subaxis );
181 double propose = ( subaxis < 3 ) ? ang_pos : lin_pos;
183 propose /= fullscale [ subaxis ];
185 if ( propose < -SGD_PI_2 ) *dac = 0x0000;
else
186 if ( propose > SGD_PI_2 ) *dac = 0xFFFF;
else
187 *dac = (
unsigned short) ( 32767 *
188 ( 1.0 + sin ( propose ) ) );