PDA

Visualizza la versione completa : catturare su file output di un programma


satwanted
02-06-2010, 00:13
Ciao a tutti,

il cruccio è questo..... ho una usb pen che misura la temperatura http://usb.brando.com/prod_detail.php?prod_id=00381 (TEMPer) con il software in C che viene eseguito da console
...............

sending bytes 0, 0, 0, 0, 0, 0, 0, 0
sending bytes 10, 11, 12, 13, 0, 0, 1, 0
temperature 84.20F 29.00C
...............
vorrei catturare l'ultimo output della riga relativa alla temperatura su un file di testo, in modo tale poterlo elaborare e in futuro tramite bash fargli inviare un sms se la temperatura supera un certo valore.

Ho provato con varie sintassi :
./prog > file.log
./prog >> file.log
./prog 2> file.log
./prog 2>&1 file.log
ovviamente i vari tentativi da niubbo preso dalla disperazione che era convinto che fosse sufficiente un banale > .....

avete qualche idea illuminante che mi possa sbloccare da questa situazione ??

GRAZIE A TUTTI
sat

Xaratroom
02-06-2010, 00:23
Puoi scrivere uno scriptino bash come questo:


./prog > temp
tail temp --lines=1 >> file.log

satwanted
02-06-2010, 00:36
grazie Xaratroom ma a me non funziona.... mi rimane fermo in console senza visualizzare niente e tnatomene scrivere sul file

TNX AGAIN

Xaratroom
02-06-2010, 02:23
Ma il programmino (prog) termina ?

EDIT: se hai il codice c, e se la licenza è GNU (o simile) possiamo risolvere in modo più elegante.

satwanted
02-06-2010, 02:27
no devo usare crtl+c per terminarlo

Xaratroom
02-06-2010, 11:33
Hai il codice del programma ?

satwanted
02-06-2010, 12:25
si eccolo .....

temper.c

#include <stdio.h>
#include <string.h>
#include <usb.h>
#include <errno.h>
#include "temper.h"

#define VENDOR_ID 0x1130
#define PRODUCT_ID 0x660c

struct Temper {
struct usb_device *device;
usb_dev_handle *handle;
int debug;
int timeout;
};

Temper *
TemperCreate(struct usb_device *dev, int timeout, int debug)
{
Temper *t;
int ret;

t = calloc(1, sizeof(*t));
t->device = dev;
t->debug = debug;
t->timeout = timeout;
t->handle = usb_open(t->device);
if(!t->handle) {
free(t);
return NULL;
}
if(t->debug) {
printf("Trying to detach kernel driver\n");
}

ret = usb_detach_kernel_driver_np(t->handle, 0);
if(ret) {
if(errno == ENODATA) {
if(t->debug) {
printf("Device already detached\n");
}
} else {
if(t->debug) {
printf("Detach failed: %s[%d]\n",
strerror(errno), errno);
printf("Continuing anyway\n");
}
}
} else {
if(t->debug) {
printf("detach successful\n");
}
}
ret = usb_detach_kernel_driver_np(t->handle, 1);
if(ret) {
if(errno == ENODATA) {
if(t->debug)
printf("Device already detached\n");
} else {
if(t->debug) {
printf("Detach failed: %s[%d]\n",
strerror(errno), errno);
printf("Continuing anyway\n");
}
}
} else {
if(t->debug) {
printf("detach successful\n");
}
}

if(usb_set_configuration(t->handle, 1) < 0 ||
usb_claim_interface(t->handle, 0) < 0 ||
usb_claim_interface(t->handle, 1)) {
usb_close(t->handle);
free(t);
return NULL;
}
return t;
}

Temper *
TemperCreateFromDeviceNumber(int deviceNum, int timeout, int debug)
{
struct usb_bus *bus;
int n;

n = 0;
for(bus=usb_get_busses(); bus; bus=bus->next) {
struct usb_device *dev;

for(dev=bus->devices; dev; dev=dev->next) {
if(debug) {
printf("Found device: %04x:%04x\n",
dev->descriptor.idVendor,
dev->descriptor.idProduct);
}
if(dev->descriptor.idVendor == VENDOR_ID &&
dev->descriptor.idProduct == PRODUCT_ID) {
if(debug) {
printf("Found deviceNum %d\n", n);
}
if(n == deviceNum) {
return TemperCreate(dev, timeout, debug);
}
n++;
}
}
}
return NULL;
}

void
TemperFree(Temper *t)
{
if(t) {
if(t->handle) {
usb_close(t->handle);
}
free(t);
}
}

static int
TemperSendCommand(Temper *t, int a, int b, int c, int d, int e, int f, int g, int h)
{
unsigned char buf[32];
int ret;

bzero(buf, 32);
buf[0] = a;
buf[1] = b;
buf[2] = c;
buf[3] = d;
buf[4] = e;
buf[5] = f;
buf[6] = g;
buf[7] = h;

if(t->debug) {
printf("sending bytes %d, %d, %d, %d, %d, %d, %d, %d\n",
a, b, c, d, e, f, g, h);
}

ret = usb_control_msg(t->handle, 0x21, 9, 0x200, 0x01,
(char *) buf, 32, t->timeout);
if(ret != 32) {
perror("usb_control_msg failed");
return -1;
}
return 0;
}

static int
TemperGetData(Temper *t, char *buf, int len)
{
int ret;

return usb_control_msg(t->handle, 0xa1, 1, 0x300, 0x01,
(char *) buf, len, t->timeout);
}

int
TemperGetTemperatureInC(Temper *t, float *tempC)
{
char buf[256];
int ret, temperature, i;

TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 2, 0);
TemperSendCommand(t, 0x54, 0, 0, 0, 0, 0, 0, 0);
for(i = 0; i < 7; i++) {
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
}
TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 1, 0);
ret = TemperGetData(t, buf, 256);
if(ret < 2) {
return -1;
}

temperature = (buf[1] & 0xFF) + (buf[0] << 8);
temperature += 1152; // calibration value
*tempC = temperature * (125.0 / 32000.0);
return 0;
}

int
TemperGetOtherStuff(Temper *t, char *buf, int length)
{
TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 2, 0);
TemperSendCommand(t, 0x52, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 1, 0);
return TemperGetData(t, buf, length);
}


#ifdef UNIT_TEST

#define USB_TIMEOUT 1000 /* milliseconds */

int
main(void)
{
Temper *t;
char buf[256];
int i, ret;

usb_set_debug(0);
usb_init();
usb_find_busses();
usb_find_devices();

t = TemperCreateFromDeviceNumber(0, USB_TIMEOUT, 1);
if(!t) {
perror("TemperCreate");
exit(-1);
}

/*
TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 2, 0);
TemperSendCommand(t, 0x43, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
*/

bzero(buf, 256);
ret = TemperGetOtherStuff(t, buf, 256);
printf("Other Stuff (%d bytes):\n", ret);
for(i = 0; i < ret; i++) {
printf(" %02x", buf[i] & 0xFF);
if(i % 16 == 15) {
printf("\n");
}
}
printf("\n");

for(;;) {
float tempc;

if(TemperGetTemperatureInC(t, &tempc) < 0) {
perror("TemperGetTemperatureInC");
exit(1);
}
printf("temperature %.2fF %.2fC\n", (9.0 / 5.0 * tempc + 32.0),
tempc);
sleep(10);
}
return 0;
}

#endif

temper.h


#ifndef TEMPER_H
#define TEMPER_H

typedef struct Temper Temper;


Temper *TemperCreateFromDeviceNumber(int deviceNum, int timeout, int debug);
void TemperFree(Temper *t);

int TemperGetTemperatureInC(Temper *t, float *tempC);
int TempterGetOtherStuff(Temper *t, char *buf, int length);

#endif

Xaratroom
02-06-2010, 13:57
Ho aggiunto delle modifiche a temper.c:


#include <stdio.h>
#include <string.h>
#include <usb.h>
#include <errno.h>
#include "temper.h"

#define VENDOR_ID 0x1130
#define PRODUCT_ID 0x660c

struct Temper {
struct usb_device *device;
usb_dev_handle *handle;
int debug;
int timeout;
};

Temper *
TemperCreate(struct usb_device *dev, int timeout, int debug)
{
Temper *t;
int ret;

t = calloc(1, sizeof(*t));
t->device = dev;
t->debug = debug;
t->timeout = timeout;
t->handle = usb_open(t->device);
if(!t->handle) {
free(t);
return NULL;
}
if(t->debug) {
printf("Trying to detach kernel driver\n");
}

ret = usb_detach_kernel_driver_np(t->handle, 0);
if(ret) {
if(errno == ENODATA) {
if(t->debug) {
printf("Device already detached\n");
}
} else {
if(t->debug) {
printf("Detach failed: %s[%d]\n",
strerror(errno), errno);
printf("Continuing anyway\n");
}
}
} else {
if(t->debug) {
printf("detach successful\n");
}
}
ret = usb_detach_kernel_driver_np(t->handle, 1);
if(ret) {
if(errno == ENODATA) {
if(t->debug)
printf("Device already detached\n");
} else {
if(t->debug) {
printf("Detach failed: %s[%d]\n",
strerror(errno), errno);
printf("Continuing anyway\n");
}
}
} else {
if(t->debug) {
printf("detach successful\n");
}
}

if(usb_set_configuration(t->handle, 1) < 0 ||
usb_claim_interface(t->handle, 0) < 0 ||
usb_claim_interface(t->handle, 1)) {
usb_close(t->handle);
free(t);
return NULL;
}
return t;
}

Temper *
TemperCreateFromDeviceNumber(int deviceNum, int timeout, int debug)
{
struct usb_bus *bus;
int n;

n = 0;
for(bus=usb_get_busses(); bus; bus=bus->next) {
struct usb_device *dev;

for(dev=bus->devices; dev; dev=dev->next) {
if(debug) {
printf("Found device: %04x:%04x\n",
dev->descriptor.idVendor,
dev->descriptor.idProduct);
}
if(dev->descriptor.idVendor == VENDOR_ID &&
dev->descriptor.idProduct == PRODUCT_ID) {
if(debug) {
printf("Found deviceNum %d\n", n);
}
if(n == deviceNum) {
return TemperCreate(dev, timeout, debug);
}
n++;
}
}
}
return NULL;
}

void
TemperFree(Temper *t)
{
if(t) {
if(t->handle) {
usb_close(t->handle);
}
free(t);
}
}

static int
TemperSendCommand(Temper *t, int a, int b, int c, int d, int e, int f, int g, int h)
{
unsigned char buf[32];
int ret;

bzero(buf, 32);
buf[0] = a;
buf[1] = b;
buf[2] = c;
buf[3] = d;
buf[4] = e;
buf[5] = f;
buf[6] = g;
buf[7] = h;

if(t->debug) {
printf("sending bytes %d, %d, %d, %d, %d, %d, %d, %d\n",
a, b, c, d, e, f, g, h);
}

ret = usb_control_msg(t->handle, 0x21, 9, 0x200, 0x01,
(char *) buf, 32, t->timeout);
if(ret != 32) {
perror("usb_control_msg failed");
return -1;
}
return 0;
}

static int
TemperGetData(Temper *t, char *buf, int len)
{
int ret;

return usb_control_msg(t->handle, 0xa1, 1, 0x300, 0x01,
(char *) buf, len, t->timeout);
}

int
TemperGetTemperatureInC(Temper *t, float *tempC)
{
char buf[256];
int ret, temperature, i;

TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 2, 0);
TemperSendCommand(t, 0x54, 0, 0, 0, 0, 0, 0, 0);
for(i = 0; i < 7; i++) {
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
}
TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 1, 0);
ret = TemperGetData(t, buf, 256);
if(ret < 2) {
return -1;
}

temperature = (buf[1] & 0xFF) + (buf[0] << 8);
temperature += 1152; // calibration value
*tempC = temperature * (125.0 / 32000.0);
return 0;
}

int
TemperGetOtherStuff(Temper *t, char *buf, int length)
{
TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 2, 0);
TemperSendCommand(t, 0x52, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 1, 0);
return TemperGetData(t, buf, length);
}


#ifdef UNIT_TEST

#define USB_TIMEOUT 1000 /* milliseconds */

int
main(int argc, char* argv[])
{
Temper *t;
char buf[256];
int i, ret;
FILE *log;

usb_set_debug(0);
usb_init();
usb_find_busses();
usb_find_devices();

t = TemperCreateFromDeviceNumber(0, USB_TIMEOUT, 1);
if(!t) {
perror("TemperCreate");
exit(-1);
}

/*
TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 2, 0);
TemperSendCommand(t, 0x43, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0);
*/

bzero(buf, 256);
ret = TemperGetOtherStuff(t, buf, 256);
printf("Other Stuff (%d bytes):\n", ret);
for(i = 0; i < ret; i++) {
printf(" %02x", buf[i] & 0xFF);
if(i % 16 == 15) {
printf("\n");
}
}
printf("\n");

for(;images/smilies/blink.gif {
float tempc;

if(TemperGetTemperatureInC(t, &tempc) < 0) {
perror("TemperGetTemperatureInC");
exit(1);
}

//Salvo in un file di log se presente un file name valido in argv[1]
if (argc == 2) {
log = fopen (argv[1], "a");
if (log != NULL) {
fprintf(log, "temperature %.2fF %.2fC\n", (9.0 / 5.0 * tempc + 32.0), tempc);
fclose(log);
}
}

printf("temperature %.2fF %.2fC\n", (9.0 / 5.0 * tempc + 32.0),
tempc);
sleep(10);
}
return 0;
}

#endif


Prova a ricompilare e ad avviare il programma in questo modo:


./prog file.log

Aggiungerà automaticamente l'ultima linea (quella della temperatura) nel file di log (file.log).
Se non specifichi il parametro (oppure fornisci un filename non valido) il programma funziona come prima.

EDIT: mi sono accorto che il codice è un po' incasinato per qualche errore di paste.
Ho aggiunto:


//Salvo in un file di log se presente un file name valido in argv[1]
if (argc == 2) {
log = fopen (argv[1], "a");
if (log != NULL) {
fprintf(log, "temperature %.2fF %.2fC\n", (9.0 / 5.0 * tempc + 32.0), tempc);
fclose(log);
}
}

Prima della linea:


printf("temperature %.2fF %.2fC\n", (9.0 / 5.0 * tempc + 32.0),
tempc);

E ho aggiunto:


FILE *log;

Dopo la linea:


int i, ret;

satwanted
02-06-2010, 15:47
azzz..... come vorrei conoscerlo anche io cosi.....

procedo così :
sudo make clean
sudo make

e ricevo

cc -DUNIT_TEST -o temper temper.c -lusb
temper.c:3:17: error: usb.h: Nessun file o directory
temper.c:12: error: expected specifier-qualifier-list before ‘usb_dev_handle’
temper.c: In function ‘TemperCreate’:
temper.c:23: warning: incompatible implicit declaration of built-in function ‘calloc’
temper.c:25: error: ‘Temper’ has no member named ‘debug’
temper.c:26: error: ‘Temper’ has no member named ‘timeout’
temper.c:27: error: ‘Temper’ has no member named ‘handle’
temper.c:28: error: ‘Temper’ has no member named ‘handle’
temper.c:29: warning: incompatible implicit declaration of built-in function ‘free’
temper.c:32: error: ‘Temper’ has no member named ‘debug’
temper.c:36: error: ‘Temper’ has no member named ‘handle’
temper.c:39: error: ‘Temper’ has no member named ‘debug’
temper.c:43: error: ‘Temper’ has no member named ‘debug’
temper.c:50: error: ‘Temper’ has no member named ‘debug’
temper.c:54: error: ‘Temper’ has no member named ‘handle’
temper.c:57: error: ‘Temper’ has no member named ‘debug’
temper.c:60: error: ‘Temper’ has no member named ‘debug’
temper.c:67: error: ‘Temper’ has no member named ‘debug’
temper.c:72: error: ‘Temper’ has no member named ‘handle’
temper.c:73: error: ‘Temper’ has no member named ‘handle’
temper.c:74: error: ‘Temper’ has no member named ‘handle’
temper.c:75: error: ‘Temper’ has no member named ‘handle’
temper.c:76: warning: incompatible implicit declaration of built-in function ‘free’
temper.c: In function ‘TemperCreateFromDeviceNumber’:
temper.c:89: warning: assignment makes pointer from integer without a cast
temper.c:89: error: dereferencing pointer to incomplete type
temper.c:92: error: dereferencing pointer to incomplete type
temper.c:92: error: dereferencing pointer to incomplete type
temper.c:95: error: dereferencing pointer to incomplete type
temper.c:96: error: dereferencing pointer to incomplete type
temper.c:98: error: dereferencing pointer to incomplete type
temper.c:99: error: dereferencing pointer to incomplete type
temper.c: In function ‘TemperFree’:
temper.c:117: error: ‘Temper’ has no member named ‘handle’
temper.c:118: error: ‘Temper’ has no member named ‘handle’
temper.c:120: warning: incompatible implicit declaration of built-in function ‘free’
temper.c: In function ‘TemperSendCommand’:
temper.c:140: error: ‘Temper’ has no member named ‘debug’
temper.c:145: error: ‘Temper’ has no member named ‘handle’
temper.c:146: error: ‘Temper’ has no member named ‘timeout’
temper.c: In function ‘TemperGetData’:
temper.c:159: error: ‘Temper’ has no member named ‘handle’
temper.c:160: error: ‘Temper’ has no member named ‘timeout’
temper.c: In function ‘main’:
temper.c:216: warning: incompatible implicit declaration of built-in function ‘exit’
temper.c:241: error: expected expression before ‘<’ token
temper.c:263: error: expected expression before ‘}’ token
temper.c:263: error: expected expression before ‘}’ token
make: *** [temper] Errore 1



provo a compilare con

sudo gcc -o temper-mod temper.c
e ricevo

temper.c:3:17: error: usb.h: Nessun file o directory
temper.c:12: error: expected specifier-qualifier-list before ‘usb_dev_handle’
temper.c: In function ‘TemperCreate’:
temper.c:23: warning: incompatible implicit declaration of built-in function ‘calloc’
temper.c:25: error: ‘Temper’ has no member named ‘debug’
temper.c:26: error: ‘Temper’ has no member named ‘timeout’
temper.c:27: error: ‘Temper’ has no member named ‘handle’
temper.c:28: error: ‘Temper’ has no member named ‘handle’
temper.c:29: warning: incompatible implicit declaration of built-in function ‘free’
temper.c:32: error: ‘Temper’ has no member named ‘debug’
temper.c:36: error: ‘Temper’ has no member named ‘handle’
temper.c:39: error: ‘Temper’ has no member named ‘debug’
temper.c:43: error: ‘Temper’ has no member named ‘debug’
temper.c:50: error: ‘Temper’ has no member named ‘debug’
temper.c:54: error: ‘Temper’ has no member named ‘handle’
temper.c:57: error: ‘Temper’ has no member named ‘debug’
temper.c:60: error: ‘Temper’ has no member named ‘debug’
temper.c:67: error: ‘Temper’ has no member named ‘debug’
temper.c:72: error: ‘Temper’ has no member named ‘handle’
temper.c:73: error: ‘Temper’ has no member named ‘handle’
temper.c:74: error: ‘Temper’ has no member named ‘handle’
temper.c:75: error: ‘Temper’ has no member named ‘handle’
temper.c:76: warning: incompatible implicit declaration of built-in function ‘free’
temper.c: In function ‘TemperCreateFromDeviceNumber’:
temper.c:89: warning: assignment makes pointer from integer without a cast
temper.c:89: error: dereferencing pointer to incomplete type
temper.c:92: error: dereferencing pointer to incomplete type
temper.c:92: error: dereferencing pointer to incomplete type
temper.c:95: error: dereferencing pointer to incomplete type
temper.c:96: error: dereferencing pointer to incomplete type
temper.c:98: error: dereferencing pointer to incomplete type
temper.c:99: error: dereferencing pointer to incomplete type
temper.c: In function ‘TemperFree’:
temper.c:117: error: ‘Temper’ has no member named ‘handle’
temper.c:118: error: ‘Temper’ has no member named ‘handle’
temper.c:120: warning: incompatible implicit declaration of built-in function ‘free’
temper.c: In function ‘TemperSendCommand’:
temper.c:140: error: ‘Temper’ has no member named ‘debug’
temper.c:145: error: ‘Temper’ has no member named ‘handle’
temper.c:146: error: ‘Temper’ has no member named ‘timeout’
temper.c: In function ‘TemperGetData’:
temper.c:159: error: ‘Temper’ has no member named ‘handle’
temper.c:160: error: ‘Temper’ has no member named ‘timeout’

ah ...mi erodimenticato... se avvio il programma

sudo ./temper

funziona regolarmente ma non scrive nel file.log

Xaratroom
02-06-2010, 17:22
Ma prima che eseguissi le modifiche riuscivi a compilarlo ?

Loading