--- /dev/null
+/*
+ *
+ * Copyright 2019 AT&T Intellectual Property
+ * Copyright 2019 Nokia
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "Pendulum_asn_codec.h"
+#include "per_decoder.h"
+#include "per_encoder.h"
+
+#include "OCTET_STRING.h"
+
+static int ASN_DEBUG = 0;
+
+int pendulum_asn_encode(Pendulum_t *pend, uint8_t **buffer, uint32_t *len)
+{
+ ssize_t encoded;
+ assert(pend != NULL);
+ assert(buffer != NULL);
+
+ encoded = aper_encode_to_new_buffer(&asn_DEF_Pendulum, 0, pend, (void **)buffer);
+ if(encoded < 0){
+ perror("Failed to aper encode\n");
+ exit(1);
+ }
+
+ *len = encoded;
+ //ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_Pendulum, pend);
+ return encoded;
+}
+
+int pendulum_asn_decode(Pendulum_t *pend, const uint8_t *const buffer, const int len)
+{
+ asn_dec_rval_t dec_ret;
+
+ // THIS IS IMPORTANT, otherwise: Segmentation fault
+ memset(pend, 0, sizeof(*pend));
+
+ assert(buffer != NULL);
+
+ dec_ret = aper_decode(NULL, &asn_DEF_Pendulum, (void **)&pend, buffer, len, 0, 0);
+ if (dec_ret.code != RC_OK) {
+ fprintf(stderr, "ERROR: Failed to decode asn1 message\n");
+ return -1;
+ }
+
+ if(ASN_DEBUG)
+ xer_fprint(stdout, &asn_DEF_Pendulum, pend);
+
+ return 0;
+}
+
+int pendulum_create_asn_msg(uint8_t **buffer, long sequence,
+ double angle, double torque, const char* msg)
+{
+ //Create Pendulum payload struct
+ Pendulum_t *pend;
+
+ pend = calloc(1, sizeof(Pendulum_t));
+ if(!pend){
+ perror("calloc() failed");
+ exit(1);
+ }
+
+ //convert char* to PrintableString_t*
+ PrintableString_t *payload = calloc(1, sizeof(PrintableString_t));
+ payload->buf = (uint8_t *)msg;
+ payload->size = strlen(msg);
+
+ pend->strval = payload;
+ pend->sequence = &sequence;
+ pend->angle = ∠
+ pend->torque = &torque;
+
+ if (ASN_DEBUG)
+ xer_fprint(stdout, &asn_DEF_Pendulum, pend);
+
+ //Encode Pendulum payload struct to asn1 buffer
+ uint32_t len;
+ if(pendulum_asn_encode(pend, buffer, &len) < 0)
+ {
+ return -1;
+ }
+ //fprintf(stderr, "len = %d\n", len);
+
+ return len;
+}
+
+long pendulum_get_sequence(const uint8_t *const buffer, const int len)
+{
+ Pendulum_t pend;
+ pendulum_asn_decode(&pend, buffer, len);
+
+ return *(pend.sequence);
+}
+
+double pendulum_get_angle(const uint8_t *const buffer, const int len)
+{
+ Pendulum_t pend;
+ pendulum_asn_decode(&pend, buffer, len);
+
+ return *(pend.angle);
+}
+
+double pendulum_get_torque(const uint8_t *const buffer, const int len)
+{
+ Pendulum_t pend;
+ pendulum_asn_decode(&pend, buffer, len);
+
+ return *(pend.torque);
+}
+
+char* pendulum_get_strval(const uint8_t *const buffer, const int len)
+{
+ Pendulum_t pend;
+ char* str;
+
+ pendulum_asn_decode(&pend, buffer, len);
+
+ str = (char*)pend.strval->buf;
+
+ return str;
+}
+
+void test_pendulum_msg(void)
+{
+ uint8_t *buffer = NULL;
+ uint32_t len = 0;
+ double angle = 1.9;
+ len = pendulum_create_asn_msg(&buffer, 0, angle, 0, NULL);
+
+ double ex_angle = pendulum_get_angle(buffer, len);
+ fprintf(stderr, "Extracted angle = %f\n", ex_angle);
+}
+
+void test_pendulum_asn1(void)
+{
+ fprintf(stderr, "test_pendulum_asn1\n");
+
+ Pendulum_t *pend;
+
+ long sequence = 0; /* OPTIONAL */
+ double angle = 1.5; /* OPTIONAL */
+ //double torque = 0.7; /* OPTIONAL */
+
+ pend = calloc(1, sizeof(Pendulum_t));
+ if(!pend){
+ perror("calloc() failed");
+ exit(1);
+ }
+
+ pend->sequence = &sequence;
+ pend->angle = ∠
+ //pend->torque = &torque;
+
+ xer_fprint(stdout, &asn_DEF_Pendulum, pend);
+
+ //encode
+ uint8_t *buffer = NULL;
+ uint32_t len;
+ pendulum_asn_encode(pend, &buffer, &len);
+ fprintf(stderr, "len = %d\n", len);
+
+ //decode
+ Pendulum_t dec_pend;
+ pendulum_asn_decode(&dec_pend, buffer, len);
+}