Library to handle SpaceBall, SpaceMouse and SpaceOrb on serial port. Gets access to 3D rotation and translation vector as well as button status. (USB is not supported)

Dependents:   SpaceBall_Example

Library to handle SpaceBall, SpaceMouse and SpaceOrb on serial port. Gets access to 3D rotation and translation vector as well as button status. (USB is not supported)

All handling and decoding is done in the RX interrupt and the vector values can be read out asynchronously with different coordinate mappings.

Example:

#include "mbed.h"
#include "SpaceBall.h"
 
PwmOut led[] = {(LED1), (LED2), (LED3), (LED4) };
SpaceBall SBall(p9, p10);   // tx, rx, bSOrb
 
int main() {
    SBall.Init();
    
    while(1) {
 
        led[0] = abs( SBall[TX] ) + abs( SBall[TY] ) + abs( SBall[TZ] );
        led[1] = abs( SBall[RX] );
        led[2] = abs( SBall[RY] );
        led[3] = abs( SBall[RZ] );
        
        wait_us(500);
    }
}

In this exaple the 4 LEDs are powered dependent on force at the Spaceball. LED1 shows the sum of all translation forces. LED2 to LED4 shows the rotation forces.

For more information about SpaceBall devices see manufactorers page http://www.3dconnexion.com

For connecting a SpaceBall (or SpaceMouse or SpaceOrb) to mbed see page wiki/Serial-Connection

Example: SpaceBall 4000

/media/uploads/jocis/spaceball1.jpg

Committer:
jocis
Date:
Sat Dec 01 05:30:34 2012 +0000
Revision:
0:f67a8fffd94a
Child:
1:e6282b645d9b
.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jocis 0:f67a8fffd94a 1 #include "SpaceBall.h"
jocis 0:f67a8fffd94a 2
jocis 0:f67a8fffd94a 3 #define Sleep(x) wait_ms(x*10)
jocis 0:f67a8fffd94a 4
jocis 0:f67a8fffd94a 5 ///////////////////////////////////////////////////////////////////////////////
jocis 0:f67a8fffd94a 6
jocis 0:f67a8fffd94a 7 SpaceBall::SpaceBall ( PinName tx, PinName rx, bool bSpaceOrb ) : _serial ( tx, rx )
jocis 0:f67a8fffd94a 8 {
jocis 0:f67a8fffd94a 9 _bSpaceOrb = bSpaceOrb;
jocis 0:f67a8fffd94a 10 _serial.baud ( 9600 );
jocis 0:f67a8fffd94a 11
jocis 0:f67a8fffd94a 12 _fScale = 1.0f;
jocis 0:f67a8fffd94a 13
jocis 0:f67a8fffd94a 14 m_axis[0] = 0; /* last translational data received */
jocis 0:f67a8fffd94a 15 m_axis[1] = 0;
jocis 0:f67a8fffd94a 16 m_axis[2] = 0;
jocis 0:f67a8fffd94a 17 m_axis[3] = 0; /* last rotational data received */
jocis 0:f67a8fffd94a 18 m_axis[4] = 0;
jocis 0:f67a8fffd94a 19 m_axis[5] = 0;
jocis 0:f67a8fffd94a 20 m_buttons = 0; /* current button status */
jocis 0:f67a8fffd94a 21
jocis 0:f67a8fffd94a 22 m_buf[0] = 0;
jocis 0:f67a8fffd94a 23 m_resetstring[0]= 0;
jocis 0:f67a8fffd94a 24 m_bufpos = 0; /* current char position in packet buffer */
jocis 0:f67a8fffd94a 25 m_packtype = 0; /* what kind of packet is it */
jocis 0:f67a8fffd94a 26 m_packlen = 0; /* how many bytes do we ultimately expect? */
jocis 0:f67a8fffd94a 27 m_escapedchar = 0; /* if set, we're processing an escape sequence */
jocis 0:f67a8fffd94a 28 m_erroroccured = 0; /* if set, we've received an error packet or packets */
jocis 0:f67a8fffd94a 29 m_resetoccured = 0; /* if set, ball was reset, so have to reinitialize it */
jocis 0:f67a8fffd94a 30 m_spaceball4000 = 0; /* if set, its a Spaceball 4000 */
jocis 0:f67a8fffd94a 31 m_leftymode4000 = 0; /* if set, Spaceball 4000 in "lefty" orientation */
jocis 0:f67a8fffd94a 32 m_timer = 0; /* time since last packet was received */
jocis 0:f67a8fffd94a 33
jocis 0:f67a8fffd94a 34 _serial.attach ( this, &SpaceBall::SerialISR );
jocis 0:f67a8fffd94a 35
jocis 0:f67a8fffd94a 36 Init();
jocis 0:f67a8fffd94a 37
jocis 0:f67a8fffd94a 38 };
jocis 0:f67a8fffd94a 39
jocis 0:f67a8fffd94a 40 ///////////////////////////////////////////////////////////////////////////////
jocis 0:f67a8fffd94a 41
jocis 0:f67a8fffd94a 42 void SpaceBall::Init()
jocis 0:f67a8fffd94a 43 {
jocis 0:f67a8fffd94a 44 m_packlen=1;
jocis 0:f67a8fffd94a 45 m_resetoccured=0;
jocis 0:f67a8fffd94a 46
jocis 0:f67a8fffd94a 47 m_spaceball4000 = 0; /* re-determine which type it is */
jocis 0:f67a8fffd94a 48 m_leftymode4000 = 0; /* re-determine if its in lefty mode */
jocis 0:f67a8fffd94a 49
jocis 0:f67a8fffd94a 50 if (!m_resetoccured) {
jocis 0:f67a8fffd94a 51 #if defined(DEBUG)
jocis 0:f67a8fffd94a 52 printf("Sending reset command to spaceball...\n");
jocis 0:f67a8fffd94a 53 #endif
jocis 0:f67a8fffd94a 54 m_resetoccured=1;
jocis 0:f67a8fffd94a 55 _serial.printf ( "@\r" ); /* force reset */
jocis 0:f67a8fffd94a 56 }
jocis 0:f67a8fffd94a 57
jocis 0:f67a8fffd94a 58 Sleep(10);
jocis 0:f67a8fffd94a 59
jocis 0:f67a8fffd94a 60 #if defined(DEBUG)
jocis 0:f67a8fffd94a 61 printf("Sending initialization sequence to spaceball...\n");
jocis 0:f67a8fffd94a 62 #endif
jocis 0:f67a8fffd94a 63
jocis 0:f67a8fffd94a 64 _serial.printf ( "CB\r" );
jocis 0:f67a8fffd94a 65 Sleep(10);
jocis 0:f67a8fffd94a 66 _serial.printf ( "NT\r" );
jocis 0:f67a8fffd94a 67 Sleep(10);
jocis 0:f67a8fffd94a 68 _serial.printf ( "FTp\r" );
jocis 0:f67a8fffd94a 69 Sleep(10);
jocis 0:f67a8fffd94a 70 _serial.printf ( "FRp\r" );
jocis 0:f67a8fffd94a 71 Sleep(10);
jocis 0:f67a8fffd94a 72 _serial.printf ( "P@r@r\r" );
jocis 0:f67a8fffd94a 73 Sleep(10);
jocis 0:f67a8fffd94a 74 _serial.printf ( "MSSV\r" );
jocis 0:f67a8fffd94a 75 Sleep(10);
jocis 0:f67a8fffd94a 76 _serial.printf ( "Z\r" );
jocis 0:f67a8fffd94a 77 Sleep(10);
jocis 0:f67a8fffd94a 78 _serial.printf ( "BcCcC\r" );
jocis 0:f67a8fffd94a 79 }
jocis 0:f67a8fffd94a 80
jocis 0:f67a8fffd94a 81 ///////////////////////////////////////////////////////////////////////////////
jocis 0:f67a8fffd94a 82
jocis 0:f67a8fffd94a 83 void SpaceBall::SerialISR(void)
jocis 0:f67a8fffd94a 84 {
jocis 0:f67a8fffd94a 85 char c;
jocis 0:f67a8fffd94a 86
jocis 0:f67a8fffd94a 87 while ( _serial.readable() )
jocis 0:f67a8fffd94a 88 {
jocis 0:f67a8fffd94a 89 c = _serial.getc();
jocis 0:f67a8fffd94a 90
jocis 0:f67a8fffd94a 91 //printf("%c", c);
jocis 0:f67a8fffd94a 92
jocis 0:f67a8fffd94a 93 Process ( c );
jocis 0:f67a8fffd94a 94 }
jocis 0:f67a8fffd94a 95 }
jocis 0:f67a8fffd94a 96
jocis 0:f67a8fffd94a 97 ///////////////////////////////////////////////////////////////////////////////
jocis 0:f67a8fffd94a 98
jocis 0:f67a8fffd94a 99 void SpaceBall::Process ( char c )
jocis 0:f67a8fffd94a 100 {
jocis 0:f67a8fffd94a 101 if ( _bSpaceOrb )
jocis 0:f67a8fffd94a 102 ProcessSO ( c );
jocis 0:f67a8fffd94a 103 else
jocis 0:f67a8fffd94a 104 ProcessSB ( c );
jocis 0:f67a8fffd94a 105 }
jocis 0:f67a8fffd94a 106
jocis 0:f67a8fffd94a 107 ///////////////////////////////////////////////////////////////////////////////
jocis 0:f67a8fffd94a 108
jocis 0:f67a8fffd94a 109 void SpaceBall::ProcessSB ( char c )
jocis 0:f67a8fffd94a 110 {
jocis 0:f67a8fffd94a 111 int i, num, packs;
jocis 0:f67a8fffd94a 112 bool bChanged = false;
jocis 0:f67a8fffd94a 113
jocis 0:f67a8fffd94a 114 packs = 0; /* no packs received yet */
jocis 0:f67a8fffd94a 115
jocis 0:f67a8fffd94a 116 /* process potentially occuring escaped character sequences */
jocis 0:f67a8fffd94a 117 if (c == '^')
jocis 0:f67a8fffd94a 118 {
jocis 0:f67a8fffd94a 119 if (!m_escapedchar)
jocis 0:f67a8fffd94a 120 {
jocis 0:f67a8fffd94a 121 m_escapedchar = 1;
jocis 0:f67a8fffd94a 122 return; /* eat the escape character from buffer */
jocis 0:f67a8fffd94a 123 }
jocis 0:f67a8fffd94a 124 }
jocis 0:f67a8fffd94a 125
jocis 0:f67a8fffd94a 126 if (m_escapedchar)
jocis 0:f67a8fffd94a 127 {
jocis 0:f67a8fffd94a 128 m_escapedchar = 0;
jocis 0:f67a8fffd94a 129
jocis 0:f67a8fffd94a 130 switch (c)
jocis 0:f67a8fffd94a 131 {
jocis 0:f67a8fffd94a 132 case '^': /* leave char in buffer unchanged */
jocis 0:f67a8fffd94a 133 break;
jocis 0:f67a8fffd94a 134
jocis 0:f67a8fffd94a 135 case 'Q':
jocis 0:f67a8fffd94a 136 case 'S':
jocis 0:f67a8fffd94a 137 case 'M':
jocis 0:f67a8fffd94a 138 c &= 0x1F; /* convert character to unescaped form */
jocis 0:f67a8fffd94a 139 break;
jocis 0:f67a8fffd94a 140
jocis 0:f67a8fffd94a 141 default:
jocis 0:f67a8fffd94a 142 break;
jocis 0:f67a8fffd94a 143 }
jocis 0:f67a8fffd94a 144 }
jocis 0:f67a8fffd94a 145
jocis 0:f67a8fffd94a 146
jocis 0:f67a8fffd94a 147 /* figure out what kind of packet we received */
jocis 0:f67a8fffd94a 148 if (m_bufpos == 0)
jocis 0:f67a8fffd94a 149 {
jocis 0:f67a8fffd94a 150 switch(c)
jocis 0:f67a8fffd94a 151 {
jocis 0:f67a8fffd94a 152 case 'D': /* Displacement packet */
jocis 0:f67a8fffd94a 153 m_packtype = 'D';
jocis 0:f67a8fffd94a 154 m_packlen = 16; /* D packets are 15 bytes long */
jocis 0:f67a8fffd94a 155 break;
jocis 0:f67a8fffd94a 156
jocis 0:f67a8fffd94a 157 case 'K': /* Button/Key packet */
jocis 0:f67a8fffd94a 158 m_packtype = 'K';
jocis 0:f67a8fffd94a 159 m_packlen = 4; /* K packets are 3 bytes long */
jocis 0:f67a8fffd94a 160 break;
jocis 0:f67a8fffd94a 161
jocis 0:f67a8fffd94a 162 case '.': /* Spaceball 4000 FLX "advanced" button press event */
jocis 0:f67a8fffd94a 163 m_packtype = '.';
jocis 0:f67a8fffd94a 164 m_packlen = 4; /* . packets are 3 bytes long */
jocis 0:f67a8fffd94a 165 break;
jocis 0:f67a8fffd94a 166
jocis 0:f67a8fffd94a 167 case 'C': /* Communications mode packet */
jocis 0:f67a8fffd94a 168 m_packtype = 'C';
jocis 0:f67a8fffd94a 169 m_packlen = 4;
jocis 0:f67a8fffd94a 170 break;
jocis 0:f67a8fffd94a 171
jocis 0:f67a8fffd94a 172 case 'F': /* Spaceball sensitization mode packet */
jocis 0:f67a8fffd94a 173 m_packtype = 'F';
jocis 0:f67a8fffd94a 174 m_packlen = 4;
jocis 0:f67a8fffd94a 175 break;
jocis 0:f67a8fffd94a 176
jocis 0:f67a8fffd94a 177 case 'M': /* Movement mode packet */
jocis 0:f67a8fffd94a 178 m_packtype = 'M';
jocis 0:f67a8fffd94a 179 m_packlen = 5;
jocis 0:f67a8fffd94a 180 break;
jocis 0:f67a8fffd94a 181
jocis 0:f67a8fffd94a 182 case 'N': /* Null region packet */
jocis 0:f67a8fffd94a 183 m_packtype = 'N';
jocis 0:f67a8fffd94a 184 m_packlen = 3;
jocis 0:f67a8fffd94a 185 break;
jocis 0:f67a8fffd94a 186
jocis 0:f67a8fffd94a 187 case 'P': /* Update rate packet */
jocis 0:f67a8fffd94a 188 m_packtype = 'P';
jocis 0:f67a8fffd94a 189 m_packlen = 6;
jocis 0:f67a8fffd94a 190 break;
jocis 0:f67a8fffd94a 191
jocis 0:f67a8fffd94a 192 case '\v': /* XON at poweron */
jocis 0:f67a8fffd94a 193 m_packtype = '\v';
jocis 0:f67a8fffd94a 194 m_packlen = 1;
jocis 0:f67a8fffd94a 195 break;
jocis 0:f67a8fffd94a 196
jocis 0:f67a8fffd94a 197 case '\n': /* carriage return at poweron */
jocis 0:f67a8fffd94a 198 case '\r': /* carriage return at poweron */
jocis 0:f67a8fffd94a 199 m_packtype = '\r';
jocis 0:f67a8fffd94a 200 m_packlen = 1;
jocis 0:f67a8fffd94a 201 break;
jocis 0:f67a8fffd94a 202
jocis 0:f67a8fffd94a 203 case '@': /* Spaceball Hard/Soft Reset packet */
jocis 0:f67a8fffd94a 204 m_resetoccured=1;
jocis 0:f67a8fffd94a 205 m_packtype = '@';
jocis 0:f67a8fffd94a 206 m_packlen = 62; /* Resets aren't longer than 62 chars */
jocis 0:f67a8fffd94a 207 break;
jocis 0:f67a8fffd94a 208
jocis 0:f67a8fffd94a 209 case 'E': /* Error packet */
jocis 0:f67a8fffd94a 210 m_packtype = 'E';
jocis 0:f67a8fffd94a 211 m_packlen = 8; /* E packets are up to 7 bytes long */
jocis 0:f67a8fffd94a 212 break;
jocis 0:f67a8fffd94a 213
jocis 0:f67a8fffd94a 214 case 'Z': /* Zero packet (Spaceball 2003/3003/4000 FLX) */
jocis 0:f67a8fffd94a 215 m_packtype = 'Z';
jocis 0:f67a8fffd94a 216 m_packlen = 14; /* Z packets are hardware dependent */
jocis 0:f67a8fffd94a 217 break;
jocis 0:f67a8fffd94a 218
jocis 0:f67a8fffd94a 219 default: /* Unknown packet! */
jocis 0:f67a8fffd94a 220 return;
jocis 0:f67a8fffd94a 221 }
jocis 0:f67a8fffd94a 222 }
jocis 0:f67a8fffd94a 223
jocis 0:f67a8fffd94a 224
jocis 0:f67a8fffd94a 225 m_buf[m_bufpos] = c;
jocis 0:f67a8fffd94a 226 m_bufpos++;
jocis 0:f67a8fffd94a 227
jocis 0:f67a8fffd94a 228 /* Reset packet processing */
jocis 0:f67a8fffd94a 229 if (m_packtype == '@')
jocis 0:f67a8fffd94a 230 {
jocis 0:f67a8fffd94a 231 if (c != '\r')
jocis 0:f67a8fffd94a 232 return;
jocis 0:f67a8fffd94a 233 else
jocis 0:f67a8fffd94a 234 m_packlen = m_bufpos;
jocis 0:f67a8fffd94a 235 }
jocis 0:f67a8fffd94a 236
jocis 0:f67a8fffd94a 237 /* Error packet processing */
jocis 0:f67a8fffd94a 238 if (m_packtype == 'E')
jocis 0:f67a8fffd94a 239 {
jocis 0:f67a8fffd94a 240 if (c != '\r')
jocis 0:f67a8fffd94a 241 return;
jocis 0:f67a8fffd94a 242 else
jocis 0:f67a8fffd94a 243 m_packlen = m_bufpos;
jocis 0:f67a8fffd94a 244 }
jocis 0:f67a8fffd94a 245 else if (m_bufpos != m_packlen)
jocis 0:f67a8fffd94a 246 return;
jocis 0:f67a8fffd94a 247
jocis 0:f67a8fffd94a 248 switch (m_packtype)
jocis 0:f67a8fffd94a 249 {
jocis 0:f67a8fffd94a 250 case 'D': /* ball displacement event */
jocis 0:f67a8fffd94a 251 {
jocis 0:f67a8fffd94a 252 unsigned int tx, ty, tz, rx, ry, rz;
jocis 0:f67a8fffd94a 253
jocis 0:f67a8fffd94a 254 /* number of 1/16ths of milliseconds since last */
jocis 0:f67a8fffd94a 255 /* ball displacement packet */
jocis 0:f67a8fffd94a 256 m_timer = ((m_buf[1]) << 8) | (m_buf[2]);
jocis 0:f67a8fffd94a 257
jocis 0:f67a8fffd94a 258 tx = ((m_buf[ 3]) << 8) | ((m_buf[ 4]));
jocis 0:f67a8fffd94a 259 tz = ((m_buf[ 5]) << 8) | ((m_buf[ 6]));
jocis 0:f67a8fffd94a 260 ty = ((m_buf[ 7]) << 8) | ((m_buf[ 8]));
jocis 0:f67a8fffd94a 261 rx = ((m_buf[ 9]) << 8) | ((m_buf[10]));
jocis 0:f67a8fffd94a 262 rz = ((m_buf[11]) << 8) | ((m_buf[12]));
jocis 0:f67a8fffd94a 263 ry = ((m_buf[13]) << 8) | ((m_buf[14]));
jocis 0:f67a8fffd94a 264
jocis 0:f67a8fffd94a 265 m_axis[0] = (((int) tx) << 16) >> 16;
jocis 0:f67a8fffd94a 266 m_axis[1] = (((int) ty) << 16) >> 16;
jocis 0:f67a8fffd94a 267 m_axis[2] = (((int) tz) << 16) >> 16;
jocis 0:f67a8fffd94a 268 m_axis[3] = -(((int) rx) << 16) >> 16;
jocis 0:f67a8fffd94a 269 m_axis[4] = -(((int) ry) << 16) >> 16;
jocis 0:f67a8fffd94a 270 m_axis[5] = -(((int) rz) << 16) >> 16;
jocis 0:f67a8fffd94a 271
jocis 0:f67a8fffd94a 272 bChanged = true;
jocis 0:f67a8fffd94a 273 DoChangedAxis();
jocis 0:f67a8fffd94a 274 }
jocis 0:f67a8fffd94a 275 break;
jocis 0:f67a8fffd94a 276
jocis 0:f67a8fffd94a 277 case 'K': /* button press event */
jocis 0:f67a8fffd94a 278 /* Spaceball 2003A, 2003B, 2003 FLX, 3003 FLX, 4000 FLX */
jocis 0:f67a8fffd94a 279 /* button packet. (4000 only for backwards compatibility) */
jocis 0:f67a8fffd94a 280 /* The lowest 5 bits of the first byte are buttons 5-9 */
jocis 0:f67a8fffd94a 281 /* Button '8' on a Spaceball 2003 is the rezero button */
jocis 0:f67a8fffd94a 282 /* The lowest 4 bits of the second byte are buttons 1-4 */
jocis 0:f67a8fffd94a 283 /* For Spaceball 2003, we'll map the buttons 1-7 normally */
jocis 0:f67a8fffd94a 284 /* skip 8, as its a hardware "rezero button" on that device */
jocis 0:f67a8fffd94a 285 /* and call the "pick" button "8". */
jocis 0:f67a8fffd94a 286 /* On the Spaceball 3003, the "right" button also triggers */
jocis 0:f67a8fffd94a 287 /* the "pick" bit. We OR the 2003/3003 rezero bits together */
jocis 0:f67a8fffd94a 288
jocis 0:f67a8fffd94a 289 /* if we have found a Spaceball 4000, then we ignore the 'K' */
jocis 0:f67a8fffd94a 290 /* packets entirely, and only use the '.' packets. */
jocis 0:f67a8fffd94a 291 if (m_spaceball4000)
jocis 0:f67a8fffd94a 292 break;
jocis 0:f67a8fffd94a 293
jocis 0:f67a8fffd94a 294 m_buttons =
jocis 0:f67a8fffd94a 295 ((m_buf[1] & 0x10) << 8) | /* 2003 pick button is ??? */
jocis 0:f67a8fffd94a 296 ((m_buf[1] & 0x20) << 9) | /* 3003 rezero button */
jocis 0:f67a8fffd94a 297 ((m_buf[1] & 0x08) << 11) | /* 2003 rezero button */
jocis 0:f67a8fffd94a 298 ((m_buf[1] & 0x07) << 4) | /* 5,6,7 (2003/4000) */
jocis 0:f67a8fffd94a 299 ((m_buf[2] & 0x30) << 8) | /* 3003 Left/Right buttons */
jocis 0:f67a8fffd94a 300 ((m_buf[2] & 0x0F)); /* 1,2,3,4 (2003/4000) */
jocis 0:f67a8fffd94a 301
jocis 0:f67a8fffd94a 302 bChanged = true;
jocis 0:f67a8fffd94a 303 DoChangedButtons();
jocis 0:f67a8fffd94a 304 break;
jocis 0:f67a8fffd94a 305
jocis 0:f67a8fffd94a 306 case '.': /* button press event (4000) */
jocis 0:f67a8fffd94a 307 /* Spaceball 4000 FLX "expanded" button packet, with 12 buttons */
jocis 0:f67a8fffd94a 308
jocis 0:f67a8fffd94a 309 /* extra packet validity check, since we use this packet type */
jocis 0:f67a8fffd94a 310 /* to override the 'K' button packets, and determine if its a */
jocis 0:f67a8fffd94a 311 /* Spaceball 4000 or not... */
jocis 0:f67a8fffd94a 312 if (m_buf[3] != '\r') {
jocis 0:f67a8fffd94a 313 break; /* if not terminated with a '\r', probably garbage */
jocis 0:f67a8fffd94a 314 }
jocis 0:f67a8fffd94a 315
jocis 0:f67a8fffd94a 316 /* if we got a valid '.' packet, this must be a Spaceball 4000 */
jocis 0:f67a8fffd94a 317 m_spaceball4000 = 1; /* Must be talking to a Spaceball 4000 */
jocis 0:f67a8fffd94a 318
jocis 0:f67a8fffd94a 319 /* Spaceball 4000 series "expanded" button press event */
jocis 0:f67a8fffd94a 320 /* includes data for 12 buttons, and left/right orientation */
jocis 0:f67a8fffd94a 321 m_buttons =
jocis 0:f67a8fffd94a 322 (((~m_buf[1]) & 0x20) << 10) | /* "left handed" mode */
jocis 0:f67a8fffd94a 323 ((m_buf[1] & 0x1F) << 7) | /* 8,9,10,11,12 */
jocis 0:f67a8fffd94a 324 ((m_buf[2] & 0x3F) ) | /* 1,2,3,4,5,6 (4000) */
jocis 0:f67a8fffd94a 325 ((m_buf[2] & 0x80) >> 1); /* 7 (4000) */
jocis 0:f67a8fffd94a 326
jocis 0:f67a8fffd94a 327 /* set "lefty" orientation mode if "lefty bit" is _clear_ */
jocis 0:f67a8fffd94a 328 if ((m_buf[1] & 0x20) == 0)
jocis 0:f67a8fffd94a 329 m_leftymode4000 = 1; /* left handed mode */
jocis 0:f67a8fffd94a 330 else
jocis 0:f67a8fffd94a 331 m_leftymode4000 = 0; /* right handed mode */
jocis 0:f67a8fffd94a 332
jocis 0:f67a8fffd94a 333 bChanged = true;
jocis 0:f67a8fffd94a 334 DoChangedButtons();
jocis 0:f67a8fffd94a 335 break;
jocis 0:f67a8fffd94a 336
jocis 0:f67a8fffd94a 337 case 'C': /* Communications mode packet */
jocis 0:f67a8fffd94a 338 case 'F': /* Spaceball sensitization packet */
jocis 0:f67a8fffd94a 339 case 'P': /* Spaceball update rate packet */
jocis 0:f67a8fffd94a 340 case 'M': /* Spaceball movement mode packet */
jocis 0:f67a8fffd94a 341 case 'N': /* Null region packet */
jocis 0:f67a8fffd94a 342 case '\r': /* carriage return at poweron */
jocis 0:f67a8fffd94a 343 case '\v': /* XON at poweron */
jocis 0:f67a8fffd94a 344 /* eat and ignore these packets */
jocis 0:f67a8fffd94a 345 break;
jocis 0:f67a8fffd94a 346
jocis 0:f67a8fffd94a 347 case '@': /* Reset packet */
jocis 0:f67a8fffd94a 348 /* if we get a reset packet, we have to re-initialize */
jocis 0:f67a8fffd94a 349 /* the device, and assume that its completely schizophrenic */
jocis 0:f67a8fffd94a 350 /* at this moment, we must reset it again at this point */
jocis 0:f67a8fffd94a 351 m_resetoccured=1;
jocis 0:f67a8fffd94a 352 //JKReset();
jocis 0:f67a8fffd94a 353 Init();
jocis 0:f67a8fffd94a 354 break;
jocis 0:f67a8fffd94a 355
jocis 0:f67a8fffd94a 356
jocis 0:f67a8fffd94a 357 case 'E': /* Error packet, hardware/software problem */
jocis 0:f67a8fffd94a 358 m_erroroccured++;
jocis 0:f67a8fffd94a 359 break;
jocis 0:f67a8fffd94a 360
jocis 0:f67a8fffd94a 361 case 'Z': /* Zero packet (Spaceball 2003/3003/4000 FLX) */
jocis 0:f67a8fffd94a 362 /* We just ignore these... */
jocis 0:f67a8fffd94a 363 break;
jocis 0:f67a8fffd94a 364
jocis 0:f67a8fffd94a 365 default:
jocis 0:f67a8fffd94a 366 break;
jocis 0:f67a8fffd94a 367 }
jocis 0:f67a8fffd94a 368
jocis 0:f67a8fffd94a 369 /* reset */
jocis 0:f67a8fffd94a 370 m_bufpos = 0;
jocis 0:f67a8fffd94a 371 m_packtype = 0;
jocis 0:f67a8fffd94a 372 m_packlen = 1;
jocis 0:f67a8fffd94a 373 packs++;
jocis 0:f67a8fffd94a 374
jocis 0:f67a8fffd94a 375 }
jocis 0:f67a8fffd94a 376
jocis 0:f67a8fffd94a 377 ///////////////////////////////////////////////////////////////////////////////
jocis 0:f67a8fffd94a 378
jocis 0:f67a8fffd94a 379 void SpaceBall::ProcessSO ( char c )
jocis 0:f67a8fffd94a 380 {
jocis 0:f67a8fffd94a 381 }
jocis 0:f67a8fffd94a 382
jocis 0:f67a8fffd94a 383 ///////////////////////////////////////////////////////////////////////////////
jocis 0:f67a8fffd94a 384 ///////////////////////////////////////////////////////////////////////////////
jocis 0:f67a8fffd94a 385 ///////////////////////////////////////////////////////////////////////////////