[Vc++] Come accedo a questa variabile?
Non sono per niente esperto in c++ ma mi serverebbe fare una elaborazione di una variabile ma non riesco ad accederci.
Il programma accede ad una periferia usb dove è attaccato un accelerometro:
Qui c'è il file .pdf dove sono spiegate le API (http://www.phidgets.com/downloads.php?example_id=17)
Praticamente sto cercando di accedere a Value dove credo vengano immagazzinati i dati, ma non ci riesco. In rosso ho segnato la funzione in questione.
Il programma accede ad una periferia usb dove è attaccato un accelerometro:
#include "stdafx.h"
#include "..\..\..\phidget21.h"
double past_samples[3];
//callback that will run if the Accelerometer is attached to the computer
int __stdcall AttachHandler(CPhidgetHandle IFK, void *userptr)
{
int serialNo;
//questa funzione immette in serialNO il numero di serie dello strumento collegato
CPhidget_getSerialNumber(IFK, &serialNo);
printf("Accelerometer %10d attached!\n\n", serialNo);
return 0;
}
//callback that will run if the Accelerometer is detached from the computer
int __stdcall DetachHandler(CPhidgetHandle IFK, void *userptr)
{
int serialNo;
CPhidget_getSerialNumber(IFK, &serialNo);
printf("Accelerometer %10d detached! \n", serialNo);
return 0;
}
//callback that will run if the Accelerometer generates an error
int __stdcall ErrorHandler(CPhidgetHandle IFK, void *userptr, int ErrorCode, const char *unknown)
{
printf("Error handled. %d - %s \n", ErrorCode, unknown);
return 0;
}
//callback that will run if the acceleration changes by more than the Acceleration trigger.
//Index - Index of the axis that is generating the event, Value - the value read by the accelerometer axis
[color=red]int __stdcall accel_AccelChangeHandler(CPhidgetAccelerometerHandle WGT, void *userptr, int Index, double Value)
{
printf("Axis: %i -- %6f\n", Index, Value);
return 0;
}[/color]
//Display the properties of the attached phidget to the screen.
//We will be displaying the name, serial number, version of the attached device and number of Axes on the accelerometer.
int display_properties(CPhidgetHandle phid)
{
int serialNo, version;
const char* ptr;
int numAxes;
//Ritorna il tipo di dispositivo
CPhidget_getDeviceType(phid, &ptr);
//Ritorna il numero di serie
CPhidget_getSerialNumber(phid, &serialNo);
//Ritorna la versione
CPhidget_getDeviceVersion(phid, &version);
//Ritorna il numero di assi
CPhidgetAccelerometer_getAxisCount((CPhidgetAccelerometerHandle)phid, &numAxes);
printf("%s\n", ptr);
printf("Serial Number: %10d\nVersion: %8d\n", serialNo, version);
printf("Number of Axes: %i\n", numAxes);
return 0;
}
int accelerometer_simple()
{
int result, numAxes;
const char *err;
//Declare an accelerometer handle
CPhidgetAccelerometerHandle accel = 0;
//create the accelerometer object
//Mette nell'indirizzo di memoria di accel l'accelerometro collegato
CPhidgetAccelerometer_create(&accel);
//Set the handlers to be run when the device is plugged in or opened from software, unplugged or closed from software, or generates an error.
CPhidget_set_OnAttach_Handler((CPhidgetHandle)accel, AttachHandler, NULL);
CPhidget_set_OnDetach_Handler((CPhidgetHandle)accel, DetachHandler, NULL);
CPhidget_set_OnError_Handler((CPhidgetHandle)accel, ErrorHandler, NULL);
//open the acclerometer for device connections
//Impostando -1 apre il primo dispositivo disponibile
CPhidget_open((CPhidgetHandle)accel, -1);
//get the program to wait for an accelerometer device to be attached
printf("Waiting for accelerometer to be attached.... \n\n");
//Aspetta 10 secondi che venga connesso il dispositivo
if((result = CPhidget_waitForAttachment((CPhidgetHandle)accel, 10000)))
{
CPhidget_getErrorDescription(result, &err);
printf("Problem waiting for attachment: %s\n", err);
//Interruzione, spingere invio per continuare
getchar();
return 0;
}
//Display the properties of the attached accelerometer device
display_properties((CPhidgetHandle)accel);
//read accelerometer event data
printf("Reading.....\n\n");
//get the number of available axes on the attached accelerometer
CPhidgetAccelerometer_getAxisCount(accel, &numAxes);
//Most accelerometers have 2 axes so we'll pre-set their sensitivity to make the data more readable
//Il primo valore è il dispositivo, il secondo l'indice degli assi e il terzo è la sensibilità
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 0, 0.500);
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 1, 0.500);
//If the accelerometer attached is a 3-axis, we'll set the sensitivity of the 3rd axis
if(numAxes > 2)
{
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 2, 0.500);
}
//Registers a callback that will run if the acceleration changes by more than the Acceleration trigger.
//Requires the handle for the Accelerometer, the function that will be called,
//and an arbitrary pointer that will be supplied to the callback function (may be NULL)
CPhidgetAccelerometer_set_OnAccelerationChange_Handler(accel, accel_AccelChangeHandler, NULL);
//Interruzione
getchar();
//wait until user input is read
printf("Press any key to end\n");
//since user input has been read, this is a signal to terminate the program so we will close the phidget and delete the object we created
printf("Closing...\n");
CPhidget_close((CPhidgetHandle)accel);
CPhidget_delete((CPhidgetHandle)accel);
//Interruzione
getchar();
//all done, exit
return 0;
}
//main entry point to the program
int _tmain(int argc, _TCHAR* argv[])
{
accelerometer_simple();
return 0;
}
Qui c'è il file .pdf dove sono spiegate le API (http://www.phidgets.com/downloads.php?example_id=17)
Praticamente sto cercando di accedere a Value dove credo vengano immagazzinati i dati, ma non ci riesco. In rosso ho segnato la funzione in questione.
Risposte
è possibile per esempio aprire in un progetto due file .cpp e spostare i dati contenuti in una variabile da un sorgente all'altro?
riporto solo il codice essenziale:
Il problema è che una volta che entra nella funzione accel_AccelChangeHandler non esce più e aspetta sempre una variazione di accelerazione per stamparla a video, e l'unico modo che ho di uscire da quella funzione è con il getchar() rosso.
Inizialmente avevo pensato di usare fstream e salvare i dati su un file e infatti ci riesco, ma io devo accedere in real time ai dati e lavorarci subito e quindi non è il metodo migliore.
#include "stdafx.h"
#include "phidget21.h"
//callback that will run if the acceleration changes by more than the Acceleration trigger.
//Index - Index of the axis that is generating the event, Value - the value read by the accelerometer axis
int __stdcall accel_AccelChangeHandler(CPhidgetAccelerometerHandle WGT, void *userptr, int Index, double Value)
{
printf("Axis: %i %6f\n", Index, Value);
return 0;
}
//main entry point to the program
int _tmain(int argc, _TCHAR* argv[])
{
int result;
const char *err;
//Declare an accelerometer handle
CPhidgetAccelerometerHandle accel = 0;
//create the accelerometer object
CPhidgetAccelerometer_create(&accel);
//Impostando -1 apre il primo dispositivo disponibile
CPhidget_open((CPhidgetHandle)accel, -1);
//get the program to wait for an accelerometer device to be attached
printf("Waiting for accelerometer to be attached.... \n\n");
//Aspetta 10 secondi che venga connesso il dispositivo
if((result = CPhidget_waitForAttachment((CPhidgetHandle)accel, 10000)))
{ CPhidget_getErrorDescription(result, &err);
printf("Problem waiting for attachment: %s\n", err);
//Interruzione, spingere invio per continuare
getchar();
return 0;}
//Imposta la sensibilità
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 0, 0.500);
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 1, 0.500);
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 2, 0.500);
//Registra un evento se l'accelerazione cambia oltre una certa soglia.
CPhidgetAccelerometer_set_OnAccelerationChange_Handler(accel, accel_AccelChangeHandler, NULL);
[color=red]//Interruzione
getchar(); [/color]
//Chiude il dispositivo e l'oggetto
printf("Closing...\n");
CPhidget_close((CPhidgetHandle)accel);
CPhidget_delete((CPhidgetHandle)accel);
//Interruzione
getchar();
return 0;
}
Il problema è che una volta che entra nella funzione accel_AccelChangeHandler non esce più e aspetta sempre una variazione di accelerazione per stamparla a video, e l'unico modo che ho di uscire da quella funzione è con il getchar() rosso.
Inizialmente avevo pensato di usare fstream e salvare i dati su un file e infatti ci riesco, ma io devo accedere in real time ai dati e lavorarci subito e quindi non è il metodo migliore.