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

BotSense bsProxy client proxied I2C bus device library. More...

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

Go to the source code of this file.

Functions

const char * bsI2CGetMsgName (BsClient_P pClient, BsVConnHnd_T hndVConn, uint_t uMsgId)
 Get the I2C message name. More...
 
int bsI2CReqOpen (BsClient_P pClient, const char *sDevName, bool_t bInitTrace)
 Request proxy server to establish a virtual connection to an I2C bus device. More...
 
int bsI2CReqClose (BsClient_P pClient, BsVConnHnd_T hndVConn)
 Request proxy server to close client's proxied I2C device vitual connection. More...
 
int bsI2CReqRead (BsClient_P pClient, BsVConnHnd_T hndVConn, i2c_addr_t i2cAddr, size_t uReadLen, byte_t rbuf[])
 Proxied request to read from a device attached to the I2C bus. More...
 
int bsI2CReqWrite (BsClient_P pClient, BsVConnHnd_T hndVConn, i2c_addr_t i2cAddr, byte_t wbuf[], size_t uWriteLen)
 Proxied request to write to a device attached to the I2C bus. More...
 
int bsI2CReqTrans (BsClient_P pClient, BsVConnHnd_T hndVConn, i2c_addr_t i2cAddr, byte_t wbuf[], size_t uWriteLen, size_t uReadLen, byte_t rbuf[])
 Proxied request to execute a write-read transaction to a device attached to the I2C bus. More...
 
int bsI2CReqScan (BsClient_P pClient, BsVConnHnd_T hndVConn, i2c_addr_t bufScan[], size_t sizeScanBuf)
 Proxied request to scan the I2C bus for all attached devices. More...
 

Variables

static BsClientAppInfo_T bsI2CAppInfo
  BotSense client application information. More...
 

Detailed Description

BotSense bsProxy client proxied I2C bus device library.

LastChangedDate
2010-08-20 11:36:38 -0600 (Fri, 20 Aug 2010)
Rev
568
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 bsI2CClient.c.

Function Documentation

const char* bsI2CGetMsgName ( BsClient_P  pClient,
BsVConnHnd_T  hndVConn,
uint_t  uMsgId 
)

Get the I2C message name.

For each (virtual connection, message id) 2-tuple, there can be a known name string (provided the id is valid and an application provides the information).

Parameters
pClient

Definition at line 101 of file bsI2CClient.c.

References BsI2CLookupMsgDef().

104 {
105  const NMMsgDef_T *pMsgDef;
106 
107  pMsgDef = BsI2CLookupMsgDef((BsI2CMsgId_T)uMsgId);
108 
109  return pMsgDef!=NULL? pMsgDef->m_sMsgName: "unknown";
110 }
BsI2CMsgId_T
Definition: bsI2CMsgs.h:37
const NMMsgDef_T * BsI2CLookupMsgDef(BsI2CMsgId_T eMsgId)
Look up the message definition associated with the message id.
Definition: bsI2CMsgs.c:509
int bsI2CReqClose ( BsClient_P  pClient,
BsVConnHnd_T  hndVConn 
)

Request proxy server to close client's proxied I2C device vitual connection.

Parameters
pClient

Definition at line 153 of file bsI2CClient.c.

154 {
155  return bsServerReqCloseDev(pClient, hndVConn);
156 }
int bsI2CReqOpen ( BsClient_P  pClient,
const char *  sDevName,
bool_t  bInitTrace 
)

Request proxy server to establish a virtual connection to an I2C bus device.

Parameters
pClient

Definition at line 124 of file bsI2CClient.c.

References BS_I2C_SERVER_MOD, and BSCLIENT_TRY_ECODE.

127 {
128  int hnd; // vconn handle / return code
129 
130  //
131  // Execute server transaction (returns handle \h_ge 0 on success).
132  //
133  hnd = bsServerReqOpenDev(pClient, sDevName, BS_I2C_SERVER_MOD,
134  NULL, (size_t)0, &bsI2CAppInfo, bInitTrace);
135 
136  // check transaction return code
137  BSCLIENT_TRY_ECODE(pClient, hnd, "bsServerReqOpenDev(dev='%s') failed.",
138  sDevName);
139 
140  // return handle
141  return hnd;
142 }
#define BSCLIENT_TRY_ECODE(pClient, ecode, efmt,...)
Check if <b><i>BotSense</i></b> return value is not an error ( &lt; 0).
Definition: libBotSense.h:214
#define BS_I2C_SERVER_MOD
server plugin dll module
Definition: bsI2C.h:62
static BsClientAppInfo_T bsI2CAppInfo
<b><i>BotSense</i></b> client application information.
Definition: bsI2CClient.c:71
int bsI2CReqRead ( BsClient_P  pClient,
BsVConnHnd_T  hndVConn,
i2c_addr_t  i2cAddr,
size_t  uReadLen,
byte_t  rbuf[] 
)

Proxied request to read from a device attached to the I2C bus.

Parameters
pClient

Definition at line 171 of file bsI2CClient.c.

References BS_ECODE_BAD_VAL, BSCLIENT_HAS_VCONN, BSCLIENT_TRY_ECODE, BSCLIENT_TRY_EXPR, BSCLIENT_TRY_NM_ECODE, BSI2C_RSPREAD_READBUF_LEN, BsI2CMsgIdReqRead, BsI2CMsgIdRspRead, BsI2CPackReqRead(), BsI2CUnpackRspRead(), BSPROXY_BUF_BODY, BSPROXY_MSG_MAX_LEN, BsI2CReqRead_T::m_addr, BsI2CRspRead_T::m_count, BsI2CRspRead_T::m_readbuf, BsI2CReqRead_T::m_readlen, and BsI2CRspRead_T::u.

176 {
177  static BsI2CMsgId_T msgIdReq = BsI2CMsgIdReqRead;
178  static BsI2CMsgId_T msgIdRsp = BsI2CMsgIdRspRead;
179 
180  BsI2CReqRead_T msgReq; // request message
181  BsI2CRspRead_T msgRsp; // response message
182  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
183  bool_t bTrace; // do [not] trace messages
184  int n; // number of bytes/return code
185 
186  //
187  // Parameter checks.
188  //
189  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
190  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
191 
192  BSCLIENT_TRY_EXPR(pClient, (uReadLen <= (size_t)BSI2C_RSPREAD_READBUF_LEN),
193  BS_ECODE_BAD_VAL, "read_len=%zu > max_len=%zu",
194  uReadLen, (size_t)BSI2C_RSPREAD_READBUF_LEN);
195 
196  // trace state
197  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
198 
199  //
200  // Set request message values.
201  //
202  msgReq.m_addr = (ushort_t)i2cAddr;
203  msgReq.m_readlen = (byte_t)uReadLen;
204 
205  //
206  // Pack request.
207  //
208  n = BsI2CPackReqRead(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
209 
210  // check packing return code
211  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
212 
213  //
214  // Execute request-response transaction.
215  //
216  n = bsClientTrans(pClient, hndVConn,
217  msgIdReq, buf, (size_t)n,
218  msgIdRsp, buf, sizeof(buf));
219 
220  // check transaction return code
221  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
222 
223  //
224  // Unpack response.
225  //
226  n = BsI2CUnpackRspRead(buf, (size_t)n, &msgRsp, bTrace);
227 
228  // check unpack return code
229  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdRsp);
230 
231  //
232  // Set return values from response.
233  //
234  if( uReadLen > msgRsp.m_readbuf.m_count )
235  {
236  uReadLen = msgRsp.m_readbuf.m_count;
237  }
238  memcpy(rbuf, msgRsp.m_readbuf.u.m_buf, uReadLen);
239 
240  return (int)uReadLen;
241 }
RspRead.
Definition: bsI2CMsgs.h:42
#define BSCLIENT_TRY_ECODE(pClient, ecode, efmt,...)
Check if <b><i>BotSense</i></b> return value is not an error ( &lt; 0).
Definition: libBotSense.h:214
#define BS_ECODE_BAD_VAL
bad value
Definition: BotSense.h:77
ushort_t m_addr
addr
Definition: bsI2CMsgs.h:65
ReqRead.
Definition: bsI2CMsgs.h:40
struct BsI2CRspRead_T::@2 m_readbuf
vector
BsI2CMsgId_T
Definition: bsI2CMsgs.h:37
INLINE_IN_H int BsI2CUnpackRspRead(byte_t buf[], size_t uMsgLen, BsI2CRspRead_T *pStruct, bool_t bTrace)
Unpack a BsI2CRspRead ITV message in big-endian byte order from the input buffer. ...
Definition: bsI2CMsgs.h:344
INLINE_IN_H int BsI2CPackReqRead(BsI2CReqRead_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsI2CReqRead ITV message in big-endian byte order into the output buffer.
Definition: bsI2CMsgs.h:237
size_t m_count
vector item count
Definition: bsI2CMsgs.h:111
#define BSCLIENT_TRY_EXPR(pClient, expr, ecode, efmt,...)
Check if expression evaluates to true.
Definition: libBotSense.h:259
byte_t m_readlen
readlen
Definition: bsI2CMsgs.h:66
#define BSPROXY_BUF_BODY(buf)
Convenience macro to produce a buffer (offset, size) 2-tuple.
Definition: BotSense.h:272
#define BSI2C_RSPREAD_READBUF_LEN
Definition: bsI2CMsgs.h:102
#define BSCLIENT_HAS_VCONN(pClient, hnd)
Tests if the handle is valid and there is an established virtual connection.
Definition: libBotSense.h:285
#define BSCLIENT_TRY_NM_ECODE(pClient, nmecode, efmt,...)
Check if NetMsgs (un)packing return value is not an error ( &lt; 0).
Definition: libBotSense.h:236
#define BSPROXY_MSG_MAX_LEN
total message maximum length
Definition: BotSense.h:259
union BsI2CRspRead_T::@2::@3 u
aligned vector items
int bsI2CReqScan ( BsClient_P  pClient,
BsVConnHnd_T  hndVConn,
i2c_addr_t  bufScan[],
size_t  sizeScanBuf 
)

Proxied request to scan the I2C bus for all attached devices.

Parameters
pClient

Definition at line 433 of file bsI2CClient.c.

References BS_ECODE_BAD_VAL, BSCLIENT_HAS_VCONN, BSCLIENT_TRY_ECODE, BSCLIENT_TRY_EXPR, BSCLIENT_TRY_NM_ECODE, BsI2CMsgIdReqScan, BsI2CMsgIdRspScan, BsI2CUnpackRspScan(), BSPROXY_MSG_MAX_LEN, BsI2CRspScan_T::m_count, BsI2CRspScan_T::m_scan, and BsI2CRspScan_T::u.

437 {
438  static BsI2CMsgId_T msgIdReq = BsI2CMsgIdReqScan;
439  static BsI2CMsgId_T msgIdRsp = BsI2CMsgIdRspScan;
440 
441  BsI2CRspScan_T msgRsp; // response message
442  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
443  bool_t bTrace; // do [not] trace messages
444  int i; // working index
445  int n; // number of bytes/return code
446 
447  //
448  // Parameter checks.
449  //
450  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
451  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
452 
453  // trace state
454  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
455 
456  //
457  // Execute request-response transaction.
458  //
459  n = bsClientTrans(pClient, hndVConn,
460  msgIdReq, NULL, (size_t)0,
461  msgIdRsp, buf, sizeof(buf));
462 
463  // check transaction return code
464  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
465 
466  //
467  // Unpack response.
468  //
469  n = BsI2CUnpackRspScan(buf, (size_t)n, &msgRsp, bTrace);
470 
471  // check unpack return code
472  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdRsp);
473 
474  //
475  // Set return values from response.
476  //
477  n = sizeScanBuf < (size_t)msgRsp.m_scan.m_count?
478  (int)sizeScanBuf: (int)msgRsp.m_scan.m_count;
479 
480  for(i=0; i<n; ++i)
481  {
482  bufScan[i] = (i2c_addr_t)msgRsp.m_scan.u.m_buf[i];
483  }
484 
485  return n;
486 }
#define BSCLIENT_TRY_ECODE(pClient, ecode, efmt,...)
Check if <b><i>BotSense</i></b> return value is not an error ( &lt; 0).
Definition: libBotSense.h:214
#define BS_ECODE_BAD_VAL
bad value
Definition: BotSense.h:77
size_t m_count
vector item count
Definition: bsI2CMsgs.h:175
RspScan.
Definition: bsI2CMsgs.h:46
BsI2CMsgId_T
Definition: bsI2CMsgs.h:37
ReqScan.
Definition: bsI2CMsgs.h:45
struct BsI2CRspScan_T::@6 m_scan
vector
#define BSCLIENT_TRY_EXPR(pClient, expr, ecode, efmt,...)
Check if expression evaluates to true.
Definition: libBotSense.h:259
#define BSCLIENT_HAS_VCONN(pClient, hnd)
Tests if the handle is valid and there is an established virtual connection.
Definition: libBotSense.h:285
#define BSCLIENT_TRY_NM_ECODE(pClient, nmecode, efmt,...)
Check if NetMsgs (un)packing return value is not an error ( &lt; 0).
Definition: libBotSense.h:236
#define BSPROXY_MSG_MAX_LEN
total message maximum length
Definition: BotSense.h:259
union BsI2CRspScan_T::@6::@7 u
aligned vector items
INLINE_IN_H int BsI2CUnpackRspScan(byte_t buf[], size_t uMsgLen, BsI2CRspScan_T *pStruct, bool_t bTrace)
Unpack a BsI2CRspScan ITV message in big-endian byte order from the input buffer. ...
Definition: bsI2CMsgs.h:473
int bsI2CReqTrans ( BsClient_P  pClient,
BsVConnHnd_T  hndVConn,
i2c_addr_t  i2cAddr,
byte_t  wbuf[],
size_t  uWriteLen,
size_t  uReadLen,
byte_t  rbuf[] 
)

Proxied request to execute a write-read transaction to a device attached to the I2C bus.

Parameters
pClient

Definition at line 340 of file bsI2CClient.c.

References BS_ECODE_BAD_VAL, BSCLIENT_HAS_VCONN, BSCLIENT_TRY_ECODE, BSCLIENT_TRY_EXPR, BSCLIENT_TRY_NM_ECODE, BSI2C_REQTRANS_WRITEBUF_LEN, BSI2C_RSPREAD_READBUF_LEN, BsI2CMsgIdReqTrans, BsI2CMsgIdRspRead, BsI2CPackReqTrans(), BsI2CUnpackRspRead(), BSPROXY_BUF_BODY, BSPROXY_MSG_MAX_LEN, BsI2CReqTrans_T::m_addr, BsI2CReqTrans_T::m_count, BsI2CRspRead_T::m_count, BsI2CRspRead_T::m_readbuf, BsI2CReqTrans_T::m_readlen, BsI2CReqTrans_T::m_writebuf, BsI2CReqTrans_T::u, and BsI2CRspRead_T::u.

347 {
348  static BsI2CMsgId_T msgIdReq = BsI2CMsgIdReqTrans;
349  static BsI2CMsgId_T msgIdRsp = BsI2CMsgIdRspRead;
350 
351  BsI2CReqTrans_T msgReq; // request message
352  BsI2CRspRead_T msgRsp; // response message
353  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
354  bool_t bTrace; // do [not] trace messages
355  int n; // number of bytes/return code
356 
357  //
358  // Parameter checks.
359  //
360  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
361  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
362 
363  BSCLIENT_TRY_EXPR(pClient,
364  (uWriteLen <= (size_t)BSI2C_REQTRANS_WRITEBUF_LEN), BS_ECODE_BAD_VAL,
365  "write_len=%zu > max_len=%zu",
366  uWriteLen, (size_t)BSI2C_REQTRANS_WRITEBUF_LEN);
367 
368  BSCLIENT_TRY_EXPR(pClient, (uReadLen <= (size_t)BSI2C_RSPREAD_READBUF_LEN),
369  BS_ECODE_BAD_VAL, "read_len=%zu > max_len=%zu",
370  uReadLen, (size_t)BSI2C_RSPREAD_READBUF_LEN);
371 
372  // trace state
373  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
374 
375  //
376  // Set request message values.
377  //
378  msgReq.m_addr = (ushort_t)i2cAddr;
379  memcpy(msgReq.m_writebuf.u.m_buf, wbuf, uWriteLen);
380  msgReq.m_writebuf.m_count = uWriteLen;
381  msgReq.m_readlen = (byte_t)uReadLen;
382 
383  //
384  // Pack request.
385  //
386  n = BsI2CPackReqTrans(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
387 
388  // check packing return code
389  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
390 
391  //
392  // Execute request-response server transaction.
393  //
394  n = bsClientTrans(pClient, hndVConn,
395  msgIdReq, buf, (size_t)n,
396  msgIdRsp, buf, sizeof(buf));
397 
398  // check transaction return code
399  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
400 
401  //
402  // Unpack response.
403  //
404  n = BsI2CUnpackRspRead(buf, (size_t)n, &msgRsp, bTrace);
405 
406  // check unpack return code
407  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdRsp);
408 
409  //
410  // Set return values from response.
411  //
412  if( uReadLen > msgRsp.m_readbuf.m_count )
413  {
414  uReadLen = msgRsp.m_readbuf.m_count;
415  }
416  memcpy(rbuf, msgRsp.m_readbuf.u.m_buf, uReadLen);
417 
418  return (int)uReadLen;
419 }
RspRead.
Definition: bsI2CMsgs.h:42
struct BsI2CReqTrans_T::@0 m_writebuf
vector
#define BSCLIENT_TRY_ECODE(pClient, ecode, efmt,...)
Check if <b><i>BotSense</i></b> return value is not an error ( &lt; 0).
Definition: libBotSense.h:214
#define BS_ECODE_BAD_VAL
bad value
Definition: BotSense.h:77
INLINE_IN_H int BsI2CPackReqTrans(BsI2CReqTrans_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsI2CReqTrans ITV message in big-endian byte order into the output buffer. ...
Definition: bsI2CMsgs.h:280
byte_t m_readlen
readlen
Definition: bsI2CMsgs.h:93
struct BsI2CRspRead_T::@2 m_readbuf
vector
size_t m_count
vector item count
Definition: bsI2CMsgs.h:85
BsI2CMsgId_T
Definition: bsI2CMsgs.h:37
INLINE_IN_H int BsI2CUnpackRspRead(byte_t buf[], size_t uMsgLen, BsI2CRspRead_T *pStruct, bool_t bTrace)
Unpack a BsI2CRspRead ITV message in big-endian byte order from the input buffer. ...
Definition: bsI2CMsgs.h:344
ReqTrans.
Definition: bsI2CMsgs.h:41
ushort_t m_addr
addr
Definition: bsI2CMsgs.h:82
union BsI2CReqTrans_T::@0::@1 u
aligned vector items
size_t m_count
vector item count
Definition: bsI2CMsgs.h:111
#define BSCLIENT_TRY_EXPR(pClient, expr, ecode, efmt,...)
Check if expression evaluates to true.
Definition: libBotSense.h:259
#define BSI2C_REQTRANS_WRITEBUF_LEN
Definition: bsI2CMsgs.h:75
#define BSPROXY_BUF_BODY(buf)
Convenience macro to produce a buffer (offset, size) 2-tuple.
Definition: BotSense.h:272
#define BSI2C_RSPREAD_READBUF_LEN
Definition: bsI2CMsgs.h:102
#define BSCLIENT_HAS_VCONN(pClient, hnd)
Tests if the handle is valid and there is an established virtual connection.
Definition: libBotSense.h:285
#define BSCLIENT_TRY_NM_ECODE(pClient, nmecode, efmt,...)
Check if NetMsgs (un)packing return value is not an error ( &lt; 0).
Definition: libBotSense.h:236
#define BSPROXY_MSG_MAX_LEN
total message maximum length
Definition: BotSense.h:259
union BsI2CRspRead_T::@2::@3 u
aligned vector items
int bsI2CReqWrite ( BsClient_P  pClient,
BsVConnHnd_T  hndVConn,
i2c_addr_t  i2cAddr,
byte_t  wbuf[],
size_t  uWriteLen 
)

Proxied request to write to a device attached to the I2C bus.

Parameters
pClient

Definition at line 256 of file bsI2CClient.c.

References BS_ECODE_BAD_VAL, BSCLIENT_HAS_VCONN, BSCLIENT_TRY_ECODE, BSCLIENT_TRY_EXPR, BSCLIENT_TRY_NM_ECODE, BSI2C_REQWRITE_WRITEBUF_LEN, BsI2CMsgIdReqWrite, BsI2CMsgIdRspWrite, BsI2CPackReqWrite(), BsI2CUnpackRspWrite(), BSPROXY_BUF_BODY, BSPROXY_MSG_MAX_LEN, BsI2CReqWrite_T::m_addr, BsI2CRspWrite_T::m_byteswritten, BsI2CReqWrite_T::m_count, BsI2CReqWrite_T::m_writebuf, and BsI2CReqWrite_T::u.

261 {
262  static BsI2CMsgId_T msgIdReq = BsI2CMsgIdReqWrite;
263  static BsI2CMsgId_T msgIdRsp = BsI2CMsgIdRspWrite;
264 
265  BsI2CReqWrite_T msgReq; // request message
266  BsI2CRspWrite_T msgRsp; // response message
267  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
268  bool_t bTrace; // do [not] trace messages
269  int n; // number of bytes/return code
270 
271  //
272  // Parameter checks.
273  //
274  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
275  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
276 
277  BSCLIENT_TRY_EXPR(pClient,
278  (uWriteLen <= (size_t)BSI2C_REQWRITE_WRITEBUF_LEN), BS_ECODE_BAD_VAL,
279  "write_len=%zu > max_len=%zu",
280  uWriteLen, (size_t)BSI2C_REQWRITE_WRITEBUF_LEN);
281 
282  // trace state
283  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
284 
285  //
286  // Set request message values.
287  //
288  msgReq.m_addr = (ushort_t)i2cAddr;
289  memcpy(msgReq.m_writebuf.u.m_buf, wbuf, uWriteLen);
290  msgReq.m_writebuf.m_count = uWriteLen;
291 
292  //
293  // Pack request.
294  //
295  n = BsI2CPackReqWrite(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
296 
297  // check packing return code
298  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
299 
300  //
301  // Execute request-response transaction.
302  //
303  n = bsClientTrans(pClient, hndVConn,
304  msgIdReq, buf, (size_t)n,
305  msgIdRsp, buf, sizeof(buf));
306 
307  // check transaction return code
308  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
309 
310  //
311  // Unpack response.
312  //
313  n = BsI2CUnpackRspWrite(buf, (size_t)n, &msgRsp, bTrace);
314 
315  // check unpack return code
316  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdRsp);
317 
318  //
319  // Set return values from response.
320  //
321  return (int)msgRsp.m_byteswritten;
322 }
ushort_t m_addr
addr
Definition: bsI2CMsgs.h:134
#define BSCLIENT_TRY_ECODE(pClient, ecode, efmt,...)
Check if <b><i>BotSense</i></b> return value is not an error ( &lt; 0).
Definition: libBotSense.h:214
#define BS_ECODE_BAD_VAL
bad value
Definition: BotSense.h:77
union BsI2CReqWrite_T::@4::@5 u
aligned vector items
INLINE_IN_H int BsI2CPackReqWrite(BsI2CReqWrite_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsI2CReqWrite ITV message in big-endian byte order into the output buffer. ...
Definition: bsI2CMsgs.h:366
struct BsI2CReqWrite_T::@4 m_writebuf
vector
BsI2CMsgId_T
Definition: bsI2CMsgs.h:37
RspWrite.
Definition: bsI2CMsgs.h:44
INLINE_IN_H int BsI2CUnpackRspWrite(byte_t buf[], size_t uMsgLen, BsI2CRspWrite_T *pStruct, bool_t bTrace)
Unpack a BsI2CRspWrite ITV message in big-endian byte order from the input buffer.
Definition: bsI2CMsgs.h:430
byte_t m_byteswritten
byteswritten
Definition: bsI2CMsgs.h:157
ReqWrite.
Definition: bsI2CMsgs.h:43
#define BSCLIENT_TRY_EXPR(pClient, expr, ecode, efmt,...)
Check if expression evaluates to true.
Definition: libBotSense.h:259
size_t m_count
vector item count
Definition: bsI2CMsgs.h:137
#define BSPROXY_BUF_BODY(buf)
Convenience macro to produce a buffer (offset, size) 2-tuple.
Definition: BotSense.h:272
#define BSCLIENT_HAS_VCONN(pClient, hnd)
Tests if the handle is valid and there is an established virtual connection.
Definition: libBotSense.h:285
#define BSI2C_REQWRITE_WRITEBUF_LEN
Definition: bsI2CMsgs.h:127
#define BSCLIENT_TRY_NM_ECODE(pClient, nmecode, efmt,...)
Check if NetMsgs (un)packing return value is not an error ( &lt; 0).
Definition: libBotSense.h:236
#define BSPROXY_MSG_MAX_LEN
total message maximum length
Definition: BotSense.h:259

Variable Documentation

BsClientAppInfo_T bsI2CAppInfo
static
Initial value:
=
{
.app_name = "libbsclient_i2c",
.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.",
.fnGetMsgName = bsI2CGetMsgName
}
const char * bsI2CGetMsgName(BsClient_P pClient, BsVConnHnd_T hndVConn, uint_t uMsgId)
Get the I2C message name.
Definition: bsI2CClient.c:101

BotSense client application information.

Definition at line 71 of file bsI2CClient.c.