botsense  3.2.0
RoadNarrows Client-Server Proxied Services Framework
bsI2CServer.c File Reference

BotSense bsProxy server plug-in DLL I2C bus device module. More...

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "rnr/rnrconfig.h"
#include "rnr/log.h"
#include "rnr/new.h"
#include "rnr/netmsgs.h"
#include "rnr/i2c.h"
#include "botsense/BotSense.h"
#include "botsense/libBotSense.h"
#include "botsense/bsProxyModIF.h"
#include "botsense/bsI2C.h"
#include "botsense/bsI2CMsgs.h"

Go to the source code of this file.

Classes

struct  BsModCtlBlk_T
 Module resource control block structure type. More...
 

Macros

#define BSMOD_MAX_HANDLES   32
 Maximum number of module supported simultaneous virtual connections.
 

Functions

static BsModCtlBlk_TbsModCtlBlkNew (const char *sDevUri, bool_t bTrace)
 Allocate a new resource control block. More...
 
static void bsModCtlBlkDelete (BsModCtlBlk_T *pCtlBlk)
 Delete an allocated resource control block. More...
 
static BsModCtlBlk_TbsModCtlBlkFind (const char *sDevUri)
 Find an already allocated resource control block. More...
 
static int bsModI2CReqRead (BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
 Service a I2C read request. More...
 
static int bsModI2CReqWrite (BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
 Service a I2C write request. More...
 
static int bsModI2CReqTrans (BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
 Service a I2C write-read transaction request. More...
 
static int bsModI2CScanCallback (i2c_t *pHndI2C, i2c_addr_t addr, void *pContext)
 I2C scan callback function. More...
 
static int bsModI2CReqScan (BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
 Service a I2C scan for devices request. More...
 
int bsModInit (const char *sModUri, const BsModProxyCb_T *pCallbacks)
 Initialize I2C module. More...
 
void bsModExit ()
 Exit I2C module. More...
 
int bsModOpen (BsVConnHnd_T hndVConn, bool_t bTrace, const char *sDevUri, byte_t argbuf[], size_t uArgSize)
 Open an I2C device and associate with the given handle. More...
 
int bsModClose (BsVConnHnd_T hndVConn)
 Close the I2C device and disassociate virtual connection handle. More...
 
int bsModRequest (BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
 Service an I2C request. More...
 
int bsModTrace (BsVConnHnd_T hndVConn, bool_t bTrace)
 Enable/disable message tracing on handle. More...
 
const BsModInfo_TbsModInfo ()
 Query for the static module information. More...
 

Variables

static BsModInfo_T BsModInfo
 Module static information. More...
 
static const char * BsModUri
 module canonical name
 
static const BsModProxyCb_TBsModCallbacks
 module to bsProxy callbacks
 
static BsModRsrcTbl_TBsModRsrcTbl
 module resource table
 

Detailed Description

BotSense bsProxy server plug-in DLL I2C bus device module.

LastChangedDate
2010-09-13 10:25:05 -0600 (Mon, 13 Sep 2010)
Rev
581
Author
Robin Knight (robin.nosp@m..kni.nosp@m.ght@r.nosp@m.oadn.nosp@m.arrow.nosp@m.s.co.nosp@m.m)

Definition in file bsI2CServer.c.

Function Documentation

int bsModClose ( BsVConnHnd_T  hndVConn)

Close the I2C device and disassociate virtual connection handle.

The actual device and resources are only cleared if this is the last virtual connection reference to this device.

Parameters
hndVConnVirtual connection handle.
Returns
On success, BS_OK is returned.
On error, the appropriate < 0 negated BotSense Error Code is returned.

Definition at line 782 of file bsI2CServer.c.

References BS_ECODE_INTERNAL, BS_ECODE_NO_VCONN, BS_OK, BSMOD_LOG_ERROR, BSMOD_RSRC_IS_INUSE, BSMOD_TRY_VCONN_HND_RANGE, bsModCtlBlkDelete(), BsModProxyCb_T::m_cbModRsrcRemove, BsModCtlBlk_T::m_hndI2C, and BsModCtlBlk_T::m_uRefCnt.

783 {
784  BsModCtlBlk_T *pCtlBlk;
785 
786  // check if handle is in valid range
787  BSMOD_TRY_VCONN_HND_RANGE(hndVConn);
788 
789  // check is resouce is in-use (i.e. opened)
790  if( !BSMOD_RSRC_IS_INUSE(BsModRsrcTbl, hndVConn) )
791  {
793  "Resources for virtual connection not found.");
794  return -BS_ECODE_NO_VCONN;
795  }
796 
797  // remove from module's resource table
799  hndVConn);
800 
801  if( pCtlBlk == NULL )
802  {
803  BSMOD_LOG_ERROR(hndVConn, BS_ECODE_INTERNAL, "No module resource found.");
804  return -BS_ECODE_INTERNAL;
805  }
806 
807  //
808  // Closing last reference to device. So really close and free resources.
809  //
810  if( pCtlBlk->m_uRefCnt <= 1 )
811  {
812  i2c_close(&pCtlBlk->m_hndI2C);
813 
814  LOGDIAG2("VConn=%d: i2c_close(fd=%d).", hndVConn, pCtlBlk->m_hndI2C.fd);
815 
816  bsModCtlBlkDelete(pCtlBlk);
817  }
818 
819  // Simply decrement reference count.
820  else
821  {
822  pCtlBlk->m_uRefCnt--;
823  }
824 
825  return BS_OK;
826 }
#define BSMOD_LOG_ERROR(hndVConn, ecode, efmt,...)
Log Interface Module Error.
Definition: bsProxyModIF.h:405
#define BSMOD_RSRC_IS_INUSE(pRsrcTbl, hndVConn)
Test if the resource table resource handle slot is in-use.
Definition: bsProxyModIF.h:169
uint_t m_uRefCnt
reference count to this device
Definition: bsI2CServer.c:105
Module resource control block structure type.
Definition: bsI2CServer.c:103
#define BS_OK
not an error, success
Definition: BotSense.h:66
#define BSMOD_TRY_VCONN_HND_RANGE(hndVConn)
Check if handle is within the range of module handles.
Definition: bsProxyModIF.h:499
i2c_t m_hndI2C
I2C bus handle.
Definition: bsI2CServer.c:106
void *(* m_cbModRsrcRemove)(BsModRsrcTbl_T *pRsrcTbl, BsVConnHnd_T hndVConn)
Remove a resource from the resource table.
Definition: bsProxyModIF.h:320
#define BS_ECODE_INTERNAL
internal error (bug)
Definition: BotSense.h:93
#define BS_ECODE_NO_VCONN
virtual connection not found
Definition: BotSense.h:80
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsI2CServer.c:112
static void bsModCtlBlkDelete(BsModCtlBlk_T *pCtlBlk)
Delete an allocated resource control block.
Definition: bsI2CServer.c:145
static void bsModCtlBlkDelete ( BsModCtlBlk_T pCtlBlk)
static

Delete an allocated resource control block.

Parameters
pCtlBlkPointer to allocated control block.

Definition at line 145 of file bsI2CServer.c.

References BsModCtlBlk_T::m_sDevUri.

Referenced by bsModClose(), bsModExit(), and bsModOpen().

146 {
147  if( pCtlBlk != NULL )
148  {
149  delete((void *)(pCtlBlk->m_sDevUri));
150  delete(pCtlBlk);
151  }
152 }
const char * m_sDevUri
I2C device path name.
Definition: bsI2CServer.c:107
static BsModCtlBlk_T* bsModCtlBlkFind ( const char *  sDevUri)
static

Find an already allocated resource control block.

Parameters
sDevUriDevice URI search parameter.
Returns
If found, returns pointer to matched control block. Else returns NULL.

Definition at line 162 of file bsI2CServer.c.

References BSMOD_MAX_HANDLES, BsModCtlBlk_T::m_sDevUri, and BsModRsrcTbl_T::m_vecRsrc.

Referenced by bsModOpen().

163 {
164  int index;
165  BsModCtlBlk_T *pCtlBlk;
166 
167  // search through modul'es resource table
168  for(index=0; index<BSMOD_MAX_HANDLES; ++index)
169  {
170  if( (pCtlBlk = (BsModCtlBlk_T *)BsModRsrcTbl->m_vecRsrc[index]) != NULL )
171  {
172  if( !strcmp(pCtlBlk->m_sDevUri, sDevUri) )
173  {
174  return pCtlBlk;
175  }
176  }
177  }
178  return NULL;
179 }
Module resource control block structure type.
Definition: bsI2CServer.c:103
const char * m_sDevUri
I2C device path name.
Definition: bsI2CServer.c:107
#define BSMOD_MAX_HANDLES
Maximum number of module supported simultaneous virtual connections.
Definition: bsI2CServer.c:96
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
void ** m_vecRsrc
vecRsrc[index] -> rsrc
Definition: bsProxyModIF.h:139
static BsModCtlBlk_T* bsModCtlBlkNew ( const char *  sDevUri,
bool_t  bTrace 
)
static

Allocate a new resource control block.

Multiple virtual connection to the same I2C device share the same control block.

Parameters
sDevUriDevice URI.
bTraceDo [not] trace messages.
Returns
Pointer to new allocated control block.

Definition at line 127 of file bsI2CServer.c.

References BsModCtlBlk_T::m_bTrace, BsModCtlBlk_T::m_sDevUri, and BsModCtlBlk_T::m_uRefCnt.

Referenced by bsModOpen().

128 {
129  BsModCtlBlk_T *pCtlBlk;
130 
131  pCtlBlk = NEW(BsModCtlBlk_T);
132 
133  pCtlBlk->m_uRefCnt = 0;
134  pCtlBlk->m_sDevUri = new_strdup(sDevUri);
135  pCtlBlk->m_bTrace = bTrace;
136 
137  return pCtlBlk;
138 }
uint_t m_uRefCnt
reference count to this device
Definition: bsI2CServer.c:105
Module resource control block structure type.
Definition: bsI2CServer.c:103
bool_t m_bTrace
do [not] trace messages
Definition: bsI2CServer.c:108
const char * m_sDevUri
I2C device path name.
Definition: bsI2CServer.c:107
void bsModExit ( )

Exit I2C module.

Called once prior to module being unloaded.

All open I2C devices will be closed.

Definition at line 651 of file bsI2CServer.c.

References BSMOD_MAX_HANDLES, bsModCtlBlkDelete(), BsModUri, BsModProxyCb_T::m_cbModRsrcTblDelete, BsModCtlBlk_T::m_hndI2C, BsModCtlBlk_T::m_uRefCnt, and BsModRsrcTbl_T::m_vecRsrc.

652 {
653  int index;
654  BsModCtlBlk_T *pCtlBlk;
655 
656  // free all module virtual connnection resources.
657  for(index=0; index<BSMOD_MAX_HANDLES; ++index)
658  {
659  if( (pCtlBlk = (BsModCtlBlk_T *)BsModRsrcTbl->m_vecRsrc[index]) != NULL )
660  {
661  if( pCtlBlk->m_uRefCnt <= 1 )
662  {
663  i2c_close(&pCtlBlk->m_hndI2C);
664  bsModCtlBlkDelete(pCtlBlk);
665  }
666  else
667  {
668  pCtlBlk->m_uRefCnt--;
669  }
670  }
671  }
672 
673  // free resource table
675 
676  delete((char *)BsModUri);
677 }
static const char * BsModUri
module canonical name
Definition: bsI2CServer.c:111
void(* m_cbModRsrcTblDelete)(BsModRsrcTbl_T *pRsrcTbl)
Delete an allocated resource table.
Definition: bsProxyModIF.h:294
uint_t m_uRefCnt
reference count to this device
Definition: bsI2CServer.c:105
Module resource control block structure type.
Definition: bsI2CServer.c:103
#define BSMOD_MAX_HANDLES
Maximum number of module supported simultaneous virtual connections.
Definition: bsI2CServer.c:96
i2c_t m_hndI2C
I2C bus handle.
Definition: bsI2CServer.c:106
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsI2CServer.c:112
void ** m_vecRsrc
vecRsrc[index] -> rsrc
Definition: bsProxyModIF.h:139
static void bsModCtlBlkDelete(BsModCtlBlk_T *pCtlBlk)
Delete an allocated resource control block.
Definition: bsI2CServer.c:145
static int bsModI2CReqRead ( BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgIdReq,
byte_t  bufReq[],
size_t  uReqLen 
)
static

Service a I2C read request.

Note
A module-specific request service must send a response.
Parameters
hndVConnVirtual connection handle.
uTidRequest-Response transaction id.
uMsgIdReqRequest message id.
bufReqPacked request message buffer.
uReqLenSize of request in buffer (number of bytes).
Returns
On success, BS_OK is returned.
On error, the appropriate < 0 negated BotSense Error Code is returned.

Definition at line 194 of file bsI2CServer.c.

References BS_ECODE_BAD_MSG, BS_ECODE_BAD_VCONN_HND, BS_ECODE_NO_VCONN, BS_ECODE_SYS, BS_OK, BsI2CMsgIdRspRead, BsI2CPackRspRead(), BsI2CUnpackReqRead(), BSMOD_IS_VCONN_HANDLE, BSMOD_RSRC, BSMOD_SEND_ERROR_RSP, BSMOD_SEND_NMERROR_RSP, BSMOD_SEND_SYSERROR_RSP, BSPROXY_BUF_BODY, BSPROXY_MSG_MAX_LEN, BsI2CReqRead_T::m_addr, BsModCtlBlk_T::m_bTrace, BsModProxyCb_T::m_cbSendRsp, BsI2CRspRead_T::m_count, BsModCtlBlk_T::m_hndI2C, BsI2CRspRead_T::m_readbuf, BsI2CReqRead_T::m_readlen, and BsI2CRspRead_T::u.

Referenced by bsModRequest().

199 {
200  static BsI2CMsgId_T uMsgIdRsp = BsI2CMsgIdRspRead;
201 
202  BsModCtlBlk_T *pCtlBlk; // resource control block
203  BsI2CReqRead_T msgReq; // request message
204  BsI2CRspRead_T msgRsp; // response message
205  byte_t bufRsp[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
206  i2c_addr_t addr; // \h_i2c device address
207  int n; // number of bytes/return code
208 
209  //
210  // Parameter checks
211  //
212  if( !BSMOD_IS_VCONN_HANDLE(hndVConn) )
213  {
215  "Module vconn handle out-of-range.");
216  return -BS_ECODE_BAD_VCONN_HND; \
217  }
218 
219  // retrieve the resource control block
220  pCtlBlk = (BsModCtlBlk_T *)BSMOD_RSRC(BsModRsrcTbl, hndVConn);
221 
222  if( pCtlBlk == NULL )
223  {
225  "No resources for virtual connection found.");
226  return -BS_ECODE_NO_VCONN;
227  }
228 
229  //
230  // Unpack client request.
231  //
232  n = BsI2CUnpackReqRead(bufReq, uReqLen, &msgReq, pCtlBlk->m_bTrace);
233 
234  // check unpacking return code
235  if( n < 0 )
236  {
237  BSMOD_SEND_NMERROR_RSP(BsModCallbacks, hndVConn, uTid, n,
238  "MsgId=%u", uMsgIdReq);
239  return -BS_ECODE_BAD_MSG;
240  }
241 
242  addr = (i2c_addr_t)msgReq.m_addr;
243 
244  //
245  // Execute client request.
246  //
247  n = i2c_read(&pCtlBlk->m_hndI2C, addr, msgRsp.m_readbuf.u.m_buf,
248  (uint_t)msgReq.m_readlen);
249 
250  // check operation return code
251  if( n < 0 )
252  {
253  BSMOD_SEND_SYSERROR_RSP(BsModCallbacks, hndVConn, uTid,
254  "i2c_read(fd=%d, addr=0x%02x, ...).", pCtlBlk->m_hndI2C.fd, addr);
255  return -BS_ECODE_SYS;
256  }
257 
258  LOGDIAG3("VConn=%d: %d=i2c_read(fd=%d, addr=0x%02x, buf=%p, count=%zu).",
259  hndVConn, n, pCtlBlk->m_hndI2C.fd, addr, msgRsp.m_readbuf.u.m_buf,
260  (size_t)msgReq.m_readlen);
261 
262  //
263  // Pack server response.
264  //
265  msgRsp.m_readbuf.m_count = (byte_t)n;
266 
267  // pack
268  n = BsI2CPackRspRead(&msgRsp, BSPROXY_BUF_BODY(bufRsp), pCtlBlk->m_bTrace);
269 
270  // check packing return code
271  if( n < 0 )
272  {
273  BSMOD_SEND_NMERROR_RSP(BsModCallbacks, hndVConn, uTid, n,
274  "MsgId=%u", uMsgIdRsp);
275  return -BS_ECODE_BAD_MSG;
276  }
277 
278  //
279  // Send response.
280  //
281  BsModCallbacks->m_cbSendRsp(hndVConn, uTid, uMsgIdRsp, bufRsp, (size_t)n);
282 
283  return BS_OK;
284 }
RspRead.
Definition: bsI2CMsgs.h:42
INLINE_IN_H int BsI2CPackRspRead(BsI2CRspRead_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsI2CRspRead ITV message in big-endian byte order into the output buffer.
Definition: bsI2CMsgs.h:323
Module resource control block structure type.
Definition: bsI2CServer.c:103
bool_t m_bTrace
do [not] trace messages
Definition: bsI2CServer.c:108
#define BSMOD_IS_VCONN_HANDLE(hndVConn)
Test if the handle is in the valid module virtual connection range.
Definition: bsProxyModIF.h:149
ushort_t m_addr
addr
Definition: bsI2CMsgs.h:65
#define BS_OK
not an error, success
Definition: BotSense.h:66
struct BsI2CRspRead_T::@2 m_readbuf
vector
#define BS_ECODE_BAD_VCONN_HND
bad virtual connection handle
Definition: BotSense.h:79
#define BS_ECODE_SYS
system (errno) error
Definition: BotSense.h:92
BsI2CMsgId_T
Definition: bsI2CMsgs.h:37
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
void(* m_cbSendRsp)(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufRsp[], size_t uRspLen)
Send module-specific repsonse callback function.
Definition: bsProxyModIF.h:246
size_t m_count
vector item count
Definition: bsI2CMsgs.h:111
i2c_t m_hndI2C
I2C bus handle.
Definition: bsI2CServer.c:106
#define BSMOD_RSRC(pRsrcTbl, hndVConn)
Get the resource given the handle.
Definition: bsProxyModIF.h:196
byte_t m_readlen
readlen
Definition: bsI2CMsgs.h:66
#define BSMOD_SEND_NMERROR_RSP(pCb, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxyModIF.h:464
#define BSPROXY_BUF_BODY(buf)
Convenience macro to produce a buffer (offset, size) 2-tuple.
Definition: BotSense.h:272
#define BS_ECODE_NO_VCONN
virtual connection not found
Definition: BotSense.h:80
#define BSMOD_SEND_SYSERROR_RSP(pCb, hndVConn, uTid, efmt,...)
Log System Error and Send Error Response.
Definition: bsProxyModIF.h:481
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsI2CServer.c:112
#define BSPROXY_MSG_MAX_LEN
total message maximum length
Definition: BotSense.h:259
#define BSMOD_SEND_ERROR_RSP(pCb, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxyModIF.h:447
union BsI2CRspRead_T::@2::@3 u
aligned vector items
INLINE_IN_H int BsI2CUnpackReqRead(byte_t buf[], size_t uMsgLen, BsI2CReqRead_T *pStruct, bool_t bTrace)
Unpack a BsI2CReqRead ITV message in big-endian byte order from the input buffer. ...
Definition: bsI2CMsgs.h:258
static int bsModI2CReqScan ( BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgIdReq,
byte_t  bufReq[],
size_t  uReqLen 
)
static

Service a I2C scan for devices request.

Note
A module-specific request service must send a response.
Parameters
hndVConnVirtual connection handle.
uTidRequest-Response transaction id.
uMsgIdReqRequest message id.
bufReqPacked request message buffer.
uReqLenSize of request in buffer (number of bytes).
Returns
On success, BS_OK is returned.
On error, the appropriate < 0 negated BotSense Error Code is returned.

Definition at line 541 of file bsI2CServer.c.

References BS_ECODE_BAD_MSG, BS_ECODE_BAD_VCONN_HND, BS_ECODE_NO_VCONN, BS_ECODE_SYS, BS_OK, BsI2CMsgIdRspScan, BsI2CPackRspScan(), BSMOD_IS_VCONN_HANDLE, BSMOD_RSRC, BSMOD_SEND_ERROR_RSP, BSMOD_SEND_NMERROR_RSP, BSMOD_SEND_SYSERROR_RSP, bsModI2CScanCallback(), BSPROXY_BUF_BODY, BSPROXY_MSG_MAX_LEN, BsModCtlBlk_T::m_bTrace, BsModProxyCb_T::m_cbSendRsp, BsI2CRspScan_T::m_count, BsModCtlBlk_T::m_hndI2C, and BsI2CRspScan_T::m_scan.

Referenced by bsModRequest().

546 {
547  static BsI2CMsgId_T uMsgIdRsp = BsI2CMsgIdRspScan;
548 
549  BsModCtlBlk_T *pCtlBlk; // resource control block
550  BsI2CRspScan_T msgRsp; // response message
551  byte_t bufRsp[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
552  int n; // number of bytes/return code
553 
554  //
555  // Parameter checks
556  //
557  if( !BSMOD_IS_VCONN_HANDLE(hndVConn) )
558  {
560  "Module vconn handle out-of-range.");
561  return -BS_ECODE_BAD_VCONN_HND; \
562  }
563 
564  // retrieve the resource control block
565  pCtlBlk = (BsModCtlBlk_T *)BSMOD_RSRC(BsModRsrcTbl, hndVConn);
566 
567  if( pCtlBlk == NULL )
568  {
570  "No resources for virtual connection found.");
571  return -BS_ECODE_NO_VCONN;
572  }
573 
574  // no devices yet
575  msgRsp.m_scan.m_count = (byte_t)0;
576 
577  //
578  // Execute client request.
579  //
580  n = i2c_scan(&pCtlBlk->m_hndI2C, bsModI2CScanCallback, &msgRsp);
581 
582  // check operation return code
583  if( n < 0 )
584  {
585  BSMOD_SEND_SYSERROR_RSP(BsModCallbacks, hndVConn, uTid,
586  "i2c_scan(fd=%d, ...).", pCtlBlk->m_hndI2C.fd);
587  return -BS_ECODE_SYS;
588  }
589 
590  LOGDIAG3("VConn=%d: %d=i2c_scan(fd=%d, ...).",
591  hndVConn, n, pCtlBlk->m_hndI2C.fd);
592 
593  //
594  // Pack server response.
595  //
596  // pack
597  n = BsI2CPackRspScan(&msgRsp, BSPROXY_BUF_BODY(bufRsp), pCtlBlk->m_bTrace);
598 
599  // check packing return code
600  if( n < 0 )
601  {
602  BSMOD_SEND_NMERROR_RSP(BsModCallbacks, hndVConn, uTid, n,
603  "MsgId=%u", uMsgIdRsp);
604  return -BS_ECODE_BAD_MSG;
605  }
606 
607  //
608  // Send response.
609  //
610  BsModCallbacks->m_cbSendRsp(hndVConn, uTid, uMsgIdRsp, bufRsp, (size_t)n);
611 
612  return BS_OK;
613 }
size_t m_count
vector item count
Definition: bsI2CMsgs.h:175
Module resource control block structure type.
Definition: bsI2CServer.c:103
bool_t m_bTrace
do [not] trace messages
Definition: bsI2CServer.c:108
#define BSMOD_IS_VCONN_HANDLE(hndVConn)
Test if the handle is in the valid module virtual connection range.
Definition: bsProxyModIF.h:149
RspScan.
Definition: bsI2CMsgs.h:46
#define BS_OK
not an error, success
Definition: BotSense.h:66
#define BS_ECODE_BAD_VCONN_HND
bad virtual connection handle
Definition: BotSense.h:79
#define BS_ECODE_SYS
system (errno) error
Definition: BotSense.h:92
BsI2CMsgId_T
Definition: bsI2CMsgs.h:37
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
void(* m_cbSendRsp)(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufRsp[], size_t uRspLen)
Send module-specific repsonse callback function.
Definition: bsProxyModIF.h:246
struct BsI2CRspScan_T::@6 m_scan
vector
i2c_t m_hndI2C
I2C bus handle.
Definition: bsI2CServer.c:106
#define BSMOD_RSRC(pRsrcTbl, hndVConn)
Get the resource given the handle.
Definition: bsProxyModIF.h:196
static int bsModI2CScanCallback(i2c_t *pHndI2C, i2c_addr_t addr, void *pContext)
I2C scan callback function.
Definition: bsI2CServer.c:512
#define BSMOD_SEND_NMERROR_RSP(pCb, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxyModIF.h:464
#define BSPROXY_BUF_BODY(buf)
Convenience macro to produce a buffer (offset, size) 2-tuple.
Definition: BotSense.h:272
#define BS_ECODE_NO_VCONN
virtual connection not found
Definition: BotSense.h:80
#define BSMOD_SEND_SYSERROR_RSP(pCb, hndVConn, uTid, efmt,...)
Log System Error and Send Error Response.
Definition: bsProxyModIF.h:481
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsI2CServer.c:112
#define BSPROXY_MSG_MAX_LEN
total message maximum length
Definition: BotSense.h:259
#define BSMOD_SEND_ERROR_RSP(pCb, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxyModIF.h:447
INLINE_IN_H int BsI2CPackRspScan(BsI2CRspScan_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsI2CRspScan ITV message in big-endian byte order into the output buffer.
Definition: bsI2CMsgs.h:452
static int bsModI2CReqTrans ( BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgIdReq,
byte_t  bufReq[],
size_t  uReqLen 
)
static

Service a I2C write-read transaction request.

Note
A module-specific request service must send a response.
Parameters
hndVConnVirtual connection handle.
uTidRequest-Response transaction id.
uMsgIdReqRequest message id.
bufReqPacked request message buffer.
uReqLenSize of request in buffer (number of bytes).
Returns
On success, BS_OK is returned.
On error, the appropriate < 0 negated BotSense Error Code is returned.

Definition at line 404 of file bsI2CServer.c.

References BS_ECODE_BAD_MSG, BS_ECODE_BAD_VCONN_HND, BS_ECODE_NO_VCONN, BS_ECODE_SYS, BS_OK, BsI2CMsgIdRspRead, BsI2CPackRspRead(), BsI2CUnpackReqTrans(), BSMOD_IS_VCONN_HANDLE, BSMOD_RSRC, BSMOD_SEND_ERROR_RSP, BSMOD_SEND_NMERROR_RSP, BSMOD_SEND_SYSERROR_RSP, BSPROXY_BUF_BODY, BSPROXY_MSG_MAX_LEN, BsI2CReqTrans_T::m_addr, BsModCtlBlk_T::m_bTrace, BsModProxyCb_T::m_cbSendRsp, BsI2CReqTrans_T::m_count, BsI2CRspRead_T::m_count, BsModCtlBlk_T::m_hndI2C, BsI2CRspRead_T::m_readbuf, BsI2CReqTrans_T::m_readlen, BsI2CReqTrans_T::m_writebuf, BsI2CReqTrans_T::u, and BsI2CRspRead_T::u.

Referenced by bsModRequest().

409 {
410  static BsI2CMsgId_T uMsgIdRsp = BsI2CMsgIdRspRead;
411 
412  BsModCtlBlk_T *pCtlBlk; // resource control block
413  BsI2CReqTrans_T msgReq; // request message
414  BsI2CRspRead_T msgRsp; // response message
415  byte_t bufRsp[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
416  i2c_addr_t addr; // \h_i2c device address
417  int n; // number of bytes/return code
418  int rc; // return code
419 
420  //
421  // Parameter checks
422  //
423  if( !BSMOD_IS_VCONN_HANDLE(hndVConn) )
424  {
426  "Module vconn handle out-of-range.");
427  return -BS_ECODE_BAD_VCONN_HND; \
428  }
429 
430  // retrieve the resource control block
431  pCtlBlk = (BsModCtlBlk_T *)BSMOD_RSRC(BsModRsrcTbl, hndVConn);
432 
433  if( pCtlBlk == NULL )
434  {
436  "No resources for virtual connection found.");
437  return -BS_ECODE_NO_VCONN;
438  }
439 
440  //
441  // Unpack client request.
442  //
443  n = BsI2CUnpackReqTrans(bufReq, uReqLen, &msgReq, pCtlBlk->m_bTrace);
444 
445  // check unpacking return code
446  if( n < 0 )
447  {
448  BSMOD_SEND_NMERROR_RSP(BsModCallbacks, hndVConn, uTid, n,
449  "MsgId=%u", uMsgIdReq);
450  return -BS_ECODE_BAD_MSG;
451  }
452 
453  addr = (i2c_addr_t)msgReq.m_addr;
454 
455  //
456  // Execute client request.
457  //
458  rc = i2c_transfer(&pCtlBlk->m_hndI2C, addr,
459  msgReq.m_writebuf.u.m_buf, (uint_t)msgReq.m_writebuf.m_count,
460  msgRsp.m_readbuf.u.m_buf, (uint_t)msgReq.m_readlen);
461 
462  // check operation return code
463  if( rc < 0 )
464  {
465  BSMOD_SEND_SYSERROR_RSP(BsModCallbacks, hndVConn, uTid,
466  "i2c_transfer(fd=%d, addr=0x%02x, ...).", pCtlBlk->m_hndI2C.fd, addr);
467  return -BS_ECODE_SYS;
468  }
469 
470  LOGDIAG3("VConn=%d: i2c_transfer(fd=%d, addr=0x%02x, wbuf=%p, wcount=%zu, "
471  "rbuf=%p, rcount=%zu).",
472  hndVConn, pCtlBlk->m_hndI2C.fd,
473  msgReq.m_writebuf.u.m_buf, (size_t)msgReq.m_writebuf.m_count,
474  msgRsp.m_readbuf.u.m_buf, (size_t)msgReq.m_readlen);
475 
476  //
477  // Pack server response. Note: transfer fails if full number of bytes are
478  // not read.
479  //
480  msgRsp.m_readbuf.m_count = (byte_t)msgReq.m_readlen;
481 
482  // pack
483  n = BsI2CPackRspRead(&msgRsp, BSPROXY_BUF_BODY(bufRsp), pCtlBlk->m_bTrace);
484 
485  // check packing return code
486  if( n < 0 )
487  {
488  BSMOD_SEND_NMERROR_RSP(BsModCallbacks, hndVConn, uTid, n,
489  "MsgId=%u", uMsgIdRsp);
490  return -BS_ECODE_BAD_MSG;
491  }
492 
493  //
494  // Send response.
495  //
496  BsModCallbacks->m_cbSendRsp(hndVConn, uTid, uMsgIdRsp, bufRsp, (size_t)n);
497 
498  return BS_OK;
499 }
RspRead.
Definition: bsI2CMsgs.h:42
struct BsI2CReqTrans_T::@0 m_writebuf
vector
INLINE_IN_H int BsI2CPackRspRead(BsI2CRspRead_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsI2CRspRead ITV message in big-endian byte order into the output buffer.
Definition: bsI2CMsgs.h:323
byte_t m_readlen
readlen
Definition: bsI2CMsgs.h:93
Module resource control block structure type.
Definition: bsI2CServer.c:103
bool_t m_bTrace
do [not] trace messages
Definition: bsI2CServer.c:108
#define BSMOD_IS_VCONN_HANDLE(hndVConn)
Test if the handle is in the valid module virtual connection range.
Definition: bsProxyModIF.h:149
#define BS_OK
not an error, success
Definition: BotSense.h:66
struct BsI2CRspRead_T::@2 m_readbuf
vector
#define BS_ECODE_BAD_VCONN_HND
bad virtual connection handle
Definition: BotSense.h:79
size_t m_count
vector item count
Definition: bsI2CMsgs.h:85
#define BS_ECODE_SYS
system (errno) error
Definition: BotSense.h:92
BsI2CMsgId_T
Definition: bsI2CMsgs.h:37
ushort_t m_addr
addr
Definition: bsI2CMsgs.h:82
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
union BsI2CReqTrans_T::@0::@1 u
aligned vector items
void(* m_cbSendRsp)(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufRsp[], size_t uRspLen)
Send module-specific repsonse callback function.
Definition: bsProxyModIF.h:246
size_t m_count
vector item count
Definition: bsI2CMsgs.h:111
i2c_t m_hndI2C
I2C bus handle.
Definition: bsI2CServer.c:106
#define BSMOD_RSRC(pRsrcTbl, hndVConn)
Get the resource given the handle.
Definition: bsProxyModIF.h:196
INLINE_IN_H int BsI2CUnpackReqTrans(byte_t buf[], size_t uMsgLen, BsI2CReqTrans_T *pStruct, bool_t bTrace)
Unpack a BsI2CReqTrans ITV message in big-endian byte order from the input buffer.
Definition: bsI2CMsgs.h:301
#define BSMOD_SEND_NMERROR_RSP(pCb, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxyModIF.h:464
#define BSPROXY_BUF_BODY(buf)
Convenience macro to produce a buffer (offset, size) 2-tuple.
Definition: BotSense.h:272
#define BS_ECODE_NO_VCONN
virtual connection not found
Definition: BotSense.h:80
#define BSMOD_SEND_SYSERROR_RSP(pCb, hndVConn, uTid, efmt,...)
Log System Error and Send Error Response.
Definition: bsProxyModIF.h:481
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsI2CServer.c:112
#define BSPROXY_MSG_MAX_LEN
total message maximum length
Definition: BotSense.h:259
#define BSMOD_SEND_ERROR_RSP(pCb, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxyModIF.h:447
union BsI2CRspRead_T::@2::@3 u
aligned vector items
static int bsModI2CReqWrite ( BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgIdReq,
byte_t  bufReq[],
size_t  uReqLen 
)
static

Service a I2C write request.

Note
A module-specific request service must send a response.
Parameters
hndVConnVirtual connection handle.
uTidRequest-Response transaction id.
uMsgIdReqRequest message id.
bufReqPacked request message buffer.
uReqLenSize of request in buffer (number of bytes).
Returns
On success, BS_OK is returned.
On error, the appropriate < 0 negated BotSense Error Code is returned.

Definition at line 299 of file bsI2CServer.c.

References BS_ECODE_BAD_MSG, BS_ECODE_BAD_VCONN_HND, BS_ECODE_NO_VCONN, BS_ECODE_SYS, BS_OK, BsI2CMsgIdRspWrite, BsI2CPackRspWrite(), BsI2CUnpackReqWrite(), BSMOD_IS_VCONN_HANDLE, BSMOD_RSRC, BSMOD_SEND_ERROR_RSP, BSMOD_SEND_NMERROR_RSP, BSMOD_SEND_SYSERROR_RSP, BSPROXY_BUF_BODY, BSPROXY_MSG_MAX_LEN, BsI2CReqWrite_T::m_addr, BsModCtlBlk_T::m_bTrace, BsI2CRspWrite_T::m_byteswritten, BsModProxyCb_T::m_cbSendRsp, BsI2CReqWrite_T::m_count, BsModCtlBlk_T::m_hndI2C, BsI2CReqWrite_T::m_writebuf, and BsI2CReqWrite_T::u.

Referenced by bsModRequest().

304 {
305  static BsI2CMsgId_T uMsgIdRsp = BsI2CMsgIdRspWrite;
306 
307  BsModCtlBlk_T *pCtlBlk; // resource control block
308  BsI2CReqWrite_T msgReq; // request message
309  BsI2CRspWrite_T msgRsp; // response message
310  byte_t bufRsp[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
311  i2c_addr_t addr; // \h_i2c device address
312  int n; // number of bytes/return code
313 
314  //
315  // Parameter checks
316  //
317  if( !BSMOD_IS_VCONN_HANDLE(hndVConn) )
318  {
320  "Module vconn handle out-of-range.");
321  return -BS_ECODE_BAD_VCONN_HND; \
322  }
323 
324  // retrieve the resource control block
325  pCtlBlk = (BsModCtlBlk_T *)BSMOD_RSRC(BsModRsrcTbl, hndVConn);
326 
327  if( pCtlBlk == NULL )
328  {
330  "No resources for virtual connection found.");
331  return -BS_ECODE_NO_VCONN;
332  }
333 
334  //
335  // Unpack client request.
336  //
337  n = BsI2CUnpackReqWrite(bufReq, uReqLen, &msgReq, pCtlBlk->m_bTrace);
338 
339  // check unpacking return code
340  if( n < 0 )
341  {
342  BSMOD_SEND_NMERROR_RSP(BsModCallbacks, hndVConn, uTid, n,
343  "MsgId=%u", uMsgIdReq);
344  return -BS_ECODE_BAD_MSG;
345  }
346 
347  addr = (i2c_addr_t)msgReq.m_addr;
348 
349  //
350  // Execute client request.
351  //
352  n = i2c_write(&pCtlBlk->m_hndI2C, addr, msgReq.m_writebuf.u.m_buf,
353  (uint_t)msgReq.m_writebuf.m_count);
354 
355  // check operation return code
356  if( n < 0 )
357  {
358  BSMOD_SEND_SYSERROR_RSP(BsModCallbacks, hndVConn, uTid,
359  "i2c_write(fd=%d, addr=0x%02x, ...).", pCtlBlk->m_hndI2C.fd, addr);
360  return -BS_ECODE_SYS;
361  }
362 
363  LOGDIAG3("VConn=%d: %d=i2c_write(fd=%d, addr=0x%02x, buf=%p, count=%zu).",
364  hndVConn, n, pCtlBlk->m_hndI2C.fd, addr, msgReq.m_writebuf.u.m_buf,
365  (size_t)msgReq.m_writebuf.m_count);
366 
367  //
368  // Pack server response.
369  //
370  msgRsp.m_byteswritten = (byte_t)n;
371 
372  // pack
373  n = BsI2CPackRspWrite(&msgRsp, BSPROXY_BUF_BODY(bufRsp), pCtlBlk->m_bTrace);
374 
375  // check packing return code
376  if( n < 0 )
377  {
378  BSMOD_SEND_NMERROR_RSP(BsModCallbacks, hndVConn, uTid, n,
379  "MsgId=%u", uMsgIdRsp);
380  return -BS_ECODE_BAD_MSG;
381  }
382 
383  //
384  // Send response.
385  //
386  BsModCallbacks->m_cbSendRsp(hndVConn, uTid, uMsgIdRsp, bufRsp, (size_t)n);
387 
388  return BS_OK;
389 }
ushort_t m_addr
addr
Definition: bsI2CMsgs.h:134
union BsI2CReqWrite_T::@4::@5 u
aligned vector items
Module resource control block structure type.
Definition: bsI2CServer.c:103
bool_t m_bTrace
do [not] trace messages
Definition: bsI2CServer.c:108
#define BSMOD_IS_VCONN_HANDLE(hndVConn)
Test if the handle is in the valid module virtual connection range.
Definition: bsProxyModIF.h:149
struct BsI2CReqWrite_T::@4 m_writebuf
vector
#define BS_OK
not an error, success
Definition: BotSense.h:66
#define BS_ECODE_BAD_VCONN_HND
bad virtual connection handle
Definition: BotSense.h:79
#define BS_ECODE_SYS
system (errno) error
Definition: BotSense.h:92
BsI2CMsgId_T
Definition: bsI2CMsgs.h:37
#define BS_ECODE_BAD_MSG
bad message
Definition: BotSense.h:76
RspWrite.
Definition: bsI2CMsgs.h:44
void(* m_cbSendRsp)(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgId, byte_t bufRsp[], size_t uRspLen)
Send module-specific repsonse callback function.
Definition: bsProxyModIF.h:246
INLINE_IN_H int BsI2CPackRspWrite(BsI2CRspWrite_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsI2CRspWrite ITV message in big-endian byte order into the output buffer. ...
Definition: bsI2CMsgs.h:409
INLINE_IN_H int BsI2CUnpackReqWrite(byte_t buf[], size_t uMsgLen, BsI2CReqWrite_T *pStruct, bool_t bTrace)
Unpack a BsI2CReqWrite ITV message in big-endian byte order from the input buffer.
Definition: bsI2CMsgs.h:387
i2c_t m_hndI2C
I2C bus handle.
Definition: bsI2CServer.c:106
byte_t m_byteswritten
byteswritten
Definition: bsI2CMsgs.h:157
#define BSMOD_RSRC(pRsrcTbl, hndVConn)
Get the resource given the handle.
Definition: bsProxyModIF.h:196
size_t m_count
vector item count
Definition: bsI2CMsgs.h:137
#define BSMOD_SEND_NMERROR_RSP(pCb, hndVConn, uTid, nmecode, efmt,...)
Log NetMsgs (Un)Packing Error and Send Error Response.
Definition: bsProxyModIF.h:464
#define BSPROXY_BUF_BODY(buf)
Convenience macro to produce a buffer (offset, size) 2-tuple.
Definition: BotSense.h:272
#define BS_ECODE_NO_VCONN
virtual connection not found
Definition: BotSense.h:80
#define BSMOD_SEND_SYSERROR_RSP(pCb, hndVConn, uTid, efmt,...)
Log System Error and Send Error Response.
Definition: bsProxyModIF.h:481
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsI2CServer.c:112
#define BSPROXY_MSG_MAX_LEN
total message maximum length
Definition: BotSense.h:259
#define BSMOD_SEND_ERROR_RSP(pCb, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxyModIF.h:447
static int bsModI2CScanCallback ( i2c_t *  pHndI2C,
i2c_addr_t  addr,
void *  pContext 
)
static

I2C scan callback function.

Parameters
pHndI2CPointer to I2C Bus handle.
addrDiscovered I2C device address during scan.
pContextCallback context.
Returns
On success, returns current number of scanned device found. On error, errno is set and - BS_ECODE_SYS is returned.

Definition at line 512 of file bsI2CServer.c.

References BS_ECODE_SYS, BSI2C_RSPSCAN_SCAN_LEN, BsI2CRspScan_T::m_count, BsI2CRspScan_T::m_scan, and BsI2CRspScan_T::u.

Referenced by bsModI2CReqScan().

513 {
514  BsI2CRspScan_T *pMsgRsp = (BsI2CRspScan_T *)pContext; // response message
515 
516  if( pMsgRsp->m_scan.m_count < BSI2C_RSPSCAN_SCAN_LEN )
517  {
518  pMsgRsp->m_scan.u.m_buf[pMsgRsp->m_scan.m_count++] = addr;
519  return pMsgRsp->m_scan.m_count;
520  }
521  else
522  {
523  errno = E2BIG;
524  return -BS_ECODE_SYS;
525  }
526 }
#define BSI2C_RSPSCAN_SCAN_LEN
Definition: bsI2CMsgs.h:166
size_t m_count
vector item count
Definition: bsI2CMsgs.h:175
#define BS_ECODE_SYS
system (errno) error
Definition: BotSense.h:92
struct BsI2CRspScan_T::@6 m_scan
vector
union BsI2CRspScan_T::@6::@7 u
aligned vector items
const BsModInfo_T* bsModInfo ( )

Query for the static module information.

Returns
Pointer to module static information.

Definition at line 927 of file bsI2CServer.c.

References BsModInfo.

928 {
929  return &BsModInfo;
930 }
static BsModInfo_T BsModInfo
Module static information.
Definition: bsI2CServer.c:72
int bsModInit ( const char *  sModUri,
const BsModProxyCb_T pCallbacks 
)

Initialize I2C module.

Called once after module is loaded.

Parameters
sModUriExpanded, canonical module path name.
pCallbacksPointer to a set of module -> bsProxy core callback functions.
Returns
On success, BS_OK is returned.
On error, the appropriate < 0 negated BotSense Error Code is returned.

Definition at line 631 of file bsI2CServer.c.

References BS_OK, BSMOD_MAX_HANDLES, BsModUri, and BsModProxyCb_T::m_cbModRsrcTblNew.

632 {
633  BsModUri = new_strdup(sModUri);
634 
635  // save bsProxy server callbacks
636  BsModCallbacks = pCallbacks;
637 
638  // create module resource table
640 
641  return BS_OK;
642 }
static const char * BsModUri
module canonical name
Definition: bsI2CServer.c:111
#define BS_OK
not an error, success
Definition: BotSense.h:66
#define BSMOD_MAX_HANDLES
Maximum number of module supported simultaneous virtual connections.
Definition: bsI2CServer.c:96
BsModRsrcTbl_T *(* m_cbModRsrcTblNew)(int nMaxResources)
Allocatae a new module resource table of fixed size.
Definition: bsProxyModIF.h:284
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsI2CServer.c:112
int bsModOpen ( BsVConnHnd_T  hndVConn,
bool_t  bTrace,
const char *  sDevUri,
byte_t  argbuf[],
size_t  uArgSize 
)

Open an I2C device and associate with the given handle.

Subsequent calls to the module use the given handle to associate the specific module-device instance.

The argument buffer contains packed message arguements specific to the device and module. For this I2C module, there are now additional arguments.

Note
Each call to this exported function will only open the I2C device if it is the first call. All virtual connections to the same device share the same opened file resource descriptor.
It is the responsibile of the client to ensure consistency if more than one virtual connection is established.
Parameters
hndVConnVirtual connection handle.
bTraceDo [not] enable message tracing on this handle.
sDevUriDevice URI.
argbufPacked specific open configuration arguments submessage.
uArgSizeSize of packed argumets in buffer (number of bytes).
Returns
On success, returns a unique resource descriptor ≥ 0 which is typically an opened file descriptor or socket descriptor, but can be module defined.
On error, the appropriate < 0 negated BotSense Error Code is returned.

Definition at line 708 of file bsI2CServer.c.

References BS_ECODE_BUSY, BS_ECODE_NO_RSRC, BS_ECODE_SYS, BSMOD_LOG_ERROR, BSMOD_LOG_SYSERROR, BSMOD_MAX_HANDLES, BSMOD_RSRC_INUSE_COUNT, BSMOD_RSRC_IS_INUSE, BSMOD_TRY_VCONN_HND_RANGE, bsModCtlBlkDelete(), bsModCtlBlkFind(), bsModCtlBlkNew(), BsModProxyCb_T::m_cbModRsrcAdd, BsModCtlBlk_T::m_hndI2C, and BsModCtlBlk_T::m_uRefCnt.

713 {
714  BsModCtlBlk_T *pCtlBlk;
715  int rc;
716 
717  // Check if handle is in valid range.
718  BSMOD_TRY_VCONN_HND_RANGE(hndVConn);
719 
720  // Check if resources are available.
722  {
724  "InUseCount=%u: No more resources available.",
726  return -BS_ECODE_NO_RSRC;
727  }
728 
729  // Check if the handle in this module's resource table is not already in-use.
730  else if( BSMOD_RSRC_IS_INUSE(BsModRsrcTbl, hndVConn) )
731  {
732  BSMOD_LOG_ERROR(hndVConn, BS_ECODE_BUSY,
733  "Module virtual connection handle already in use");
734  return -BS_ECODE_BUSY;
735  }
736 
737  //
738  // Search for an existing opened device control block. If this is a first
739  // reference to the device, then create a shared control block and open
740  // the actual device.
741  //
742  if( (pCtlBlk = bsModCtlBlkFind(sDevUri)) == NULL )
743  {
744  // allocate a new control block and initialize
745  pCtlBlk = bsModCtlBlkNew(sDevUri, bTrace);
746 
747  // open the device
748  rc = i2c_open(&pCtlBlk->m_hndI2C, sDevUri);
749 
750  if( rc < 0 )
751  {
752  BSMOD_LOG_SYSERROR(hndVConn, "i2c_open(%p, %s).",
753  &pCtlBlk->m_hndI2C, sDevUri);
754  bsModCtlBlkDelete(pCtlBlk);
755  return -BS_ECODE_SYS;
756  }
757  }
758 
759  // bump device reference count
760  pCtlBlk->m_uRefCnt++;
761 
762  // add (a copy) to this module's resource table
763  BsModCallbacks->m_cbModRsrcAdd(BsModRsrcTbl, hndVConn, pCtlBlk);
764 
765  LOGDIAG2("VConn=%d: %d=i2c_open(%p, dev=%s).",
766  hndVConn, pCtlBlk->m_hndI2C.fd, &pCtlBlk->m_hndI2C, sDevUri);
767 
768  return pCtlBlk->m_hndI2C.fd;
769 }
#define BSMOD_LOG_ERROR(hndVConn, ecode, efmt,...)
Log Interface Module Error.
Definition: bsProxyModIF.h:405
#define BSMOD_RSRC_IS_INUSE(pRsrcTbl, hndVConn)
Test if the resource table resource handle slot is in-use.
Definition: bsProxyModIF.h:169
uint_t m_uRefCnt
reference count to this device
Definition: bsI2CServer.c:105
#define BSMOD_LOG_SYSERROR(hndVConn, efmt,...)
Log Interface Module System Error.
Definition: bsProxyModIF.h:431
Module resource control block structure type.
Definition: bsI2CServer.c:103
int(* m_cbModRsrcAdd)(BsModRsrcTbl_T *pRsrcTbl, BsVConnHnd_T hndVConn, void *pRsrc)
Add a new resource to the resource table.
Definition: bsProxyModIF.h:305
#define BS_ECODE_SYS
system (errno) error
Definition: BotSense.h:92
#define BSMOD_MAX_HANDLES
Maximum number of module supported simultaneous virtual connections.
Definition: bsI2CServer.c:96
#define BSMOD_TRY_VCONN_HND_RANGE(hndVConn)
Check if handle is within the range of module handles.
Definition: bsProxyModIF.h:499
#define BSMOD_RSRC_INUSE_COUNT(pRsrcTbl)
Get the resouce table current in-use count.
Definition: bsProxyModIF.h:208
#define BS_ECODE_NO_RSRC
no resource available
Definition: BotSense.h:85
i2c_t m_hndI2C
I2C bus handle.
Definition: bsI2CServer.c:106
static BsModCtlBlk_T * bsModCtlBlkFind(const char *sDevUri)
Find an already allocated resource control block.
Definition: bsI2CServer.c:162
static BsModCtlBlk_T * bsModCtlBlkNew(const char *sDevUri, bool_t bTrace)
Allocate a new resource control block.
Definition: bsI2CServer.c:127
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsI2CServer.c:112
#define BS_ECODE_BUSY
resource busy
Definition: BotSense.h:86
static void bsModCtlBlkDelete(BsModCtlBlk_T *pCtlBlk)
Delete an allocated resource control block.
Definition: bsI2CServer.c:145
int bsModRequest ( BsVConnHnd_T  hndVConn,
BsTid_T  uTid,
BsMsgId_T  uMsgIdReq,
byte_t  bufReq[],
size_t  uReqLen 
)

Service an I2C request.

Note
A module-specific request service must send a response.
Parameters
hndVConnVirtual connection handle.
uTidRequest-Response transaction id.
uMsgIdReqRequest message id.
bufReqPacked request message buffer.
uReqLenSize of request in buffer (number of bytes).
Returns
On success, BS_OK is returned.
On error, the appropriate < 0 negated BotSense Error Code is returned.

Definition at line 841 of file bsI2CServer.c.

References BS_ECODE_BAD_VCONN_HND, BS_ECODE_NO_VCONN, BS_ECODE_UNKNOWN_REQ, BsI2CMsgIdReqRead, BsI2CMsgIdReqScan, BsI2CMsgIdReqTrans, BsI2CMsgIdReqWrite, BSMOD_IS_VCONN_HANDLE, BSMOD_RSRC, BSMOD_SEND_ERROR_RSP, bsModI2CReqRead(), bsModI2CReqScan(), bsModI2CReqTrans(), and bsModI2CReqWrite().

846 {
847  BsModCtlBlk_T *pCtlBlk;
848 
849  // check if handle is in valid range
850  if( !BSMOD_IS_VCONN_HANDLE(hndVConn) )
851  {
853  "Module vconn handle out-of-range.");
854  return -BS_ECODE_BAD_VCONN_HND; \
855  }
856 
857  // retrieve resource control block
858  pCtlBlk = (BsModCtlBlk_T *)BSMOD_RSRC(BsModRsrcTbl, hndVConn);
859 
860  // check resource
861  if( pCtlBlk == NULL )
862  {
864  "No resources for virtual connection found.");
865  return -BS_ECODE_NO_VCONN;
866  }
867 
868  switch( uMsgIdReq )
869  {
870  case BsI2CMsgIdReqRead:
871  return bsModI2CReqRead(hndVConn, uTid, uMsgIdReq, bufReq, uReqLen);
872  case BsI2CMsgIdReqTrans:
873  return bsModI2CReqTrans(hndVConn, uTid, uMsgIdReq, bufReq, uReqLen);
874  case BsI2CMsgIdReqWrite:
875  return bsModI2CReqWrite(hndVConn, uTid, uMsgIdReq, bufReq, uReqLen);
876  case BsI2CMsgIdReqScan:
877  return bsModI2CReqScan(hndVConn, uTid, uMsgIdReq, bufReq, uReqLen);
878  default:
880  "MsgId=%u.", uMsgIdReq);
881  return -BS_ECODE_UNKNOWN_REQ;
882  }
883 }
#define BS_ECODE_UNKNOWN_REQ
unknown request
Definition: BotSense.h:81
Module resource control block structure type.
Definition: bsI2CServer.c:103
#define BSMOD_IS_VCONN_HANDLE(hndVConn)
Test if the handle is in the valid module virtual connection range.
Definition: bsProxyModIF.h:149
ReqRead.
Definition: bsI2CMsgs.h:40
#define BS_ECODE_BAD_VCONN_HND
bad virtual connection handle
Definition: BotSense.h:79
ReqTrans.
Definition: bsI2CMsgs.h:41
static int bsModI2CReqTrans(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
Service a I2C write-read transaction request.
Definition: bsI2CServer.c:404
static int bsModI2CReqRead(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
Service a I2C read request.
Definition: bsI2CServer.c:194
ReqScan.
Definition: bsI2CMsgs.h:45
#define BSMOD_RSRC(pRsrcTbl, hndVConn)
Get the resource given the handle.
Definition: bsProxyModIF.h:196
ReqWrite.
Definition: bsI2CMsgs.h:43
static int bsModI2CReqScan(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
Service a I2C scan for devices request.
Definition: bsI2CServer.c:541
#define BS_ECODE_NO_VCONN
virtual connection not found
Definition: BotSense.h:80
static int bsModI2CReqWrite(BsVConnHnd_T hndVConn, BsTid_T uTid, BsMsgId_T uMsgIdReq, byte_t bufReq[], size_t uReqLen)
Service a I2C write request.
Definition: bsI2CServer.c:299
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113
static const BsModProxyCb_T * BsModCallbacks
module to bsProxy callbacks
Definition: bsI2CServer.c:112
#define BSMOD_SEND_ERROR_RSP(pCb, hndVConn, uTid, ecode, efmt,...)
Log <b><i>BotSense</i></b> Error and Send Error Response.
Definition: bsProxyModIF.h:447
int bsModTrace ( BsVConnHnd_T  hndVConn,
bool_t  bTrace 
)

Enable/disable message tracing on handle.

Parameters
hndVConnVirtual connection handle.
bTraceDo [not] enable message tracing on this handle.
Returns
On success, BS_OK is returned.
On error, the appropriate < 0 negated BotSense Error Code is returned.

Definition at line 893 of file bsI2CServer.c.

References BS_ECODE_BAD_VCONN_HND, BS_ECODE_NO_VCONN, BS_OK, BSMOD_IS_VCONN_HANDLE, BSMOD_LOG_ERROR, BSMOD_RSRC, and BsModCtlBlk_T::m_bTrace.

894 {
895  BsModCtlBlk_T *pCtlBlk;
896 
897  // check if handle is in valid range
898  if( !BSMOD_IS_VCONN_HANDLE(hndVConn) )
899  {
901  "Module vconn handle out-of-range.");
902  return -BS_ECODE_BAD_VCONN_HND;
903  }
904 
905  // retrieve resource control block
906  pCtlBlk = (BsModCtlBlk_T *)BSMOD_RSRC(BsModRsrcTbl, hndVConn);
907 
908  // check resource
909  if( pCtlBlk == NULL )
910  {
912  "No resources for virtual connection found.");
913  return -BS_ECODE_NO_VCONN;
914  }
915 
916  pCtlBlk->m_bTrace = bTrace;
917 
918  return BS_OK;
919 }
#define BSMOD_LOG_ERROR(hndVConn, ecode, efmt,...)
Log Interface Module Error.
Definition: bsProxyModIF.h:405
Module resource control block structure type.
Definition: bsI2CServer.c:103
bool_t m_bTrace
do [not] trace messages
Definition: bsI2CServer.c:108
#define BSMOD_IS_VCONN_HANDLE(hndVConn)
Test if the handle is in the valid module virtual connection range.
Definition: bsProxyModIF.h:149
#define BS_OK
not an error, success
Definition: BotSense.h:66
#define BS_ECODE_BAD_VCONN_HND
bad virtual connection handle
Definition: BotSense.h:79
#define BSMOD_RSRC(pRsrcTbl, hndVConn)
Get the resource given the handle.
Definition: bsProxyModIF.h:196
#define BS_ECODE_NO_VCONN
virtual connection not found
Definition: BotSense.h:80
static BsModRsrcTbl_T * BsModRsrcTbl
module resource table
Definition: bsI2CServer.c:113

Variable Documentation

BsModInfo_T BsModInfo
static
Initial value:
=
{
.mod_name = BS_I2C_SERVER_MOD,
.brief = "Raw I2C Bus proxied device.",
.version = "2.0.0",
.date = "2010.07.20",
.maintainer = "RaodNarrows LLC",
.license = "(C) 2010 RoadNarrows LLC. All rights reserved."
}
#define BS_I2C_SERVER_MOD
server plugin dll module
Definition: bsI2C.h:62

Module static information.

Definition at line 72 of file bsI2CServer.c.

Referenced by bsModInfo().