Difference between revisions of "Oresat-notes"

From Wiki at Neela Nurseries
Jump to: navigation, search
m (^ Virtual Methods Table VMT)
Line 1: Line 1:
  
 
__TOC__
 
__TOC__
 +
 +
 +
Putting together an Oresat device driver type object, realized in C, starting with <code>devp</code>:
 +
 +
112 void tmp101Start(TMP101Driver *devp, const TMP101Config *config) {
 +
 +
Object <code>devp</code> is a pointer to an object/data structure of type TMP101Driver.  TMP101Driver and TMP101config are defined as:
 +
 +
{| class="wikitable"
 +
|-
 +
! scope="col" style="min-width: 250px; max-width: 300px;" | 1 <!-- style="width: 250px;" -->
 +
! scope="col" style="min-width: 250px; max-width: 300px;" | 2
 +
 +
|-
 +
| style="vertical-align: top;" |
 +
<pre>
 +
struct TMP101Driver {
 +
    /** @brief Virtual Methods Table.*/
 +
    const struct TMP101VMT    *vmt; 
 +
    _tmp101_data
 +
};
 +
</pre>
 +
|
 +
<pre>
 +
/**
 +
* @brief  TMP101 configuration structure.
 +
*/
 +
typedef struct {
 +
#if (TMP101_USE_I2C) || defined(__DOXYGEN__)
 +
    /**
 +
    * @brief I2C driver associated with this TMP101.
 +
    */
 +
    I2CDriver                  *i2cp;
 +
    /**
 +
    * @brief I2C configuration associated with this TMP101.
 +
    */
 +
    const I2CConfig            *i2ccfg;
 +
    /**
 +
    * @brief TMP101 Slave Address
 +
    */
 +
    i2caddr_t                  saddr;
 +
#endif /* TMP101_USE_I2C */
 +
    /**
 +
    * @brief TMP101 configuration reg value
 +
    */
 +
    uint16_t                    cfg;
 +
 +
} TMP101Config;
 +
</pre>
 +
|}
 +
 +
  
  

Revision as of 06:12, 8 February 2021


Putting together an Oresat device driver type object, realized in C, starting with devp:

112 void tmp101Start(TMP101Driver *devp, const TMP101Config *config) {

Object devp is a pointer to an object/data structure of type TMP101Driver. TMP101Driver and TMP101config are defined as:

1 2
struct TMP101Driver {
    /** @brief Virtual Methods Table.*/
    const struct TMP101VMT     *vmt;   
    _tmp101_data
};
/**
 * @brief   TMP101 configuration structure.
 */
typedef struct {
#if (TMP101_USE_I2C) || defined(__DOXYGEN__)
    /**
     * @brief I2C driver associated with this TMP101. 
     */
    I2CDriver                   *i2cp;
    /**
     * @brief I2C configuration associated with this TMP101. 
     */
    const I2CConfig             *i2ccfg;
    /**
     * @brief TMP101 Slave Address 
     */
    i2caddr_t                   saddr;
#endif /* TMP101_USE_I2C */
    /**
     * @brief TMP101 configuration reg value
     */
    uint16_t                    cfg;

} TMP101Config;



Note) Looks like a command shell is realized in code near end of file:

   psas/oresat-firmware/src/f4/app_control/source/command.c


Note) ina226.c and other device type driver source files in 'psas/oresat-firmware/common' give examples of I2C calls in ChibiOS environment.

INA226_SHARED_I2C


References:

  *  https://www.playembedded.org/blog/stm32-i2c-chibios/


Note)  Example file which calls an I2C init function among other things, in routine app_init():

 oresat-firmware/src$ vi ./archive/f0/app_solardemo/main.c

   /*
 * I2C configuration
 */
static const I2CConfig i2cfg1 =
{
    I2C_100KHZ_TIMINGR,
    0,
    0,
};

uint8_t data[8];

static void app_init(void) {
    //=== App initialization

    // Start up debug output
    sdStart(&SD2, &ser_cfg);

    i2cInit();
    i2cStart(&I2CD1, &i2cfg1);

    for (uint8_t i = 0; i < 8; ++i) {
        data[i] = 0;
    }

    canTPDOObjectInit(CAN_PDO_1, CAN_ID_DEFAULT, 0, 0, 8, data);
}


Note)  pointer *devp is of type INA226Driver, where is this defined?

   185 /**
   186  * @brief   Sets INA226 Alert type and value
   187  *
   188  * @param[in] devp       pointer to the @p INA226Driver object
   189  * @param[in] alert_me   the value to write to Mask/Enable register (0 to disable)
   190  * @param[in] alert_lim  the value to write to Alert Limit register
   191  *
   192  * @api
   193  */
   194 void ina226SetAlert(INA226Driver *devp, uint16_t alert_me, uint16_t alert_lim) {
   195     i2cbuf_t buf;
   196 
   197     osalDbgCheck(devp != NULL);
   198     osalDbgAssert(devp->state == INA226_READY,
   199             "ina226SetAlert(), invalid state");


Note) Device states for INA226 enumerated as follows:

:~/projects/psas/oresat-firmware/common/include$ grep -nr -A 2 -B 2 INA226_STOP ./*
./ina226.h-277-typedef enum {
./ina226.h-278-    INA226_UNINIT = 0,                  /**< Not initialized.                 */
./ina226.h:279:    INA226_STOP = 1,                    /**< Stopped.                         */
./ina226.h-280-    INA226_READY = 2,                   /**< Ready.                           */
./ina226.h-281-} ina226_state_t;


^ Virtual Methods Table VMT

So there's this idea and reference to virtual methods table data structures in ina226.h and .c. In ina226.h *vmt</vmt> is defined as being:

    326 /**
    327  * @extends BaseObjectVMT
    328  *
    329  * @brief   @p INA226 virtual methods table.
    330  */
    331 struct INA226VMT {
    332     _ina226_methods
    333 };
  .
  .
  .
    345 /**
    346  * @brief INA226 Power Monitor class.
    347  */
    348 struct INA226Driver {
    349     /** @brief Virtual Methods Table.*/
    350     const struct INA226VMT     *vmt;
    351     _ina226_data
    352 };


In file oresat-firmware/ext/ChibiOS/os/hal/include/hal_objects.h:

     39 #define _base_object_methods                                                \^M
     40   /* Instance offset, used for multiple inheritance, normally zero. It^M
     41      represents the offset between the current object and the container^M
     42      object*/                                                               \^M
     43   size_t instance_offset;^M
     44 ^M

     45 /**^M
     46  * @brief   @p BaseObject specific data.^M
     47  * @note    This object defines no data.^M
     48  */^M
     49 #define _base_object_data^M
     50 ^M
     51 /**^M
     52  * @brief   @p BaseObject virtual methods table.^M
     53  */^M
     54 struct BaseObjectVMT {^M
     55   _base_object_methods^M
     56 };^M
     57 ^M
     58 /**^M
     59  * @brief   Base stream class.^M
     60  * @details This class represents a generic blocking unbuffered sequential^M
     61  *          data stream.^M
     62  */^M
     63 typedef struct {^M
     64   /** @brief Virtual Methods Table.*/^M
     65   const struct BaseObjectVMT *vmt;^M
     66   _base_object_data^M
     67 } BaseObject;^M