Macro, structure, fonction
Bonjour, en ce moment je travaille sur un projet dans lequel j'essaye d'utiliser un capteur de proximité le VL6180X, j'ai récupéré l'API sur st.com et comme a mon habitude j'essaye de comprendre le code en mode debugger...
Il y a une partie que j'ai du mal a comprendre et c'est pour cette raison que je viens sur le forum afin de trouver une ou plusieurs âmes charitable...
Donc je pars de cette fonction:
Code:
1 2 3
| #ifdef VL6180x_HAVE_UPSCALE_DATA
VL6180xDevDataSet(dev, UpscaleFactor, DEF_UPSCALE);
#endif |
les trois arguments sont respectivement l'adresse du device - le paramètre a activer - la valeur du paramètre
Plus haut dans le code on retrouve la mm fonction mais en #define:
Code:
1 2 3 4 5
| #if VL6180x_SINGLE_DEVICE_DRIVER
extern struct VL6180xDevData_t SingleVL6180xDevData;
#define VL6180xDevDataGet(dev, field) (SingleVL6180xDevData.field)
#define VL6180xDevDataSet(dev, field, data) SingleVL6180xDevData.field = (data)
#endif |
VL6180x_SINGLE_DEVICE_DRIVER est bien défini a 1 dans mon code donc on exécute cette condition. Par contre je ne comprends pas ce que le define fait par exemple a la ligne 4 "#define VL6180xDevDataSet(dev, field, data) SingleVL6180xDevData.field = (data)"?
Comme on peut le voir dans le morceau de code précédent SingleVL6180xDevData est une structure externe:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| /**
* @struct VL6180xDevData_t
*
* @brief Per VL6180x device St private data structure \n
* End user should never access any of these field directly
*
* These must never access directly but only via VL6180xDev/SetData(dev, field) macro
*/
struct VL6180xDevData_t {
uint32_t Part2PartAmbNVM; /*!< backed up NVM value */
uint32_t XTalkCompRate_KCps; /*! Cached XTlak Compensation Rate */
uint16_t EceFactorM; /*!< Ece Factor M numerator */
uint16_t EceFactorD; /*!< Ece Factor D denominator*/
struct RangeIgnoreData_t RangeIgnore;
#ifdef VL6180x_HAVE_ALS_DATA
uint16_t IntegrationPeriod; /*!< cached als Integration period avoid slow read from device at each measure */
uint16_t AlsGainCode; /*!< cached Als gain avoid slow read from device at each measure */
uint16_t AlsScaler; /*!< cached Als scaler avoid slow read from device at each measure */
#endif
#ifdef VL6180x_HAVE_UPSCALE_DATA
uint8_t UpscaleFactor; /*!< up-scaling factor*/
#endif
#ifdef VL6180x_HAVE_WRAP_AROUND_DATA
uint8_t WrapAroundFilterActive; /*!< Filter on/off */
struct FilterData_t FilterData; /*!< Filter internal data state history ... */
#endif
#if VL6180x_CACHED_REG
uint8_t CacheFilled; /*!< Set if valid data got fetched use to control when to fill up register cache */
uint8_t CachedRegs[VL6180x_CACHED_REG_CNT]; /*!< Cache register storage */
#endif
#if VL6180x_HAVE_DMAX_RANGING
struct DMaxData_t DMaxData;
uint8_t DMaxEnable;
#endif
int8_t Part2PartOffsetNVM; /*!< backed up NVM value */
}; |
Bon ok on lit dans les commentaires qu'il ne faut pas attaquer directement cette structure mais plutot utiliser la macro VL6180xDev/SetData(dev, field) bon on est content mais pas plus avancé pour comprendre ce code...
Pour résumer j'essaye surtout de comprendre ce que fait:
Code:
1 2
| #define VL6180xDevDataGet(dev, field) (SingleVL6180xDevData.field)
#define VL6180xDevDataSet(dev, field, data) SingleVL6180xDevData.field = (data) |
Merci pour votre aide.