vio.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. /******************************************************************************
  2. * @file vio.c
  3. * @brief Virtual I/O implementation template
  4. * @version V1.0.0
  5. * @date 23. March 2020
  6. ******************************************************************************/
  7. /*
  8. * Copyright (c) 2019-2020 Arm Limited. All rights reserved.
  9. *
  10. * SPDX-License-Identifier: Apache-2.0
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the License); you may
  13. * not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  20. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. */
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <stdarg.h>
  27. #include "cmsis_vio.h"
  28. #include "RTE_Components.h" // Component selection
  29. #include CMSIS_device_header
  30. #if !defined CMSIS_VOUT || !defined CMSIS_VIN
  31. // Add user includes here:
  32. #endif
  33. // VIO input, output definitions
  34. #define VIO_PRINT_MAX_SIZE 64U // maximum size of print memory
  35. #define VIO_PRINTMEM_NUM 4U // number of print memories
  36. #define VIO_VALUE_NUM 3U // number of values
  37. #define VIO_VALUEXYZ_NUM 3U // number of XYZ values
  38. #define VIO_IPV4_ADDRESS_NUM 2U // number of IPv4 addresses
  39. #define VIO_IPV6_ADDRESS_NUM 2U // number of IPv6 addresses
  40. // VIO input, output variables
  41. __USED uint32_t vioSignalIn; // Memory for incoming signal
  42. __USED uint32_t vioSignalOut; // Memory for outgoing signal
  43. __USED char vioPrintMem[VIO_PRINTMEM_NUM][VIO_PRINT_MAX_SIZE]; // Memory for the last value for each level
  44. __USED int32_t vioValue [VIO_VALUE_NUM]; // Memory for value used in vioGetValue/vioSetValue
  45. __USED vioValueXYZ_t vioValueXYZ[VIO_VALUEXYZ_NUM]; // Memory for XYZ value for 3-D vector
  46. __USED vioAddrIPv4_t vioAddrIPv4[VIO_IPV4_ADDRESS_NUM]; // Memory for IPv4 address value used in vioSetIPv4/vioGetIPv4
  47. __USED vioAddrIPv6_t vioAddrIPv6[VIO_IPV6_ADDRESS_NUM]; // Memory for IPv6 address value used in vioSetIPv6/vioGetIPv6
  48. #if !defined CMSIS_VOUT
  49. // Add global user types, variables, functions here:
  50. #endif
  51. #if !defined CMSIS_VIN
  52. // Add global user types, variables, functions here:
  53. #endif
  54. // Initialize test input, output.
  55. void vioInit (void) {
  56. #if !defined CMSIS_VOUT
  57. // Add user variables here:
  58. #endif
  59. #if !defined CMSIS_VIN
  60. // Add user variables here:
  61. #endif
  62. vioSignalIn = 0U;
  63. vioSignalOut = 0U;
  64. memset (vioPrintMem, 0, sizeof(vioPrintMem));
  65. memset (vioValue, 0, sizeof(vioValue));
  66. memset (vioValueXYZ, 0, sizeof(vioValueXYZ));
  67. memset (vioAddrIPv4, 0, sizeof(vioAddrIPv4));
  68. memset (vioAddrIPv6, 0, sizeof(vioAddrIPv6));
  69. #if !defined CMSIS_VOUT
  70. // Add user code here:
  71. #endif
  72. #if !defined CMSIS_VIN
  73. // Add user code here:
  74. #endif
  75. }
  76. // Print formated string to test terminal.
  77. int32_t vioPrint (uint32_t level, const char *format, ...) {
  78. va_list args;
  79. int32_t ret;
  80. #if !defined CMSIS_VOUT
  81. // Add user variables here:
  82. #endif
  83. if (level > vioLevelError) {
  84. return (-1);
  85. }
  86. if (level > VIO_PRINTMEM_NUM) {
  87. return (-1);
  88. }
  89. va_start(args, format);
  90. ret = vsnprintf((char *)vioPrintMem[level], sizeof(vioPrintMem[level]), format, args);
  91. va_end(args);
  92. #if !defined CMSIS_VOUT
  93. // Add user code here:
  94. #endif
  95. return (ret);
  96. }
  97. // Set signal output.
  98. void vioSetSignal (uint32_t mask, uint32_t signal) {
  99. #if !defined CMSIS_VOUT
  100. // Add user variables here:
  101. #endif
  102. vioSignalOut &= ~mask;
  103. vioSignalOut |= mask & signal;
  104. #if !defined CMSIS_VOUT
  105. // Add user code here:
  106. #endif
  107. }
  108. // Get signal input.
  109. uint32_t vioGetSignal (uint32_t mask) {
  110. uint32_t signal;
  111. #if !defined CMSIS_VIN
  112. // Add user variables here:
  113. #endif
  114. #if !defined CMSIS_VIN
  115. // Add user code here:
  116. // vioSignalIn = ...;
  117. #endif
  118. signal = vioSignalIn;
  119. return (signal & mask);
  120. }
  121. // Set value output.
  122. void vioSetValue (uint32_t id, int32_t value) {
  123. uint32_t index = id;
  124. #if !defined CMSIS_VOUT
  125. // Add user variables here:
  126. #endif
  127. if (index >= VIO_VALUE_NUM) {
  128. return; /* return in case of out-of-range index */
  129. }
  130. vioValue[index] = value;
  131. #if !defined CMSIS_VOUT
  132. // Add user code here:
  133. #endif
  134. }
  135. // Get value input.
  136. int32_t vioGetValue (uint32_t id) {
  137. uint32_t index = id;
  138. int32_t value = 0;
  139. #if !defined CMSIS_VIN
  140. // Add user variables here:
  141. #endif
  142. if (index >= VIO_VALUE_NUM) {
  143. return value; /* return default in case of out-of-range index */
  144. }
  145. #if !defined CMSIS_VIN
  146. // Add user code here:
  147. // vioValue[index] = ...;
  148. #endif
  149. value = vioValue[index];
  150. return value;
  151. }
  152. // Set XYZ value output.
  153. void vioSetXYZ (uint32_t id, vioValueXYZ_t valueXYZ) {
  154. uint32_t index = id;
  155. #if !defined CMSIS_VOUT
  156. // Add user variables here:
  157. #endif
  158. if (index >= VIO_VALUEXYZ_NUM) {
  159. return; /* return in case of out-of-range index */
  160. }
  161. vioValueXYZ[index] = valueXYZ;
  162. #if !defined CMSIS_VOUT
  163. // Add user code here:
  164. #endif
  165. }
  166. // Get XYZ value input.
  167. vioValueXYZ_t vioGetXYZ (uint32_t id) {
  168. uint32_t index = id;
  169. vioValueXYZ_t valueXYZ = {0, 0, 0};
  170. #if !defined CMSIS_VIN
  171. // Add user variables here:
  172. #endif
  173. if (index >= VIO_VALUEXYZ_NUM) {
  174. return valueXYZ; /* return default in case of out-of-range index */
  175. }
  176. #if !defined CMSIS_VIN
  177. // Add user code here:
  178. // vioValueXYZ[index] = ...;
  179. #endif
  180. valueXYZ = vioValueXYZ[index];
  181. return valueXYZ;
  182. }
  183. // Set IPv4 address output.
  184. void vioSetIPv4 (uint32_t id, vioAddrIPv4_t addrIPv4) {
  185. uint32_t index = id;
  186. #if !defined CMSIS_VOUT
  187. // Add user variables here:
  188. #endif
  189. if (index >= VIO_IPV4_ADDRESS_NUM) {
  190. return; /* return in case of out-of-range index */
  191. }
  192. vioAddrIPv4[index] = addrIPv4;
  193. #if !defined CMSIS_VOUT
  194. // Add user code here:
  195. #endif
  196. }
  197. // Get IPv4 address input.
  198. vioAddrIPv4_t vioGetIPv4 (uint32_t id) {
  199. uint32_t index = id;
  200. vioAddrIPv4_t addrIPv4 = {0U, 0U, 0U, 0U};
  201. #if !defined CMSIS_VIN
  202. // Add user variables here:
  203. #endif
  204. if (index >= VIO_IPV4_ADDRESS_NUM) {
  205. return addrIPv4; /* return default in case of out-of-range index */
  206. }
  207. #if !defined CMSIS_VIN
  208. // Add user code here:
  209. // vioAddrIPv4[index] = ...;
  210. #endif
  211. addrIPv4 = vioAddrIPv4[index];
  212. return addrIPv4;
  213. }
  214. // Set IPv6 address output.
  215. void vioSetIPv6 (uint32_t id, vioAddrIPv6_t addrIPv6) {
  216. uint32_t index = id;
  217. #if !defined CMSIS_VOUT
  218. // Add user variables here:
  219. #endif
  220. if (index >= VIO_IPV6_ADDRESS_NUM) {
  221. return; /* return in case of out-of-range index */
  222. }
  223. vioAddrIPv6[index] = addrIPv6;
  224. #if !defined CMSIS_VOUT
  225. // Add user code here:
  226. #endif
  227. }
  228. // Get IPv6 address input.
  229. vioAddrIPv6_t vioGetIPv6 (uint32_t id) {
  230. uint32_t index = id;
  231. vioAddrIPv6_t addrIPv6 = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U,
  232. 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U};
  233. #if !defined CMSIS_VIN
  234. // Add user variables here:
  235. #endif
  236. if (index >= VIO_IPV6_ADDRESS_NUM) {
  237. return addrIPv6; /* return default in case of out-of-range index */
  238. }
  239. #if !defined CMSIS_VIN
  240. // Add user code here:
  241. // vioAddrIPv6[index] = ...;
  242. #endif
  243. addrIPv6 = vioAddrIPv6[index];
  244. return addrIPv6;
  245. }