capnp_encode_to_file.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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_to_file_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("--- Write to File ---\n");
  59. {
  60. // Write serialized object to file system.
  61. FILE *f = fopen("/person.bin", "wb");
  62. fwrite(buf, 1 /* size */, sz /* count */, f);
  63. fclose(f);
  64. }
  65. printf("\n");
  66. }
  67. static void capnp_encode_to_file(int argc,char *argv[])
  68. {
  69. rt_thread_t thread = rt_thread_create("capnp", capnp_encode_to_file_entry, RT_NULL, 10240, 25, 10);
  70. if(thread != RT_NULL)
  71. {
  72. rt_thread_startup(thread);
  73. rt_kprintf("[capnp] New thread capnp\n");
  74. }
  75. else
  76. {
  77. rt_kprintf("[capnp] Failed to create thread capnp\n");
  78. }
  79. }
  80. MSH_CMD_EXPORT(capnp_encode_to_file, capnp encode to file example)