Code for Wireless IMU Glove Controller used for SharpShooter II
Dependencies: LSM9DS1_Library PinDetect mbed-rtos2 mbed
main.cpp
- Committer:
- jboettcher
- Date:
- 2016-12-07
- Revision:
- 1:44b71d096f7a
- Parent:
- 0:f3043bee193a
File content as of revision 1:44b71d096f7a:
#include "mbed.h"
#include "LSM9DS1.h"
#include "rtos.h"
#include "PinDetect.h"
Serial xbee1(p9, p10);
DigitalOut rst1(p11);
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
DigitalOut haptic(p7);
Serial pc(USBTX, USBRX);
PinDetect shoot(p8);
PinDetect reload(p21);
LSM9DS1 imu(p28, p27, 0xD6, 0x3C);
Mutex mutex;
//Global Variables
int init_x;
int init_y;
int x = 64;
int y = 64;
int old_x;
int old_y;
int dx;
int dy;
int shots_fired = 0;
bool reload_checksum = 0;
bool send_shoot = 0;
bool send_reload = 0;
//Function Declarations
void computeCursorCoordinates();
void sendCursorSwitchAndPB();
void receiveLEDsAndHaptic();
void setShoot();
void setReload();
int main() {
// Initialize IMU
imu.begin();
if (!imu.begin()) {
pc.printf("Failed to communicate with LSM9DS1.\n");
}
imu.calibrate();
imu.readAccel();
init_x = imu.ax;
init_y = imu.ay;
//Initialize Xbee
rst1 = 0;//Set reset pin to 0
wait_ms(1);
rst1 = 1;//Set reset pin to 1
wait_ms(1);
//Initialize LEDs and Haptic
haptic = 0;
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
//Initialize Shoot PB
shoot.mode(PullDown);
shoot.attach_asserted( &setShoot );
shoot.setSampleFrequency(2000); // Defaults to 20ms.
//Initialize Reload Switch
reload.attach_asserted( &setReload );
reload.setSampleFrequency(2000); // Defaults to 20ms.
//Initialize Threads
Thread thread1(receiveLEDsAndHaptic);
Thread thread2(sendCursorSwitchAndPB);
while(1){}
}
/****************************Helper Functions**********************************/
void computeCursorCoordinates() {
old_x = x;
old_y = y;
imu.readAccel();
imu.readMag();
dx = -imu.ay/2000;
x = old_x + dx;
dy = -imu.ax/2000;
y = old_y + dy;
// Set boundaries for Cursor
if(x<10) { x=10; }
if(y<23) { y=23; }
if(x>117) { x=117; }
if(y>117) { y=117; }
}
void sendCursorSwitchAndPB() {
while(1) {
computeCursorCoordinates();
int x0 = (x/100);
int x1 = ((x%100)/10);
int x2 = ((x%100)%10);
int y0 = (y/100);
int y1 = ((y%100)/10);
int y2 = ((y%100)%10);
mutex.lock();
if(xbee1.writeable()) {
xbee1.putc('@');
xbee1.putc(x0+48);
xbee1.putc(x1+48);
xbee1.putc(x2+48);
xbee1.putc(y0+48);
xbee1.putc(y1+48);
xbee1.putc(y2+48);
//Send Reload Switch - Only send true if rising edge
xbee1.putc(send_reload+48);
reload_checksum = send_reload;
if(send_reload) {
pc.printf("RELOAD\n");
}
//Send Shoot PB
xbee1.putc(send_shoot+48);
if(send_shoot==1) {
shots_fired++;
pc.printf("Shots Fired: %d\n",shots_fired);
}
//Calculate and Send Checksum
int sum = x+y+send_shoot+reload_checksum;
int sum0 = (sum/100);
int sum1 = ((sum%100)/10);
int sum2 = ((sum%100)%10);
xbee1.putc(sum0+48);
xbee1.putc(sum1+48);
xbee1.putc(sum2+48);
//Only send shoot and reload flags once
send_shoot = 0;
send_reload = 0;
}
mutex.unlock();
Thread::wait(5);
}
}
void receiveLEDsAndHaptic() {
while(1) {
if(xbee1.readable()){
char X;
mutex.lock();
X = xbee1.getc();
mutex.unlock();
if(X == '#') {
mutex.lock();
X = xbee1.getc()-48;
mutex.unlock();
led1 = X & (1<<4);
led2 = X & (1<<3);
led3 = X & (1<<2);
led4 = X & (1<<1);
haptic = X & (1<<0);
}
}
Thread::wait(500);
}
}
void setShoot() {
mutex.lock();
send_shoot = 1;
mutex.unlock();
}
void setReload() {
mutex.lock();
send_reload = 1;
mutex.unlock();
}
