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 C : Sélectionner tout - Visualiser dans une fenêtre à part
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 C : Sélectionner tout - Visualiser dans une fenêtre à part
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 C : Sélectionner tout - Visualiser dans une fenêtre à part
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 C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #define VL6180xDevDataGet(dev, field) (SingleVL6180xDevData.field) #define VL6180xDevDataSet(dev, field, data) SingleVL6180xDevData.field = (data)
Merci pour votre aide.
Partager