Issue-ID: SIM-18
[sim/e2-interface.git] / e2sim / e2apv1sim / e2sim / test / Pendulum / Pendulum_asn_codec.c
diff --git a/e2sim/e2apv1sim/e2sim/test/Pendulum/Pendulum_asn_codec.c b/e2sim/e2apv1sim/e2sim/test/Pendulum/Pendulum_asn_codec.c
new file mode 100644 (file)
index 0000000..9b44adf
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ *
+ * 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     = &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     = &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);
+}