ctypes.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "ctypes_Test.h"
  2. #include "ctypes_c_buffer.h"
  3. #include "ctypes_c_float.h"
  4. #include "ctypes_c_uint.h"
  5. #include "ctypes_c_wchar_p.h"
  6. #include "ctypes_utils.h"
  7. void ctypes_c_uint___init__(PikaObj* self, int value) {
  8. ctypesUtils_setInt(self, value);
  9. }
  10. void ctypes_c_wchar_p___init__(PikaObj* self, char* value) {
  11. ctypesUtils_setStr(self, value);
  12. }
  13. void ctypes_c_float___init__(PikaObj* self, pika_float value) {
  14. ctypesUtils_setFloat(self, value);
  15. }
  16. int ctypes_Test_add(PikaObj* self, PikaObj* c_uint1, PikaObj* c_uint2) {
  17. return ctypesUtils_getInt(c_uint1) + ctypesUtils_getInt(c_uint2);
  18. }
  19. int ctypes_Test_dc_cpuapdu_hex(PikaObj* self,
  20. int slen,
  21. uint8_t* sendbuf,
  22. PikaObj* rlen,
  23. PikaObj* rcvbuf) {
  24. /* print input */
  25. __platform_printf("input: slen = %d\n", slen);
  26. __platform_printf("sendbuf :\n");
  27. for (int i = 0; i < slen; i++) {
  28. __platform_printf("0x%02x ", sendbuf[i]);
  29. }
  30. __platform_printf("\n");
  31. /* set output */
  32. ctypesUtils_setInt(rlen, 5);
  33. uint8_t rcv[] = {0x01, 0x02, 0x03, 0x00, 0x05, 0x08};
  34. ctypesUtils_setBytes(rcvbuf, rcv, sizeof(rcv));
  35. return 0;
  36. }
  37. void ctypes_Test_print_rcv(PikaObj* self, PikaObj* rcvbuf) {
  38. uint8_t* rcv = ctypesUtils_getBytes(rcvbuf);
  39. size_t rcv_size = ctypesUtils_getBytesSize(rcvbuf);
  40. __platform_printf("{");
  41. for (size_t i = 0; i < rcv_size - 1; i++) {
  42. __platform_printf("0x%02x, ", rcv[i]);
  43. }
  44. __platform_printf("0x%02x", rcv[rcv_size - 1]);
  45. __platform_printf("}\r\n");
  46. }
  47. void ctypes_create_string_buffer___init__(PikaObj* self, int size) {
  48. uint8_t* buffer;
  49. obj_setBytes(self, "raw", NULL, size);
  50. buffer = obj_getBytes(self, "raw");
  51. __platform_printf("0x%lx", (uintptr_t)&buffer);
  52. }
  53. int ctypes_create_string_buffer___getitem__(PikaObj* self, int __key) {
  54. uint8_t* buffer;
  55. int i;
  56. i = __key;
  57. buffer = obj_getBytes(self, "raw");
  58. return buffer[i];
  59. }
  60. int ctypes_c_buffer___getitem__(PikaObj* self, int __key) {
  61. int i;
  62. uint8_t* buffer;
  63. i = __key;
  64. buffer = obj_getBytes(self, "raw");
  65. return buffer[i];
  66. }
  67. void ctypes_c_buffer___init__(PikaObj* self, Arg* value, int size) {
  68. uint8_t* buffer;
  69. uint8_t* value_buffer;
  70. size_t value_size;
  71. ArgType arg_type;
  72. arg_type = arg_getType(value);
  73. if (arg_type == ARG_TYPE_BYTES) {
  74. obj_setBytes(self, "raw", NULL, size);
  75. buffer = obj_getBytes(self, "raw");
  76. value_size = arg_getBytesSize(value);
  77. value_buffer = arg_getBytes(value);
  78. __platform_memcpy(buffer, value_buffer, value_size);
  79. } else if (ARG_TYPE_STRING == arg_type) {
  80. obj_setBytes(self, "raw", NULL, size);
  81. buffer = obj_getBytes(self, "raw");
  82. value_buffer = (uint8_t*)arg_getStr(value);
  83. __platform_memcpy(buffer, value_buffer,
  84. strGetSize((char*)value_buffer) + 1);
  85. } else {
  86. __platform_printf("value type is not support!");
  87. __platform_panic_handle();
  88. }
  89. }