Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / colonet / robot / joystick / joystick.c @ 682

History | View | Annotate | Download (4.69 KB)

1
#include <dragonfly_lib.h>
2
#include <wireless.h>
3
#include "../../common/colonet_defs.h"
4

    
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)) 
13

    
14
#define TRIGGER_PRESSED           1
15
#define TRIGGER_RELEASED          (1<<1)
16
#define BUTTON_PRESSED            (1<<2)
17
#define BUTTON_RELEASED           (1<<3)
18
#define MOVED_LEFT                (1<<4)
19
#define MOVED_CENTER_X            (1<<5)
20
#define MOVED_RIGHT               (1<<6)
21
#define MOVED_UP                  (1<<7)
22
#define MOVED_CENTER_Y            (1<<8)
23
#define MOVED_DOWN                (1<<9)
24

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

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

    
31
int main (void) {
32
  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);
36
  
37
  int status, change;
38
  while (1) {
39
    last_status = cur_status;
40
    cur_status = joystick_status();
41
    change = joystick_change(old_status, cur_status);
42
    if (change | TRIGGER_PRESSED)
43
      orb_set_color(GREEN);
44
    if (change | TRIGGER_RELEASED)
45
      orb_set_color(BLUE);
46
    delay_ms(100);
47
  }
48
  
49
}
50

    
51
int joystick_change (int old, int new) {
52
  int trigger_change = 0;
53
  int button_change = 0;
54
  int x_change = 0;
55
  int y_change = 0;
56
  /* Check for trigger change */
57
  if (TRIGGER_DOWN(old) && !TRIGGER_DOWN(new))
58
    trigger_change = TRIGGER_RELEASED;
59
  if (!TRIGGER_DOWN(old) && TRIGGER_DOWN(new)) 
60
    trigger_change = TRIGGER_PRESSED;
61
  /* Check for button change */
62
  if (BUTTON_DOWN(old) && !BUTTON_DOWN(new))
63
    button_change = BUTTON_RELEASED;
64
  if (!BUTTON_DOWN(old) && BUTTON_DOWN(new))
65
    button_change = BUTTON_PRESSED;
66
  /* 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;
73
  /* 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;
80
  return trigger_change | button_change | x_change | y_change;
81
}
82

    
83
/**
84
 * Get the current status of the joystick.
85
 * 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
 */
88
int joystick_status (void) {
89
        int trigger_status = 0;
90
        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
        int x_status = 0; 
93
        int y_status = 0;
94
        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
    
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
  }
125
  
126
  xval = analog_get8(AN4);
127
  yval = analog_get8(AN5);
128
  
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
  }
149
  
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
  }
170

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