chan.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #ifndef CHAN_H
  2. #define CHAN_H
  3. #if 0
  4. /* special address description flags for the CAN_ID */
  5. #define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */
  6. #define CAN_RTR_FLAG 0x40000000U /* remote transmission request */
  7. #define CAN_ERR_FLAG 0x20000000U /* error frame */
  8. /* valid bits in CAN ID for frame formats */
  9. #define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */
  10. #define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */
  11. #define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
  12. /*
  13. * Controller Area Network Identifier structure
  14. *
  15. * bit 0-28 : CAN identifier (11/29 bit)
  16. * bit 29 : error frame flag (0 = data frame, 1 = error frame)
  17. * bit 30 : remote transmission request flag (1 = rtr frame)
  18. * bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
  19. */
  20. typedef __u32 canid_t;
  21. /*
  22. * Controller Area Network Error Frame Mask structure
  23. *
  24. * bit 0-28 : error class mask (see include/linux/can/error.h)
  25. * bit 29-31 : set to zero
  26. */
  27. typedef __u32 can_err_mask_t;
  28. /**
  29. * struct can_frame - basic CAN frame structure
  30. * @can_id: the CAN ID of the frame and CAN_*_FLAG flags, see above.
  31. * @can_dlc: the data length field of the CAN frame
  32. * @data: the CAN frame payload.
  33. */
  34. struct can_frame {
  35. canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
  36. __u8 can_dlc; /* data length code: 0 .. 8 */
  37. __u8 data[8] __attribute__((aligned(8)));
  38. };
  39. /* particular protocols of the protocol family PF_CAN */
  40. #define CAN_RAW 1 /* RAW sockets */
  41. #define CAN_BCM 2 /* Broadcast Manager */
  42. #define CAN_TP16 3 /* VAG Transport Protocol v1.6 */
  43. #define CAN_TP20 4 /* VAG Transport Protocol v2.0 */
  44. #define CAN_MCNET 5 /* Bosch MCNet */
  45. #define CAN_ISOTP 6 /* ISO 15765-2 Transport Protocol */
  46. #define CAN_NPROTO 7
  47. #define SOL_CAN_BASE 100
  48. /**
  49. * struct sockaddr_can - the sockaddr structure for CAN sockets
  50. * @can_family: address family number AF_CAN.
  51. * @can_ifindex: CAN network interface index.
  52. * @can_addr: protocol specific address information
  53. */
  54. struct sockaddr_can {
  55. sa_family_t can_family;
  56. int can_ifindex;
  57. union {
  58. /* transport protocol class address information (e.g. ISOTP) */
  59. struct { canid_t rx_id, tx_id; } tp;
  60. /* reserved for future CAN protocols address information */
  61. } can_addr;
  62. };
  63. /**
  64. * struct can_filter - CAN ID based filter in can_register().
  65. * @can_id: relevant bits of CAN ID which are not masked out.
  66. * @can_mask: CAN mask (see description)
  67. *
  68. * Description:
  69. * A filter matches, when
  70. *
  71. * <received_can_id> & mask == can_id & mask
  72. *
  73. * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
  74. * filter for error frames (CAN_ERR_FLAG bit set in mask).
  75. */
  76. struct can_filter {
  77. canid_t can_id;
  78. canid_t can_mask;
  79. };
  80. /** * The size of a ring buffer.
  81. * Due to the design only <tt> RING_BUFFER_SIZE-1 </tt> items
  82. * can be contained in the buffer.
  83. * The buffer size must be a power of two.
  84. */
  85. #define RING_BUFFER_SIZE 0x100
  86. #if (RING_BUFFER_SIZE & (RING_BUFFER_SIZE - 1)) != 0
  87. #error "RING_BUFFER_SIZE must be a power of two"
  88. #endif
  89. /**
  90. * Used as a modulo operator
  91. * as <tt> a % b = (a & (b ? 1)) </tt>
  92. * where \c a is a positive index in the buffer and
  93. * \c b is the (power of two) size of the buffer.
  94. */
  95. #define RING_BUFFER_MASK (RING_BUFFER_SIZE-1)
  96. /** * The type which is used to hold the size
  97. * and the indicies of the buffer.
  98. * Must be able to fit \c RING_BUFFER_SIZE .
  99. */
  100. //typedef uint8_t ring_buffer_size_t;
  101. typedef int ring_buffer_size_t;
  102. typedef struct tag_ring_buffer_element{
  103. char c;
  104. struct can_frame frame;
  105. }ring_buffer_element_t;
  106. /**
  107. * Simplifies the use of <tt>struct ring_buffer_t</tt>.
  108. */
  109. typedef struct ring_buffer_t ring_buffer_t;
  110. /**
  111. * Structure which holds a ring buffer.
  112. * The buffer contains a buffer array
  113. * as well as metadata for the ring buffer.
  114. */
  115. struct ring_buffer_t {
  116. /** Buffer memory. */
  117. //char buffer[RING_BUFFER_SIZE];
  118. ring_buffer_element_t buffer[RING_BUFFER_SIZE];
  119. /** Index of tail. */
  120. ring_buffer_size_t tail_index;
  121. /** Index of head. */
  122. ring_buffer_size_t head_index;
  123. };
  124. #define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */
  125. #endif
  126. //#define chan_lock(idx) pthread_mutex_lock(&chan[idx].mutex)
  127. //#define chan_unlock(idx) pthread_mutex_unlock(&chan[idx].mutex)
  128. #include "netinet/in.h"
  129. #include "modbus.h"
  130. #include "chan_serial_ringbuffer.h"
  131. #include "chan_tcpservcan_ringbuffer.h"
  132. #include "chan_socketcan_ringbuffer.h"
  133. #include "chan_serial_ringbuffer.h"
  134. #include "comm.h"
  135. #include "sm.h"
  136. struct chanthrd_param_t
  137. {
  138. int bidx;
  139. int idx;
  140. int ival;
  141. };
  142. enum chanmode_t{
  143. CHANMODE_UNKNOWN = 0,
  144. CHANMODE_SERIAL,
  145. CHANMODE_SOCKET_CAN,
  146. CHANMODE_TCPSERV_CAN,
  147. CHANMODE_MODBUS_RTU,
  148. CHANMODE_MODBUS_RTU_SLAVE,
  149. CHANMODE_MODBUS_TCP,
  150. CHANMODE_MODBUS_TCP_SLAVE,
  151. CHANMODE_UDP2SERIAL,
  152. CHANMODE_TCP2SERIAL,
  153. CHANMODE_DI,
  154. CHANMODE_DO,
  155. //CHANMODE_TCP2CAN,
  156. };
  157. typedef struct _modbus modbus_t;
  158. struct chan_t
  159. {
  160. //char szProtocol[16];
  161. double rstcnt;
  162. char servip[16];
  163. int servport;
  164. //int slaveaddr;
  165. char szinfo[32];
  166. int cmd;
  167. int state;
  168. char szState[16];
  169. int err;
  170. int dbg;
  171. int en;
  172. //int mbsidx; /* MB[] index */
  173. //int mbsdevm;
  174. //int mbsdevidx;
  175. modbus_t* ctx;
  176. modbus_mapping_t *mb_mapping;
  177. int fd;
  178. int baud;
  179. char szparity[8];
  180. char szdev[32];
  181. int port;
  182. char szmode[32];
  183. int mode;
  184. int sockfd;
  185. struct sockaddr_in servAdr;
  186. //int bEnable;
  187. unsigned int errcnt;
  188. unsigned int errcnt_max; // max errCnt in 5min
  189. pthread_mutex_t mutex;
  190. pthread_mutex_t mutexdat;
  191. int started;
  192. int restart_times;
  193. int retry_times;
  194. chan_serial_ringbuffer_t* serial_rxrb;
  195. chan_serial_ringbuffer_t* serial_txrb;
  196. chan_socketcan_ringbuffer_t* socketcan_rxrb;
  197. chan_socketcan_ringbuffer_t* socketcan_txrb;
  198. chan_tcpservcan_ringbuffer_t* tcpservcan_rxrb;
  199. chan_tcpservcan_ringbuffer_t* tcpservcan_txrb;
  200. };
  201. int chan_init( );
  202. int chan_check_open();
  203. int chan_check_close();
  204. int chan_read_bits(int idx, int slaveaddr, int regaddr, int nb, unsigned char* dest );
  205. int chan_write_multi_registers( int idx, int slaveaddr, int regaddr, int nb, unsigned short* regval );
  206. int chan_read_holdingregisters( int idx, int slaveaddr, int regaddr, int nb, unsigned short* regval );
  207. int chan_write_single_register(int idx, int slaveaddr, int regaddr, int regval );
  208. int chan_write_single_register_with_retry(int idx, int slaveaddr, int regaddr, int regval );
  209. int chan_write_bit( int idx, int slaveaddr, int addr, int status );
  210. int chan_write_bits( int idx, int slaveaddr, int addr, int nb,unsigned char *status );
  211. int chan_read_gpio( int idx, int* val);
  212. int chan_write_gpio( int idx, int val);
  213. int chan_reset( int idx );
  214. int chan_start( int idx );
  215. int chan_read_input_bits( int idx, int slaveaddr, int regaddr, int nb, unsigned char* dest );
  216. int chan_read_input_bits_with_retry(int idx, int slaveaddr, int regaddr, int nb, unsigned char* dest );
  217. int chan_read_input_registers( int idx, int slaveaddr, int regaddr, int nb, unsigned short* dest );
  218. int chan_read_input_registers_with_retry(int idx, int slaveaddr, int regaddr, int nb, unsigned short* regval );
  219. int chan_set_dbg( int idx, int enable );
  220. int chan_set_en( int idx, int enable );
  221. int chan_get_en( int idx );
  222. void chan_set_mbs( int idx, int mbsdevm, int mbsdevidx );
  223. int chan_read_holdingregisters_with_retry(int idx, int slaveaddr, int regaddr, int nb, unsigned short* regval );
  224. int chan_mode_str2nbr(char* szmode);
  225. int chan_set_nbr(int nbr);
  226. int chan_get_nbr();
  227. int chan_get_mode(int idx);
  228. void chan_serial_rxrb_init(int idx);
  229. void chan_serial_txrb_init(int idx);
  230. void chan_serial_rxrb_queue(int idx, chan_serial_ringbuffer_element_t e);
  231. int chan_serial_rxrb_dequeue_arr(int idx, chan_serial_ringbuffer_element_t* e, int len);
  232. int chan_serial_rxrb_num_items(int idx);
  233. int chan_serial_txrb_num_items( int idx );
  234. int chan_serial_txrb_dequeue_arr( int idx, chan_serial_ringbuffer_element_t* e, int len );
  235. void chan_serial_txrb_queue_arr( int idx, chan_serial_ringbuffer_element_t* e, int len );
  236. char* chan_get_info_str(int idx);
  237. char* chan_get_servip_str(int idx);
  238. int chan_get_servport(int idx);
  239. int chan_get_baud(int idx);
  240. char* chan_get_parity_str(int idx);
  241. char* chan_get_dev_str(int idx);
  242. int chan_get_port(int idx);
  243. char* chan_get_mode_str(int idx);
  244. int chan_get_errcnt(int idx);
  245. int chan_get_started(int idx);
  246. int chan_get_restart_times(int idx);
  247. int chan_get_retry_times(int idx);
  248. int chan_get_dbg(int idx);
  249. void chan_lock(int idx);
  250. void chan_unlock(int idx);
  251. int chan_get_tool_data(int idx,char* buf);
  252. int chan_get_tool_all_data(char* buf);
  253. int chan_get_bkds_data(char *buf);
  254. int chan_socketcan_rxrb_num_items(int idx);
  255. void chan_socketcan_rxrb_queue(int idx, chan_socketcan_ringbuffer_element_t e);
  256. void chan_socketcan_rxrb_queue_arr(int idx, chan_socketcan_ringbuffer_element_t *e, int len);
  257. int chan_socketcan_rxrb_dequeue(int idx, chan_socketcan_ringbuffer_element_t *e);
  258. int chan_socketcan_rxrb_dequeue_arr(int idx, chan_socketcan_ringbuffer_element_t *e, int len);
  259. int chan_socketcan_txrb_num_items(int idx);
  260. int chan_socketcan_txrb_dequeue_arr(int idx, chan_socketcan_ringbuffer_element_t *e, int len);
  261. int chan_socketcan_txrb_dequeue(int idx, chan_socketcan_ringbuffer_element_t *e);
  262. void chan_socketcan_txrb_queue(int idx, chan_socketcan_ringbuffer_element_t e);
  263. void chan_tcpservcan_rxrb_queue(int idx, chan_tcpservcan_ringbuffer_element_t e);
  264. int chan_tcpservcan_txrb_num_items(int idx);
  265. int chan_tcpservcan_txrb_dequeue_arr(int idx, chan_tcpservcan_ringbuffer_element_t *e, int len);
  266. #endif /* CHAN_H */