]> rtime.felk.cvut.cz Git - eurobot/public.git/blob - src/barcode/barcode.c
barcode: Next testing version, nothing more.
[eurobot/public.git] / src / barcode / barcode.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <sercom.h>
4 #include <string.h>
5 #include <pthread.h>
6 #include <sys/ioctl.h>
7 #include <fcntl.h>
8 #include <termios.h>
9 #include "barcode.h"
10
11
12 static struct sercom_data sercom;
13 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
14
15 typedef enum {
16     AIM_OFF,
17     AIM_ON,
18     BEEP,
19     CMD_ACK,
20     CMD_NAK,
21     LED_OFF,
22     LED_ON,
23     PARAM_DEFAULTS,
24     PARAM_REQUEST,
25     PARAM_SEND,
26     REQUEST_REVISION,
27     SCAN_DISABLE,
28     SCAN_ENABLE,
29     SLEEP,
30     START_DECODE,
31     STOP_DECODE,
32     WAKEUP,
33     CUSTOM_DEFAULTS
34 } commandes;
35
36
37 unsigned char getOpcode(commandes command)
38 {
39     switch (command)
40     {
41     case AIM_OFF:
42         return 0xC4;
43         break;
44     case AIM_ON:
45         return 0xC5;
46         break;
47     case BEEP:
48         return 0xE6;
49         break;
50     case CMD_ACK:
51         return 0xD0;
52         break;
53     case CMD_NAK:
54         return 0xD1;
55         break;
56     case LED_OFF:
57         return 0xE8;
58         break;
59     case LED_ON:
60         return 0xE7;
61         break;
62     case PARAM_DEFAULTS:
63         return 0xC8;
64         break;
65     case PARAM_REQUEST:
66         return 0xC7;
67         break;
68     case PARAM_SEND:
69         return 0xC6;
70         break;
71     case REQUEST_REVISION:
72         return 0xA3;
73         break;
74     case SCAN_DISABLE:
75         return 0xEA;
76         break;
77     case SCAN_ENABLE:
78         return 0xE9;
79         break;
80     case SLEEP:
81         return 0xEB;
82         break;
83     case START_DECODE:
84         return 0xE4;
85         break;
86     case STOP_DECODE:
87         return 0xE5;
88         break;
89     case WAKEUP:
90         return 0x00;
91         break;
92     case CUSTOM_DEFAULTS:
93         return 0x12;
94         break;
95     }
96 }
97
98 int send_command(commandes command, unsigned char *data, int dataLength)
99 {
100     unsigned char length;
101     int i; //pomocne cyklitko
102
103     if (data==NULL) {
104         length=7;
105     }
106     else {
107         length=dataLength+6;
108         printf("\ndelka paketu je %d\n", length);
109     }
110
111     unsigned char message[length];
112
113     //delka zpravy
114     message[0]=length-2;
115     //Opcode
116     message[1]=getOpcode(command);
117     //odesilatel
118     message[2]=0x04;
119     //status
120     message[3]=0x00;  //to se musi najit, co jaky bit dela
121
122     if (data!=NULL) {
123         //nahraju zpravu
124         for (i=0; i<dataLength; i++)
125             message[4+i]=data[i];
126     }
127     else {
128         //necham prazdna data
129         message[4]=0x00;
130     }
131
132     //spocte checksum
133     count_checksum(message, length);
134
135
136
137     printf("\ncelkovy paket je:\n");
138     for (i=0; i<length; i++)
139         printf("0x%0.2X ", message[i]);
140     printf("\n");
141
142     barcode_write(message, length);
143
144
145     return 0;
146 }
147
148 void count_checksum(unsigned char *message, int length)
149 {
150     //to jako nevim jak spocitat
151     message[length-1]=0xAA;
152     message[length-2]=0xBB;
153 }
154
155
156 int barcode_sercom_init(char * tty, void(*sighandler)(int))
157 {
158     int ret;
159     strcpy((char *)&sercom.devname, tty);
160     sercom.baudrate = 9600;
161     sercom.parity = SERCOM_PARNONE;
162     sercom.databits = 8;
163     sercom.stopbits = 1;
164     sercom.mode = 0;
165     sercom.sighandler = NULL;
166     ret = sercom_open(&sercom);
167     if (ret < 0) {
168         return -1;
169     }
170     else {
171 #define EBTEST
172 #ifdef EBTEST
173         /* this part is used for testing purposess with ebboard,
174         remove this when conected to real scanner */
175         /* toogle DTR and RTS signal to drive the ebboard from reset */
176         int status;
177
178         ioctl(sercom.fd, TIOCMGET, &status); /* get the serial port status */
179
180         status &= ~TIOCM_DTR;
181         status &= ~TIOCM_RTS;
182
183         ioctl(sercom.fd, TIOCMSET, &status); /* set the serial port status */
184 #endif
185         printf("Open serial connection to barcode scanner!");
186         return 0;
187     }
188 }
189
190
191 int barcode_read(unsigned char *buff, int size)
192 {
193     int ret;
194     pthread_mutex_lock(&mutex);
195     ret = read(sercom.fd, buff, size);
196     pthread_mutex_unlock(&mutex);
197
198     if (ret != size) {
199         printf("READ FAILED!\n");
200         return -1;
201     }
202     return ret;
203 }
204
205 int barcode_write(unsigned char *buff, int size)
206 {
207     int ret;
208     int i,j;
209     pthread_mutex_lock(&mutex);
210     printf("sending command (%2d bytes): ", size);
211
212
213     ret = write(sercom.fd, buff, size);
214     pthread_mutex_unlock(&mutex);
215     if (ret != size) {
216         printf("uoled: WRITE FAILED!\n");
217         return -1;
218     }
219
220     return 0;
221 }
222
223 int main(void)
224 {
225     char rcmd[4];
226
227     barcode_sercom_init("/dev/ttyUSB0", NULL);
228
229
230     send_command(AIM_OFF, NULL, 0);
231
232
233     //cekam na odpoved, coz je delka prijimane zpravy
234     barcode_read(rcmd,1);
235
236     printf("\ndelka nadchazejici zpravy 0x%0.2X\n", rcmd[0]);
237
238
239
240     return 0;
241
242     while (1) {
243         barcode_read(rcmd, 4);
244         putchar(rcmd[0]);
245         putchar(rcmd[1]);
246         putchar(rcmd[2]);
247         putchar('\n');
248
249         //printf("%s", rcmd);
250     }
251
252     return 0;
253 }