Страница 1 из 1

помощь в доработке программы на Си

Добавлено: Вт ноя 03, 2015 10:12 pm
sergejey
Ребята, я тут делаю один модуль для cyberwrt и нужна помощь, т.к. в Си очень плохо разбираюсь.
Это будет модуль для сетевого сканера штрих-кодов.
В общем, есть программа с именем barcode. Запускается так:

Код: Выделить всё

./barcode /dev/input/event0
Она подключается к HID-устройству (в частности сканер штрих-кодов) и выводит отсканированный код. Всё отлично работает, но мне нужно, чтобы вторым параметром была команда, которая будет вызвана после сканирования и которой будет передан код в качестве аргумента. Например, чтобы работал такой вызов:

Код: Выделить всё

./barcode /dev/input/event0 /var/www/myscript.sh
Текущий исходный код barcode.c:
barcode.cПоказать

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>

#define KEY_PRESS 1
#define KEY_KEEPING_PRESSED 2

int main (int argc, char *argv[])
{
struct input_event ev[64];
int fd, rd,size = sizeof (struct input_event);
char name[256] = "Unknown",i;
char *device = NULL;
char decode_scancode[]={0,0,1,2,3,4,5,6,7,8,9,0};

if (argv[1] == NULL){
printf("Please enter path to device\n");
return 1;
}

if ((getuid ()) != 0)
printf ("You must be as root for correct work!\n");

if (argc > 1)
device = argv[1];

if ((fd = open (device, O_RDONLY)) == -1){
printf ("Open error of device %s\n", device);
return 1;
}

ioctl (fd, EVIOCGNAME (sizeof (name)), name);
printf ("Reading From : %s (%s)\n", device, name);

while (1){
if ((rd = read (fd, ev, size * 64)) < size){
perror ("Read error");
return 1;
}

for (i=0; i< ((int)(rd/size)); i++) {
if (ev[i].type == EV_KEY) {
if ((ev[i].value == KEY_PRESS) || (ev[i].value == KEY_KEEPING_PRESSED)) {
if (ev[i].code < 12) {
printf ("%d", (decode_scancode[ev[i].code]));
}
else if (ev[i].code == 28) {
printf ("\n");
}
}
}
}
}

return 0;
}  
Т.е. мне нужно, чтобы в этом коде формировалась строка и запускалась моя программа в этом месте:

Код: Выделить всё

... if (ev[i].code == 28) {
printf ("\n");
(здесь выводим строку и запускаем программу с аргументом)
}
 
В общем, если кто может помочь, то буду весьма признателен.

Re: помощь в доработке программы на Си

Добавлено: Чт ноя 05, 2015 11:35 am
sergejey
Оставлю здесь решение задачки :)
решениеПоказать

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>

#define KEY_PRESS 1
#define KEY_KEEPING_PRESSED 2

int main (int argc, char *argv[])
{
struct input_event ev[64];
int fd, rd,size = sizeof (struct input_event);
char name[256] = "Unknown",i;
char *device = NULL;
char *runapp = NULL;
char cmd_buffer[512] = {0}; 
int cmd_count = 0;
char decode_scancode[]={0,0,1,2,3,4,5,6,7,8,9,0};

if (argv[1] == NULL){
printf("Please enter path to device\n");
return 1;
}


if (argv[2] != NULL){
 cmd_count = snprintf(cmd_buffer, sizeof(cmd_buffer) - cmd_count, "%s ", argv[2]);
}


if ((getuid ()) != 0)
printf ("You must be as root for correct work!\n");

if (argc > 1)
device = argv[1];

if (argc > 2)
runapp = argv[2];

if ((fd = open (device, O_RDONLY)) == -1){
printf ("Open error of device %s\n", device);
return 1;
}

ioctl (fd, EVIOCGNAME (sizeof (name)), name);
printf ("Reading From : %s (%s)\n", device, name);

while (1){
if ((rd = read (fd, ev, size * 64)) < size){
perror ("Read error");
return 1;
}

for (i=0; i< ((int)(rd/size)); i++) {
if (ev[i].type == EV_KEY) {
if ((ev[i].value == KEY_PRESS) || (ev[i].value == KEY_KEEPING_PRESSED)) {
if (ev[i].code < 12) {
 cmd_count += snprintf(&cmd_buffer[cmd_count], sizeof(cmd_buffer) - cmd_count, "%d", decode_scancode[ev[i].code]);        
 //printf ("%d", (decode_scancode[ev[i].code]));
}
else if (ev[i].code == 28) {
 printf ("%s", cmd_buffer);        
 if ( argv[2] != NULL ) {
  int result = system(cmd_buffer);
 }
 cmd_count = 0;
 memset(cmd_buffer,0,sizeof(cmd_buffer));
 if ( argv[2] != NULL ) {
  cmd_count = snprintf(cmd_buffer, sizeof(cmd_buffer) - cmd_count, "%s ", argv[2]);
 }
 printf ("\n");
}
}
}
}
}

return 0;
}  
P.S. С помощью этого кода, USB-сканера штрих-кодов и роутера tplink удалось сделать wifi-сканер штрих-кодов. В одном проекте делаю что-то вроде POS-терминала на MajorDoMo -- прикольно получается, как-нибудь потом опишу.