ISO15765Development.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. //#define ISO16765Example
  2. #ifdef ISO16765Example
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include "lib_iso15765.h"
  6. #include <windows.h>
  7. #include <sysinfoapi.h>
  8. #include <conio.h>
  9. /******************************************************************************
  10. * Declaration | Static Functions
  11. ******************************************************************************/
  12. static uint8_t send_frame1(cbus_id_type id_type, uint32_t id, cbus_fr_format fr_fmt, uint8_t dlc, uint8_t* dt);
  13. static uint8_t send_frame2(cbus_id_type id_type, uint32_t id, cbus_fr_format fr_fmt, uint8_t dlc, uint8_t* dt);
  14. static void indn1(n_indn_t* info);
  15. static void indn2(n_indn_t* info);
  16. static void on_error(n_rslt err_type);
  17. static uint32_t getms();
  18. /******************************************************************************
  19. * Enumerations, structures & Variables
  20. ******************************************************************************/
  21. static iso15765_t handler1 =
  22. {
  23. .addr_md = N_ADM_FIXED,
  24. .fr_id_type = CBUS_ID_T_EXTENDED,
  25. .clbs.send_frame = send_frame1,
  26. .clbs.on_error = on_error,
  27. .clbs.get_ms = getms,
  28. .clbs.indn = indn1,
  29. .config.stmin = 0x3,
  30. .config.bs = 0x0f,
  31. .config.n_bs = 100,
  32. .config.n_cr = 3
  33. };
  34. static iso15765_t handler2 =
  35. {
  36. .addr_md = N_ADM_FIXED,
  37. .fr_id_type = CBUS_ID_T_EXTENDED,
  38. .clbs.send_frame = send_frame2,
  39. .clbs.on_error = on_error,
  40. .clbs.indn = indn2,
  41. .clbs.get_ms = getms,
  42. .config.stmin = 0x3,
  43. .config.bs = 0x0f,
  44. .config.n_bs = 100,
  45. .config.n_cr = 3
  46. };
  47. n_req_t frame1 =
  48. {
  49. .n_ai.n_pr = 0x07,
  50. .n_ai.n_sa = 0x01,
  51. .n_ai.n_ta = 0x02,
  52. .n_ai.n_ae = 0x00,
  53. .n_ai.n_tt = N_TA_T_PHY,
  54. .fr_fmt = CBUS_FR_FRM_STD,
  55. .msg = {0},
  56. .msg_sz = 0,
  57. };
  58. n_req_t frame2 =
  59. {
  60. .n_ai.n_pr = 0x07,
  61. .n_ai.n_sa = 0x02,
  62. .n_ai.n_ta = 0x01,
  63. .n_ai.n_ae = 0x00,
  64. .n_ai.n_tt = N_TA_T_PHY,
  65. .fr_fmt = CBUS_FR_FRM_STD,
  66. .msg = {0},
  67. .msg_sz = 0,
  68. };
  69. /******************************************************************************
  70. * Definition | Static Functions
  71. ******************************************************************************/
  72. uint16_t f_sz1 = 1;
  73. uint16_t f_sz2 = 1;
  74. static void rand_string(char* str, size_t size)
  75. {
  76. const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
  77. for (size_t n = 0; n < size; n++)
  78. {
  79. int key = rand() % ((int)sizeof(charset) - 1);
  80. str[n] = charset[key];
  81. }
  82. }
  83. static uint32_t getms()
  84. {
  85. return GetTickCount();;
  86. }
  87. static void print_frame(uint8_t instance,uint8_t tp_mode, cbus_id_type mode, uint32_t id, uint8_t ctp_ft, uint8_t dlc, uint8_t* dt)
  88. {
  89. printf(" (%d) - %d | TpMode: [%02x] | FrameType: [%2d] IdType: [%d] Id: [%8x] DLC: [%02d]\t\t", instance, GetTickCount(), tp_mode, mode, ctp_ft, id, dlc);
  90. for (int s = 0; s < (int)dlc; s += 8)
  91. {
  92. int elements = (int)dlc - s > 8 ? 8 : (int)dlc - s;
  93. for (int i = s; i < (s+8); i++)
  94. {
  95. printf((i< (s+elements))? "%02x " : " ", dt[i]);
  96. }
  97. printf("\t");
  98. if ((s+elements) == (int)dlc)
  99. {
  100. printf("\n");
  101. }
  102. else
  103. {
  104. printf("\n |\t\t\t\t\t\t\t\t\t\t\t\t\t");
  105. }
  106. }
  107. }
  108. static uint8_t send_frame1(cbus_id_type id_type, uint32_t id, cbus_fr_format fr_fmt, uint8_t dlc, uint8_t* dt)
  109. {
  110. print_frame(1,handler2.addr_md, id_type, id, fr_fmt, dlc, dt);
  111. canbus_frame_t frame = { .id = id, .dlc = dlc, .id_type = id_type, .fr_format= fr_fmt };
  112. memmove(frame.dt, dt, dlc);
  113. iso15765_enqueue(&handler2, &frame);
  114. return 0;
  115. }
  116. static uint8_t send_frame2(cbus_id_type id_type, uint32_t id, cbus_fr_format fr_fmt, uint8_t dlc, uint8_t* dt)
  117. {
  118. print_frame(2, handler1.addr_md, id_type, id, fr_fmt, dlc, dt);
  119. canbus_frame_t frame = { .id = id, .dlc = dlc, .id_type = id_type, .fr_format = fr_fmt };
  120. memmove(frame.dt, dt, dlc);
  121. iso15765_enqueue(&handler1, &frame);
  122. return 0;
  123. }
  124. static void on_error(n_rslt err_type)
  125. {
  126. printf("ERROR OCCURED!:%04x", err_type);
  127. }
  128. static void indn1(n_indn_t* info)
  129. {
  130. uint8_t v = 'X';
  131. uint8_t s = 'X';
  132. if (info->msg_sz == frame2.msg_sz)
  133. {
  134. s = 'V';
  135. }
  136. if (memcmp(info->msg, frame2.msg, info->msg_sz) == 0)
  137. {
  138. v = 'V';
  139. }
  140. printf("- Reception of H1. Msg_sz:[%d] | SZ_CH[%c] MSG_CH[%c]\n",info->msg_sz,s,v);
  141. if ((v != 'V') || (s != 'V'))
  142. {
  143. printf("--------- ERROR -----------\n");
  144. Sleep(1000);
  145. }
  146. printf("- END OF TRANSMISSION/RECEPTION -\n\n\n");
  147. frame1.msg_sz = f_sz1;
  148. rand_string(frame1.msg, frame1.msg_sz);
  149. f_sz1 = f_sz1 == 512 ? 0 : f_sz1 + 1;
  150. iso15765_send(&handler1, &frame1);
  151. }
  152. static void indn2(n_indn_t* info)
  153. {
  154. uint8_t v = 'X';
  155. uint8_t s = 'X';
  156. if (info->msg_sz == frame1.msg_sz)
  157. {
  158. s = 'V';
  159. }
  160. if (memcmp(info->msg, frame1.msg, info->msg_sz) == 0)
  161. {
  162. v = 'V';
  163. }
  164. printf("- Reception of H2. Msg_sz:[%d] | SZ_CH[%c] MSG_CH[%c]\n", info->msg_sz, s, v);
  165. if ((v != 'V') || (s != 'V'))
  166. {
  167. printf("--------- ERROR -----------\n");
  168. Sleep(1000);
  169. }
  170. printf("- END OF TRANSMISSION/RECEPTION -\n\n\n");
  171. frame2.msg_sz = f_sz2;
  172. rand_string(frame2.msg, frame2.msg_sz);
  173. f_sz2 = f_sz2 == 512 ? 0 : f_sz2 + 1;
  174. iso15765_send(&handler2, &frame2);
  175. }
  176. /******************************************************************************
  177. * Definition | Public Functions
  178. ******************************************************************************/
  179. int main()
  180. {
  181. iso15765_init(&handler1);
  182. iso15765_init(&handler2);
  183. frame1.msg_sz = f_sz1;
  184. rand_string(frame1.msg, frame1.msg_sz);
  185. f_sz1++;
  186. iso15765_send(&handler1, &frame1);
  187. while (1)
  188. {
  189. iso15765_process(&handler1);
  190. iso15765_process(&handler2);
  191. }
  192. return 0;
  193. }
  194. #endif