#include <termios.h>
#include "barcode.h"
+
static struct sercom_data sercom;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+typedef enum {
+ AIM_OFF,
+ AIM_ON,
+ BEEP,
+ CMD_ACK,
+ CMD_NAK,
+ LED_OFF,
+ LED_ON,
+ PARAM_DEFAULTS,
+ PARAM_REQUEST,
+ PARAM_SEND,
+ REQUEST_REVISION,
+ SCAN_DISABLE,
+ SCAN_ENABLE,
+ SLEEP,
+ START_DECODE,
+ STOP_DECODE,
+ WAKEUP,
+ CUSTOM_DEFAULTS
+} commandes;
+
+
+unsigned char getOpcode(commandes command)
+{
+ switch (command)
+ {
+ case AIM_OFF:
+ return 0xC4;
+ break;
+ case AIM_ON:
+ return 0xC5;
+ break;
+ case BEEP:
+ return 0xE6;
+ break;
+ case CMD_ACK:
+ return 0xD0;
+ break;
+ case CMD_NAK:
+ return 0xD1;
+ break;
+ case LED_OFF:
+ return 0xE8;
+ break;
+ case LED_ON:
+ return 0xE7;
+ break;
+ case PARAM_DEFAULTS:
+ return 0xC8;
+ break;
+ case PARAM_REQUEST:
+ return 0xC7;
+ break;
+ case PARAM_SEND:
+ return 0xC6;
+ break;
+ case REQUEST_REVISION:
+ return 0xA3;
+ break;
+ case SCAN_DISABLE:
+ return 0xEA;
+ break;
+ case SCAN_ENABLE:
+ return 0xE9;
+ break;
+ case SLEEP:
+ return 0xEB;
+ break;
+ case START_DECODE:
+ return 0xE4;
+ break;
+ case STOP_DECODE:
+ return 0xE5;
+ break;
+ case WAKEUP:
+ return 0x00;
+ break;
+ case CUSTOM_DEFAULTS:
+ return 0x12;
+ break;
+ }
+}
+
+int send_command(commandes command, unsigned char *data, int dataLength)
+{
+ unsigned char length;
+ int i; //pomocne cyklitko
+
+ if (data==NULL) {
+ length=7;
+ }
+ else {
+ length=dataLength+6;
+ printf("\ndelka paketu je %d\n", length);
+ }
+
+ unsigned char message[length];
+
+ //delka zpravy
+ message[0]=length-2;
+ //Opcode
+ message[1]=getOpcode(command);
+ //odesilatel
+ message[2]=0x04;
+ //status
+ message[3]=0x00; //to se musi najit, co jaky bit dela
+
+ if (data!=NULL) {
+ //nahraju zpravu
+ for (i=0; i<dataLength; i++)
+ message[4+i]=data[i];
+ }
+ else {
+ //necham prazdna data
+ message[4]=0x00;
+ }
+
+ //spocte checksum
+ count_checksum(message, length);
+
+
+
+ printf("\ncelkovy paket je:\n");
+ for (i=0; i<length; i++)
+ printf("0x%0.2X ", message[i]);
+ printf("\n");
+
+ barcode_write(message, length);
+
+
+ return 0;
+}
+
+void count_checksum(unsigned char *message, int length)
+{
+ //to jako nevim jak spocitat
+ message[length-1]=0xAA;
+ message[length-2]=0xBB;
+}
+
+
int barcode_sercom_init(char * tty, void(*sighandler)(int))
{
- int ret;
- strcpy((char *)&sercom.devname, tty);
- sercom.baudrate = 9600;
- sercom.parity = SERCOM_PARNONE;
- sercom.databits = 8;
- sercom.stopbits = 1;
- sercom.mode = 0;
- sercom.sighandler = NULL;
- ret = sercom_open(&sercom);
- if (ret < 0) {
- return -1;
- }
- else {
+ int ret;
+ strcpy((char *)&sercom.devname, tty);
+ sercom.baudrate = 9600;
+ sercom.parity = SERCOM_PARNONE;
+ sercom.databits = 8;
+ sercom.stopbits = 1;
+ sercom.mode = 0;
+ sercom.sighandler = NULL;
+ ret = sercom_open(&sercom);
+ if (ret < 0) {
+ return -1;
+ }
+ else {
#define EBTEST
#ifdef EBTEST
- /* this part is used for testing purposess with ebboard,
- remove this when conected to real scanner */
- /* toogle DTR and RTS signal to drive the ebboard from reset */
- int status;
+ /* this part is used for testing purposess with ebboard,
+ remove this when conected to real scanner */
+ /* toogle DTR and RTS signal to drive the ebboard from reset */
+ int status;
- ioctl(sercom.fd, TIOCMGET, &status); /* get the serial port status */
+ ioctl(sercom.fd, TIOCMGET, &status); /* get the serial port status */
- status &= ~TIOCM_DTR;
- status &= ~TIOCM_RTS;
+ status &= ~TIOCM_DTR;
+ status &= ~TIOCM_RTS;
- ioctl(sercom.fd, TIOCMSET, &status); /* set the serial port status */
+ ioctl(sercom.fd, TIOCMSET, &status); /* set the serial port status */
#endif
- printf("Open serial connection to barcode scanner!");
- return 0;
- }
+ printf("Open serial connection to barcode scanner!");
+ return 0;
+ }
}
int barcode_read(unsigned char *buff, int size)
{
- int ret;
- pthread_mutex_lock(&mutex);
- ret = read(sercom.fd, buff, size);
- pthread_mutex_unlock(&mutex);
-
- if (ret != size) {
- printf("READ FAILED!\n");
- return -1;
- }
- return ret;
+ int ret;
+ pthread_mutex_lock(&mutex);
+ ret = read(sercom.fd, buff, size);
+ pthread_mutex_unlock(&mutex);
+
+ if (ret != size) {
+ printf("READ FAILED!\n");
+ return -1;
+ }
+ return ret;
+}
+
+int barcode_write(unsigned char *buff, int size)
+{
+ int ret;
+ int i,j;
+ pthread_mutex_lock(&mutex);
+ printf("sending command (%2d bytes): ", size);
+
+
+ ret = write(sercom.fd, buff, size);
+ pthread_mutex_unlock(&mutex);
+ if (ret != size) {
+ printf("uoled: WRITE FAILED!\n");
+ return -1;
+ }
+
+ return 0;
}
int main(void)
{
- char rcmd[4];
+ char rcmd[4];
- barcode_sercom_init("/dev/ttyUSB0", NULL);
+ barcode_sercom_init("/dev/ttyUSB0", NULL);
- while (1) {
- barcode_read(rcmd, 4);
- putchar(rcmd[0]);
- putchar(rcmd[1]);
- putchar(rcmd[2]);
- putchar('\n');
- //printf("%s", rcmd);
- }
+ send_command(AIM_OFF, NULL, 0);
- return 0;
+
+ //cekam na odpoved, coz je delka prijimane zpravy
+ barcode_read(rcmd,1);
+
+ printf("\ndelka nadchazejici zpravy 0x%0.2X\n", rcmd[0]);
+
+
+
+ return 0;
+
+ while (1) {
+ barcode_read(rcmd, 4);
+ putchar(rcmd[0]);
+ putchar(rcmd[1]);
+ putchar(rcmd[2]);
+ putchar('\n');
+
+ //printf("%s", rcmd);
+ }
+
+ return 0;
}