capnp_encode_decode.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include <rtthread.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "capnp_c.h"
  5. #include "myschema.capnp.h"
  6. static capn_text chars_to_text(const char *chars) {
  7. return (capn_text) {
  8. .len = (int) strlen(chars),
  9. .str = chars,
  10. .seg = NULL,
  11. };
  12. }
  13. void capnp_encode_decode_entry(void* parameters)
  14. {
  15. uint8_t buf[4096];
  16. ssize_t sz = 0;
  17. const char *name = "Han Wu";
  18. const char *email = "wuhanstudio@domain.com";
  19. const char *school = "Huazhong Univ. of Sci. and Tech.";
  20. printf("--- Encoding ---\n");
  21. {
  22. // Init memory
  23. struct capn c;
  24. capn_init_malloc(&c);
  25. // Get capn object
  26. capn_ptr cr = capn_root(&c);
  27. struct capn_segment *cs = cr.seg;
  28. // Set Person
  29. struct Person p = {
  30. .id = 17,
  31. .name = chars_to_text(name),
  32. .email = chars_to_text(email),
  33. };
  34. // Set employment
  35. p.employment_which = Person_employment_school;
  36. p.employment.school = chars_to_text(school);
  37. // Set PhoneNumber lists
  38. p.phones = new_Person_PhoneNumber_list(cs, 2);
  39. struct Person_PhoneNumber pn0 = {
  40. .number = chars_to_text("+8612345678900"),
  41. .type = Person_PhoneNumber_Type_work,
  42. };
  43. set_Person_PhoneNumber(&pn0, p.phones, 0);
  44. struct Person_PhoneNumber pn1 = {
  45. .number = chars_to_text("+8613579246800"),
  46. .type = Person_PhoneNumber_Type_home,
  47. };
  48. set_Person_PhoneNumber(&pn1, p.phones, 1);
  49. // Write Person to Capnp
  50. Person_ptr pp = new_Person(cs);
  51. write_Person(&p, pp);
  52. capn_setp(cr, 0, pp.p);
  53. // Write to memory
  54. sz = capn_write_mem(&c, buf, sizeof(buf), 0 /* packed */);
  55. capn_free(&c);
  56. }
  57. printf("\n");
  58. printf("--- Decoding ---\n");
  59. {
  60. struct capn rc;
  61. int init_mem_ret = capn_init_mem(&rc, buf, sz, 0 /* packed */);
  62. Person_ptr rroot;
  63. struct Person rp;
  64. // Read data out
  65. rroot.p = capn_getp(capn_root(&rc), 0 /* off */, 1 /* resolve */);
  66. read_Person(&rp, rroot);
  67. printf("Person ID: %d\n", rp.id);
  68. printf("Person Name: %s\n", rp.name.str);
  69. printf("Person Email: %s\n", rp.email.str);
  70. switch(rp.employment_which)
  71. {
  72. case Person_employment_unemployed:
  73. printf("Unemployed\n");
  74. break;
  75. case Person_employment_selfEmployed:
  76. printf("Self Employed\n");
  77. break;
  78. case Person_employment_employer:
  79. printf("Employer: %s\n", rp.employment.employer.str);
  80. break;
  81. case Person_employment_school:
  82. printf("School: %s\n", rp.employment.school.str);
  83. break;
  84. default:
  85. printf("Unknown Employment Status\n");
  86. break;
  87. }
  88. struct Person_PhoneNumber rpn0;
  89. get_Person_PhoneNumber(&rpn0, rp.phones, 0);
  90. printf("Phone Number 0: %s\n", rpn0.number.str);
  91. struct Person_PhoneNumber rpn1;
  92. get_Person_PhoneNumber(&rpn1, rp.phones, 1);
  93. printf("Phone Number 1: %s\n", rpn1.number.str);
  94. capn_free(&rc);
  95. }
  96. printf("\n");
  97. printf("\n");
  98. }
  99. static void capnp_encode_decode(int argc,char *argv[])
  100. {
  101. rt_thread_t thread = rt_thread_create("capnp", capnp_encode_decode_entry, RT_NULL, 10240, 25, 10);
  102. if(thread != RT_NULL)
  103. {
  104. rt_thread_startup(thread);
  105. rt_kprintf("[capnp] New thread capnp\n");
  106. }
  107. else
  108. {
  109. rt_kprintf("[capnp] Failed to create thread capnp\n");
  110. }
  111. }
  112. MSH_CMD_EXPORT(capnp_encode_decode, capnp encode decode example)