1 /*
2 * Copyright (c) 2022 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zcbor_encode.h>
8 #include <stdio.h>
9 #include <pet_decode.h>
10 #include <pet_encode.h>
11 #include <pet1.h>
12
print_pet(const struct Pet * pet)13 static void print_pet(const struct Pet *pet)
14 {
15 printf("Name:");
16 for (int i = 0; i < pet->names_count; i++) {
17 printf(" %.*s", (int)pet->names[i].len, pet->names[i].value);
18 }
19 printf("\nBirthday: 0x");
20 for (int i = 0; i < pet->birthday.len; i++) {
21 printf("%02x", pet->birthday.value[i]);
22 }
23 switch (pet->species_choice) {
24 case Pet_species_cat_c:
25 printf("\nSpecies: Cat\n\n");
26 return;
27 case Pet_species_dog_c:
28 printf("\nSpecies: Dog\n\n");
29 return;
30 case Pet_species_other_c:
31 printf("\nSpecies: Other\n\n");
32 return;
33 }
34 }
35
36 /** First pet - from var in pet1.h. */
get_pet1(void)37 static void get_pet1(void)
38 {
39 struct Pet decoded_pet;
40 int err;
41
42 err = cbor_decode_Pet(pet1, sizeof(pet1), &decoded_pet, NULL);
43 if (err != ZCBOR_SUCCESS) {
44 printf("Decoding failed for pet1: %d\r\n", err);
45 return;
46 }
47
48 print_pet(&decoded_pet);
49 }
50
51 /** Second pet - encoded with zcbor C library. */
get_pet2(void)52 static void get_pet2(void)
53 {
54 struct Pet decoded_pet;
55 int err;
56 uint8_t pet2[30];
57 ZCBOR_STATE_E(encoding_state, 0, pet2, sizeof(pet2), 0);
58 bool r = true;
59 const uint8_t timestamp2[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
60
61 r = r && zcbor_list_start_encode(encoding_state, 3);
62 r = r && zcbor_list_start_encode(encoding_state, 3);
63 r = r && zcbor_tstr_put_lit(encoding_state, "Danny");
64 r = r && zcbor_tstr_put_lit(encoding_state, "the");
65 r = r && zcbor_tstr_put_lit(encoding_state, "Dog");
66 r = r && zcbor_list_end_encode(encoding_state, 3);
67 r = r && zcbor_bstr_put_arr(encoding_state, timestamp2);
68 r = r && zcbor_uint64_put(encoding_state, 2);
69 r = r && zcbor_list_end_encode(encoding_state, 3);
70
71 if (!r) {
72 printf("Encoding failed for pet2: %d\r\n", zcbor_peek_error(encoding_state));
73 return;
74 }
75
76 err = cbor_decode_Pet(pet2, sizeof(pet2), &decoded_pet, NULL);
77
78 if (err != ZCBOR_SUCCESS) {
79 printf("Decoding failed for pet2: %d\r\n", err);
80 return;
81 }
82
83 print_pet(&decoded_pet);
84 }
85
86 /** Third pet - encoded with zcbor-generated code. */
get_pet3(void)87 static void get_pet3(void)
88 {
89 struct Pet decoded_pet;
90 struct Pet encoded_pet;
91 int err;
92 uint8_t pet3[30];
93 const uint8_t first_name[] = "Gary";
94 const uint8_t last_name[] = "Giraffe";
95 const uint8_t timestamp3[] = { 0x01, 0x02, 0x03, 0x04, 0x0a, 0x0b, 0x0c, 0x0d };
96
97 encoded_pet.names[0].value = first_name;
98 encoded_pet.names[0].len = sizeof(first_name) - 1;
99 encoded_pet.names[1].value = last_name;
100 encoded_pet.names[1].len = sizeof(last_name) - 1;
101 encoded_pet.names_count = 2;
102 encoded_pet.birthday.value = timestamp3;
103 encoded_pet.birthday.len = sizeof(timestamp3);
104 encoded_pet.species_choice = Pet_species_other_c;
105
106 err = cbor_encode_Pet(pet3, sizeof(pet3), &encoded_pet, NULL);
107
108 if (err != ZCBOR_SUCCESS) {
109 printf("Encoding failed for pet3: %d\r\n", err);
110 return;
111 }
112
113 err = cbor_decode_Pet(pet3, sizeof(pet3), &decoded_pet, NULL);
114
115 if (err != ZCBOR_SUCCESS) {
116 printf("Decoding failed for pet3: %d\r\n", err);
117 return;
118 }
119
120 print_pet(&decoded_pet);
121 }
122
main(void)123 void main(void)
124 {
125 get_pet1();
126 get_pet2();
127 get_pet3();
128 }
129