Project

General

Profile

Revision 1354

Added by Chris Mar almost 15 years ago

adding keyboard remote control for testing...still in progress.

View differences:

trunk/code/projects/colonet/robot/joystick/keyboard_control/keyboard.c
1
#include <stdlib.h>
2
#include <stdio.h>
3
#include <string.h>
4
#include <curses.h> // you need to install the ncurses library
5
#include "../../../../libwireless/lib/wireless.h"
6
#include <unistd.h>
7

  
8
#define WL_CNTL_GROUP 4
9

  
10
#define CNTL_FORWARD 'f'
11
#define CNTL_BACK    'b'
12
#define CNTL_LEFT    'l'
13
#define CNTL_RIGHT   'r'
14
#define CNTL_STOP    's'
15
#define CNTL_BUZZ0   't'
16
#define CNTL_BUZZ1   'u'
17

  
18
void send_packet (char type, int dst_robot);
19

  
20
PacketGroupHandler cntlHandler = {WL_CNTL_GROUP, NULL, NULL, NULL, NULL};
21

  
22
int main(int argc, char *argv[]) {
23
/*    if (argc != 3) {
24
        printf("Usage: ./test <robot #> <USB port #>\n");
25
        return 1;
26
    }
27
    
28
    char c;
29
    int robot = atoi(argv[1]);
30
    char port[14];	// port that XBee is on
31

  
32
    // USB port to use is second cmd-line argument
33
    strcpy(port, "/dev/ttyUSB");
34
    strcat(port, argv[2]);
35

  
36
    printf("Beginning: robot=%d\r\n", robot);
37
    wl_set_com_port(port);
38
    wl_init();
39
    //wl_set_channel(CHAN);
40
    printf("Wireless initialized.\r\n");
41
    wl_register_packet_group(&cntlHandler);
42
    printf("Packet groups initialized.\r\n");
43
    fflush(stdout);
44
*/
45

  
46
	char c;
47
	WINDOW* win = initscr();
48
	cbreak();
49
	noecho();
50
    while (1) {
51
		c = getch();
52
		printf("%c\r\n", c);
53
	    fflush(stdout);
54
	    if (c == '0')
55
			break;
56
	    /*switch (c) {
57
			case 'w':
58
				send_packet(CNTL_FORWARD, robot);
59
				break;
60
			case 's':
61
				send_packet(CNTL_BACK, robot);
62
				break;
63
			case 'a':
64
				send_packet(CNTL_LEFT, robot);
65
				break;
66
			case 'd':
67
				send_packet(CNTL_RIGHT, robot);
68
				break;
69
			case 'x':
70
				send_packet(CNTL_STOP, robot);
71
				break;
72
			default:
73
				//send_packet(CNTL_STOP, robot);
74
				break;
75
	    }*/
76
	}
77
    delwin(win);
78
    endwin();
79
    refresh();
80
    return 0;
81
}
82
/*
83
void send_packet (char type, int dst_robot) {
84
    wl_send_robot_to_robot_global_packet(WL_CNTL_GROUP, type,
85
            NULL, 0, dst_robot, 0);
86
}*/
87

  
trunk/code/projects/colonet/robot/joystick/keyboard_control/Makefile
1
CC = gcc
2
CFLAGS = -Wall -g
3

  
4
all: keyboard
5

  
6
test: *.c ../../libwireless/lib/*.c 
7
	$(CC) $(CFLAGS) *.c -L../../libwireless/lib -o test -DWL_DEBUG -lwireless -lpthread -lncurses -ggdb
8

  
9
clean:
10
	rm -f *.o test ../lib/*.o
11

  
trunk/code/projects/colonet/robot/joystick/discrete_control/joystick.c
29 29
#define MOVED_Y_CENTER            (1<<8)
30 30
#define MOVED_DOWN                (1<<9)
31 31

  
32
/* Command Types */
33
#define CNTL_FORWARD 'f'
34
#define CNTL_STOP    's'
35
#define CNTL_BACK    'b'
36
#define CNTL_LEFT    'l'
37
#define CNTL_RIGHT   'r'
38
#define CNTL_BUZZ0   't'
39
#define CNTL_BUZZ1   'u'
40

  
41
#define WL_CNTL_GROUP 4
42

  
32 43
int joystick_status (void);
33 44
int joystick_change (int old, int new);
34 45

  
35
PacketGroupHandler cntlHandler = {4, NULL, NULL, NULL, NULL};
46
PacketGroupHandler cntlHandler = {WL_CNTL_GROUP, NULL, NULL, NULL, NULL};
36 47

  
37 48
int main (void) {
38
  dragonfly_init(SERIAL | USB | COMM | ORB | ANALOG);
49
  	dragonfly_init(SERIAL | USB | COMM | ORB | ANALOG);
39 50
	ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
40
  //xbee_init();
41
  wl_init();
42
  wl_register_packet_group(&cntlHandler);
51
  	wl_init();
52
  	wl_register_packet_group(&cntlHandler);
43 53

  
44
  orb_set_color(BLUE);
54
  	orb_set_color(BLUE);
45 55
  
46
  int change;
47
  int last_status = 0; 
48
  int cur_status = 0;
56
  	int change;
57
  	int last_status = 0; 
58
  	int cur_status = 0;
49 59
  
50
  while (1) {
51
    last_status = cur_status;
52
    cur_status = joystick_status();
53
    change = joystick_change(last_status, cur_status);
54
    
55
/*    char buf[100];
56
    sprintf(buf, "status: %d\n", cur_status);
57
    usb_puts(buf);
58
*/ 
59
    if (change & MOVED_UP) {
60
      orb_set_color(GREEN);
61
      //xbee_putc('f');
62
      wl_send_global_packet(4, 'f', NULL, 0, 0);
63
      usb_putc('f');
64
    }
65
    if (change & MOVED_Y_CENTER) {
66
      orb_set_color(RED);
67
      //xbee_putc('s');
68
      wl_send_global_packet(4, 's', NULL, 0, 0);
69
      usb_putc('s');
70
    }
71
    if (change & MOVED_DOWN) {
72
      orb_set_color(BLUE);
73
      //xbee_putc('b');
74
      wl_send_global_packet(4, 'b', NULL, 0, 0);
75
      usb_putc('b');
76
    }
77
    if (change & MOVED_LEFT) {
78
      orb_set_color(ORANGE);
79
      //xbee_putc('l');
80
      wl_send_global_packet(4, 'l', NULL, 0, 0);
81
      usb_putc('l');
82
    }
83
    if (change & MOVED_X_CENTER) {
84
      orb_set_color(RED);
85
      //xbee_putc('s');
86
      wl_send_global_packet(4, 's', NULL, 0, 0);
87
      usb_putc('s');
88
    }
89
    if (change & MOVED_RIGHT) {
90
      orb_set_color(YELLOW);
91
      //xbee_putc('r');
92
      wl_send_global_packet(4, 'r', NULL, 0, 0);
93
      usb_putc('r');
94
    }
95
    if (change & TRIGGER_PRESSED) {
96
      orb_set_color(PURPLE);
97
      //xbee_putc('t');
98
      wl_send_global_packet(4, 't', NULL, 0, 0);
99
    }
100
    if (change & BUTTON_PRESSED) {
101
      orb_set_color(YELLOW);
102
      //xbee_putc('u');
103
      wl_send_global_packet(4, 's', NULL, 0, 0);
104
    }
105
    delay_ms(100);
106
  }
60
	while (1) {
61
		last_status = cur_status;
62
		cur_status = joystick_status();
63
		change = joystick_change(last_status, cur_status);
64

  
65
		if (change & MOVED_UP) {
66
			orb_set_color(GREEN);
67
			wl_send_global_packet(4, CNTL_FORWARD, NULL, 0, 0);
68
		}
69
		if (change & MOVED_Y_CENTER) {
70
			orb_set_color(RED);
71
			wl_send_global_packet(4, CNTL_STOP, NULL, 0, 0);
72
		}
73
		if (change & MOVED_DOWN) {
74
			orb_set_color(BLUE);
75
			wl_send_global_packet(4, CNTL_BACK, NULL, 0, 0);
76
		}
77
		if (change & MOVED_LEFT) {
78
			orb_set_color(ORANGE);
79
			wl_send_global_packet(4, CNTL_LEFT, NULL, 0, 0);
80
		}
81
		if (change & MOVED_X_CENTER) {
82
			orb_set_color(RED);
83
			wl_send_global_packet(4, CNTL_STOP, NULL, 0, 0);
84
		}
85
		if (change & MOVED_RIGHT) {
86
			orb_set_color(YELLOW);
87
			wl_send_global_packet(4, CNTL_RIGHT, NULL, 0, 0);
88
		}
89
		if (change & TRIGGER_PRESSED) {
90
			orb_set_color(PURPLE);
91
			wl_send_global_packet(4, CNTL_BUZZ0, NULL, 0, 0);
92
		}
93
		if (change & BUTTON_PRESSED) {
94
			orb_set_color(YELLOW);
95
			wl_send_global_packet(4, CNTL_STOP, NULL, 0, 0);
96
		}
97
		delay_ms(100);
98
	}
107 99
  
108 100
}
109 101

  
110 102
int joystick_change (int old, int new) {
111
  int trigger_change = 0;
112
  int button_change = 0;
113
  int x_change = 0;
114
  int y_change = 0;
115
  /* Check for trigger change */
116
  if ((old & TRIGGER_DOWN) && (new & TRIGGER_UP))
117
    trigger_change = TRIGGER_RELEASED;
118
  if ((old & TRIGGER_UP) && (new & TRIGGER_DOWN)) 
119
    trigger_change = TRIGGER_PRESSED;
120
  /* Check for button change */
121
  if ((old & BUTTON_DOWN) && (new & BUTTON_UP))
122
    button_change = BUTTON_RELEASED;
123
  if ((old & BUTTON_UP) && (new & BUTTON_DOWN))
124
    button_change = BUTTON_PRESSED;
125
  /* Check for X change */
126
  if ((old & X_CENTER) && (new & X_RIGHT))
127
    x_change = MOVED_RIGHT;
128
  if ((old & X_CENTER) && (new & X_LEFT))
129
    x_change = MOVED_LEFT;
130
  if (!(old & X_CENTER) && (new & X_CENTER))
131
    x_change = MOVED_X_CENTER;
132
  /* Check for Y change */
133
  if ((old & Y_CENTER) && (new & Y_UP))
134
    y_change = MOVED_UP;
135
  if ((old & Y_CENTER) && (new & Y_DOWN))
136
    y_change = MOVED_DOWN;
137
  if (!(old & Y_CENTER) && (new & Y_CENTER))
138
    y_change = MOVED_Y_CENTER;
139
  return trigger_change | button_change | x_change | y_change;
103
	int trigger_change = 0;
104
	int button_change = 0;
105
	int x_change = 0;
106
	int y_change = 0;
107
	/* Check for trigger change */
108
	if ((old & TRIGGER_DOWN) && (new & TRIGGER_UP))
109
		trigger_change = TRIGGER_RELEASED;
110
	if ((old & TRIGGER_UP) && (new & TRIGGER_DOWN)) 
111
		trigger_change = TRIGGER_PRESSED;
112
	/* Check for button change */
113
	if ((old & BUTTON_DOWN) && (new & BUTTON_UP))
114
		button_change = BUTTON_RELEASED;
115
	if ((old & BUTTON_UP) && (new & BUTTON_DOWN))
116
		button_change = BUTTON_PRESSED;
117
	/* Check for X change */
118
	if ((old & X_CENTER) && (new & X_RIGHT))
119
		x_change = MOVED_RIGHT;
120
	if ((old & X_CENTER) && (new & X_LEFT))
121
		x_change = MOVED_LEFT;
122
	if (!(old & X_CENTER) && (new & X_CENTER))
123
		x_change = MOVED_X_CENTER;
124
	/* Check for Y change */
125
	if ((old & Y_CENTER) && (new & Y_UP))
126
		y_change = MOVED_UP;
127
	if ((old & Y_CENTER) && (new & Y_DOWN))
128
		y_change = MOVED_DOWN;
129
	if (!(old & Y_CENTER) && (new & Y_CENTER))
130
		y_change = MOVED_Y_CENTER;
131
	return trigger_change | button_change | x_change | y_change;
140 132
}
141 133

  
142 134
/**
......
150 142
	int y_status = 0;
151 143
	int xval, yval;
152 144
    
153
  if (analog_get8(AN0) > 200)
154
    trigger_status = TRIGGER_DOWN;
155
  else
156
    trigger_status = TRIGGER_UP;
157
    
158
  if (analog_get8(AN1) > 200)
159
    button_status = BUTTON_DOWN;
160
  else
161
    button_status = BUTTON_UP;
162
  
163
  xval = analog_get8(AN4); // actually AN6, AN7 for connection
164
  yval = analog_get8(AN5);
165
  
166
  if (xval > 150)
167
    x_status = X_LEFT;
168
  else if (xval < 75)
169
    x_status = X_RIGHT;
170
  else
171
    x_status = X_CENTER;
172
  
173
  if (yval > 150)
174
    y_status = Y_UP;
175
  else if (yval < 75)
176
    y_status = Y_DOWN;
177
  else
178
    y_status = Y_CENTER;
145
	if (analog_get8(AN0) > 200)
146
		trigger_status = TRIGGER_DOWN;
147
	else
148
		trigger_status = TRIGGER_UP;
179 149

  
150
	if (analog_get8(AN1) > 200)
151
		button_status = BUTTON_DOWN;
152
	else
153
		button_status = BUTTON_UP;
180 154

  
181
  return trigger_status | button_status | x_status | y_status;
155
	xval = analog_get8(AN4); // actually AN6, AN7 for connection
156
	yval = analog_get8(AN5);
157

  
158
	if (xval > 150)
159
		x_status = X_LEFT;
160
	else if (xval < 75)
161
		x_status = X_RIGHT;
162
	else
163
		x_status = X_CENTER;
164

  
165
	if (yval > 150)
166
		y_status = Y_UP;
167
	else if (yval < 75)
168
		y_status = Y_DOWN;
169
	else
170
		y_status = Y_CENTER;
171

  
172

  
173
	return trigger_status | button_status | x_status | y_status;
182 174
}
183 175

  
trunk/code/projects/colonet/robot/joystick/simple_slave/slave.c
2 2
#include <wireless.h>
3 3
#include "../../../common/colonet_defs.h"
4 4

  
5
/* Command Types */
6
#define CNTL_FORWARD 'f'
7
#define CNTL_STOP    's'
8
#define CNTL_BACK    'b'
9
#define CNTL_LEFT    'l'
10
#define CNTL_RIGHT   'r'
11
#define CNTL_BUZZ0   't'
12
#define CNTL_BUZZ1   'u'
13

  
14
#define WL_CNTL_GROUP 4
15

  
5 16
void packet_receive (char type, int source, unsigned char* packet, int length);
6 17

  
7
PacketGroupHandler packetHandler = {4, NULL, NULL, &packet_receive, NULL};
18
PacketGroupHandler packetHandler = {WL_CNTL_GROUP, NULL, NULL, &packet_receive, NULL};
8 19

  
9 20
int main (void) {
10
  dragonfly_init(SERIAL | USB | COMM | ORB | ANALOG | MOTORS | BUZZER);
21
	dragonfly_init(SERIAL | USB | COMM | ORB | ANALOG | MOTORS | BUZZER);
11 22
	ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
12
	//xbee_init();
13 23
    wl_init();
14 24
    wl_register_packet_group(&packetHandler);
15 25
	orb_set_color(PURPLE);
16 26
  
17
  /*char buf[100];
18
  char c;*/
19
  while (1) {
20
    //usb_puts("entering while loop\n");
21
    wl_do();
22
//    c = xbee_getc();
23
//    orb_set_color(GREEN);
24
//    sprintf(buf, "got char: %c\n", c);
25
//    usb_puts(buf);
26
    
27
    /*if (c == 'f') {
28
      orb_set_color(GREEN);
29
      motor1_set(1, 250);
30
      motor2_set(1, 250);
31
    }
32
    if (c == 'b') {
33
      orb_set_color(BLUE);
34
      motor1_set(0, 250);
35
      motor2_set(0, 250);
36
    }
37
    if (c == 'l') {
38
      orb_set_color(ORANGE);
39
      motor1_set(0, 250);
40
      motor2_set(1, 250);
41
    }
42
    if (c == 'r') {
43
      orb_set_color(YELLOW);
44
      motor1_set(1, 250);
45
      motor2_set(0, 250);
46
    }
47
    if (c == 's') {
48
      orb_set_color(RED);
49
      motor1_set(0, 0);
50
      motor2_set(0, 0);
51
    }
52
    if (c == 't') {
53
      orb_set_color(PURPLE);
54
      buzzer_chirp(1000, C5);
55
    }
56
    if (c == 'u') {
57
      orb_set_color(YELLOW);
58
      buzzer_chirp(1000, A4);
59
    }
60
    
61
    delay_ms(100);*/
62
  }
63
  
27
  	while (1) {
28
    	wl_do();
29
    	delay_ms(100);
30
  	}
64 31
}
65 32

  
66 33
void packet_receive (char type, int source, unsigned char* packet, int length) {
67 34
    switch (type) {
68
        case 'f':
35
        case CNTL_FORWARD:
69 36
            orb_set_color(GREEN);
70 37
            motor1_set(1, 250);
71 38
            motor2_set(1, 250);
72 39
            break;
73
        case 's':
40
        case CNTL_STOP:
74 41
            orb_set_color(RED);
75 42
            motor1_set(0, 0);
76 43
            motor2_set(0, 0);
77 44
            break;
78
        case 'b':
45
        case CNTL_BACK:
79 46
            orb_set_color(BLUE);
80 47
            motor1_set(0, 250);
81 48
            motor2_set(0, 250);
82 49
            break;
83
        case 'l':
50
        case CNTL_LEFT:
84 51
            orb_set_color(ORANGE);
85 52
            motor1_set(0, 250);
86 53
            motor2_set(1, 250);
87 54
            break;
88
        case 'r':
55
        case CNTL_RIGHT:
89 56
            orb_set_color(YELLOW);
90 57
            motor1_set(1, 250);
91 58
            motor2_set(0, 250);
92 59
            break;
93
        case 't':
60
        case CNTL_BUZZ0:
94 61
            orb_set_color(PURPLE);
95 62
            buzzer_chirp(1000, C5);
96 63
            break;
97
        case 'u':
64
        case CNTL_BUZZ1:
98 65
            orb_set_color(YELLOW);
99 66
            buzzer_chirp(1000, A4);
100 67
            break;

Also available in: Unified diff