Project

General

Profile

Revision 683

Added by Greg Tress about 16 years ago

Joystick control works using xbee_putc

View differences:

joystick.c
1 1
#include <dragonfly_lib.h>
2 2
#include <wireless.h>
3
#include <wl_defs.h>
3 4
#include "../../common/colonet_defs.h"
5
#include <serial.h>
6
#include <stdio.h>
4 7

  
5
#define IS_TRIGGER_DOWN(status)   (status & (1))
6
#define IS_BUTTON_DOWN(status)    (status & (1<<1))
7
#define IS_RIGHT(status)          (status & (1<<2))
8
#define IS_X_CENTER(status)       (status & (1<<3))
9
#define IS_LEFT(status)           (status & (1<<4))
10
#define IS_DOWN(status)           (status & (1<<5))
11
#define IS_Y_CENTER(status)       (status & (1<<6))
12
#define IS_UP(status)             (status & (1<<7)) 
8
/* Current state codes */
9
#define TRIGGER_DOWN              1
10
#define TRIGGER_UP               (1<<1)
11
#define BUTTON_DOWN              (1<<2)
12
#define BUTTON_UP                (1<<3)
13
#define X_LEFT                   (1<<4)
14
#define X_CENTER                 (1<<5)
15
#define X_RIGHT                  (1<<6)
16
#define Y_UP                     (1<<7)
17
#define Y_CENTER                 (1<<8)
18
#define Y_DOWN                   (1<<9)
13 19

  
20
/* State change codes */
14 21
#define TRIGGER_PRESSED           1
15 22
#define TRIGGER_RELEASED          (1<<1)
16 23
#define BUTTON_PRESSED            (1<<2)
17 24
#define BUTTON_RELEASED           (1<<3)
18 25
#define MOVED_LEFT                (1<<4)
19
#define MOVED_CENTER_X            (1<<5)
26
#define MOVED_X_CENTER            (1<<5)
20 27
#define MOVED_RIGHT               (1<<6)
21 28
#define MOVED_UP                  (1<<7)
22
#define MOVED_CENTER_Y            (1<<8)
29
#define MOVED_Y_CENTER            (1<<8)
23 30
#define MOVED_DOWN                (1<<9)
24 31

  
25 32
int joystick_status (void);
26 33
int joystick_change (int old, int new);
27 34

  
28
int last_status = 0; 
29
int cur_status = 0;
30

  
31 35
int main (void) {
32 36
  dragonfly_init(SERIAL | USB | COMM | ORB | ANALOG);
33
	ADCSRA = 0;
34
	ADCSRA |= _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
35
	orb_set_color(BLUE);
37
	ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
38
	xbee_init();
39

  
40
  orb_set_color(BLUE);
36 41
  
37
  int status, change;
42
  int change;
43
  int last_status = 0; 
44
  int cur_status = 0;
45
  
38 46
  while (1) {
39 47
    last_status = cur_status;
40 48
    cur_status = joystick_status();
41
    change = joystick_change(old_status, cur_status);
42
    if (change | TRIGGER_PRESSED)
49
    change = joystick_change(last_status, cur_status);
50
    
51
    char buf[100];
52
    sprintf(buf, "status: %d\n", cur_status);
53
    usb_puts(buf);
54
    
55
    if (change & MOVED_UP) {
43 56
      orb_set_color(GREEN);
44
    if (change | TRIGGER_RELEASED)
57
      xbee_putc('f');
58
    }
59
    if (change & MOVED_Y_CENTER) {
60
      orb_set_color(RED);
61
      xbee_putc('s');
62
    }
63
    if (change & MOVED_DOWN) {
45 64
      orb_set_color(BLUE);
65
      xbee_putc('b');
66
    }
67
    if (change & MOVED_LEFT) {
68
      orb_set_color(ORANGE);
69
      xbee_putc('l');
70
    }
71
    if (change & MOVED_X_CENTER) {
72
      orb_set_color(RED);
73
      xbee_putc('s');
74
    }
75
    if (change & MOVED_RIGHT) {
76
      orb_set_color(YELLOW);
77
      xbee_putc('r');
78
    }
79
    if (change & TRIGGER_PRESSED) {
80
      orb_set_color(PURPLE);
81
      xbee_putc('t');
82
    }
83
    if (change & BUTTON_PRESSED) {
84
      orb_set_color(YELLOW);
85
      xbee_putc('u');
86
    }
46 87
    delay_ms(100);
47 88
  }
48 89
  
......
54 95
  int x_change = 0;
55 96
  int y_change = 0;
56 97
  /* Check for trigger change */
57
  if (TRIGGER_DOWN(old) && !TRIGGER_DOWN(new))
98
  if ((old & TRIGGER_DOWN) && (new & TRIGGER_UP))
58 99
    trigger_change = TRIGGER_RELEASED;
59
  if (!TRIGGER_DOWN(old) && TRIGGER_DOWN(new)) 
100
  if ((old & TRIGGER_UP) && (new & TRIGGER_DOWN)) 
60 101
    trigger_change = TRIGGER_PRESSED;
61 102
  /* Check for button change */
62
  if (BUTTON_DOWN(old) && !BUTTON_DOWN(new))
103
  if ((old & BUTTON_DOWN) && (new & BUTTON_UP))
63 104
    button_change = BUTTON_RELEASED;
64
  if (!BUTTON_DOWN(old) && BUTTON_DOWN(new))
105
  if ((old & BUTTON_UP) && (new & BUTTON_DOWN))
65 106
    button_change = BUTTON_PRESSED;
66 107
  /* Check for X change */
67
  if (IS_X_CENTER(old) && IS_RIGHT(new))
68
    x_change = MOVE_RIGHT;
69
  if (IS_X_CENTER(old) && IS_LEFT(new))
70
    x_change = MOVE_LEFT;
71
  if (!IS_X_CENTER(old) && IS_X_CENTER(new))
72
    x_change = MOVE_X_CENTER;
108
  if ((old & X_CENTER) && (new & X_RIGHT))
109
    x_change = MOVED_RIGHT;
110
  if ((old & X_CENTER) && (new & X_LEFT))
111
    x_change = MOVED_LEFT;
112
  if (!(old & X_CENTER) && (new & X_CENTER))
113
    x_change = MOVED_X_CENTER;
73 114
  /* Check for Y change */
74
  if (IS_Y_CENTER(old) && IS_UP(new))
75
    y_change = MOVE_UP;
76
  if (IS_Y_CENTER(old) && IS_DOWN(new))
77
    y_change = MOVE_DOWN;
78
  if (!IS_Y_CENTER(old) && IS_Y_CENTER(new))
79
    y_change = MOVE_Y_CENTER;
115
  if ((old & Y_CENTER) && (new & Y_UP))
116
    y_change = MOVED_UP;
117
  if ((old & Y_CENTER) && (new & Y_DOWN))
118
    y_change = MOVED_DOWN;
119
  if (!(old & Y_CENTER) && (new & Y_CENTER))
120
    y_change = MOVED_Y_CENTER;
80 121
  return trigger_change | button_change | x_change | y_change;
81 122
}
82 123

  
83 124
/**
84 125
 * Get the current status of the joystick.
85 126
 * This includes the X and Y axes and the buttons.
86
 * Whenever this is called, the status is saved as part of the state.
87 127
 */
88 128
int joystick_status (void) {
89 129
	int trigger_status = 0;
90 130
	int button_status = 0;
91
  /* For x and y status, use three LSB one-hot as follows: [L|C|R] and [U|C|D] */
92 131
	int x_status = 0; 
93 132
	int y_status = 0;
94 133
	int xval, yval;
95
	
96
	char buf[100];
97
	
98
  /*
99
  sprintf(buf, "trigger: %d  \t button: %d \t X: %d \t Y: %d \n", 
100
    analog_get8(AN0), analog_get8(AN1),
101
    analog_get8(AN4), analog_get8(AN5));
102
  usb_puts(buf);
103
  */
104 134
    
105
  if (trigger_status == 0 && analog_get8(AN0) > 200) {
106
    trigger_status = 1;
107
    sprintf(buf, "Trigger pressed\n");
108
    usb_puts(buf);
109
  }
110
  if (trigger_status == 1 && analog_get8(AN0) < 100) {
111
    trigger_status = 0;
112
    sprintf(buf, "Trigger released\n");
113
    usb_puts(buf);
114
  }
115
  if (button_status == 0 && analog_get8(AN1) > 200) {
116
    button_status = 1;
117
    sprintf(buf, "Button pressed\n");
118
    usb_puts(buf);
119
  }
120
  if (button_status == 1 && analog_get8(AN1) < 100) {
121
    button_status = 0;
122
    sprintf(buf, "Button released\n");
123
    usb_puts(buf);
124
  }
135
  if (analog_get8(AN0) > 200)
136
    trigger_status = TRIGGER_DOWN;
137
  else
138
    trigger_status = TRIGGER_UP;
139
    
140
  if (analog_get8(AN1) > 200)
141
    button_status = BUTTON_DOWN;
142
  else
143
    button_status = BUTTON_UP;
125 144
  
126 145
  xval = analog_get8(AN4);
127 146
  yval = analog_get8(AN5);
128 147
  
129
  if (x_status == 0 && xval > 150) {
130
    x_status = 1<<2;
131
    sprintf(buf, "moved left\n");
132
    usb_puts(buf);
133
  }
134
  else if (x_status == 0 && xval < 75) {
135
    x_status = 1;
136
    sprintf(buf, "moved right\n");
137
    usb_puts(buf);
138
  }
139
  else if (x_status == 1 && xval > 75) {
140
    x_status = 1<<1;
141
    sprintf(buf, "centered x\n");
142
    usb_puts(buf);
143
  }
144
  else if (x_status == -1 && xval < 150) {
145
    x_status = 1<<1;
146
    sprintf(buf, "centered x\n");
147
    usb_puts(buf);
148
  }
148
  if (xval > 150)
149
    x_status = X_LEFT;
150
  else if (xval < 75)
151
    x_status = X_RIGHT;
152
  else
153
    x_status = X_CENTER;
149 154
  
150
  if (y_status == 0 && yval > 150) {
151
    y_status = 1<<3;
152
    sprintf(buf, "moved up\n");
153
    usb_puts(buf);
154
  }
155
  else if (y_status == 0 && yval < 75) {
156
    y_status = 1;
157
    sprintf(buf, "moved down\n");
158
    usb_puts(buf);
159
  }
160
  else if (y_status == 1 && yval > 75) {
161
    y_status = 1<<1;
162
    sprintf(buf, "centered y\n");
163
    usb_puts(buf);
164
  }
165
  else if (y_status == -1 && yval < 150) {
166
    y_status = 1<<1;
167
    sprintf(buf, "centered y\n");
168
    usb_puts(buf);
169
  }
155
  if (yval > 150)
156
    y_status = Y_UP;
157
  else if (yval < 75)
158
    y_status = Y_DOWN;
159
  else
160
    y_status = Y_CENTER;
170 161

  
171
  return trigger_status | (button_status << 1) | (x_status << 2) | (y_status << 5);
162

  
163
  return trigger_status | button_status | x_status | y_status;
172 164
}

Also available in: Unified diff