Contiki 3.x
lwm2m-plain-text.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015, Yanzi Networks AB.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the copyright holder nor the names of its
14  * contributors may be used to endorse or promote products derived
15  * from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
18  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28  * OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 /**
32  * \addtogroup oma-lwm2m
33  * @{
34  */
35 
36 /**
37  * \file
38  * Implementation of the Contiki OMA LWM2M plain text reader / writer
39  * \author
40  * Joakim Eriksson <joakime@sics.se>
41  * Niclas Finne <nfi@sics.se>
42  */
43 
44 #include "lwm2m-object.h"
45 #include "lwm2m-plain-text.h"
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include <string.h>
49 
50 #define DEBUG 0
51 #if DEBUG
52 #define PRINTF(...) printf(__VA_ARGS__)
53 #else
54 #define PRINTF(...)
55 #endif
56 
57 /*---------------------------------------------------------------------------*/
58 size_t
59 lwm2m_plain_text_read_int(const uint8_t *inbuf, size_t len, int32_t *value)
60 {
61  int i, neg = 0;
62  *value = 0;
63  for(i = 0; i < len; i++) {
64  if(inbuf[i] >= '0' && inbuf[i] <= '9') {
65  *value = *value * 10 + (inbuf[i] - '0');
66  } else if(inbuf[i] == '-' && i == 0) {
67  neg = 1;
68  } else {
69  break;
70  }
71  }
72  if(neg) {
73  *value = -*value;
74  }
75  return i;
76 }
77 /*---------------------------------------------------------------------------*/
78 size_t
79 lwm2m_plain_text_read_float32fix(const uint8_t *inbuf, size_t len,
80  int32_t *value, int bits)
81 {
82  int i, dot = 0, neg = 0;
83  int32_t counter, integerpart, frac;
84 
85  integerpart = 0;
86  counter = 0;
87  frac = 0;
88  for(i = 0; i < len; i++) {
89  if(inbuf[i] >= '0' && inbuf[i] <= '9') {
90  counter = counter * 10 + (inbuf[i] - '0');
91  frac = frac * 10;
92  } else if(inbuf[i] == '.' && dot == 0) {
93  integerpart = counter;
94  counter = 0;
95  frac = 1;
96  dot = 1;
97  } else if(inbuf[i] == '-' && i == 0) {
98  neg = 1;
99  } else {
100  break;
101  }
102  }
103  if(dot == 0) {
104  integerpart = counter;
105  counter = 0;
106  frac = 1;
107  }
108  *value = integerpart << bits;
109  if(frac > 1) {
110  *value += ((counter << bits) / frac);
111  }
112  PRINTF("READ FLOATFIX: \"%.*s\" => int(%ld) frac(%ld) f=%ld Value=%ld\n",
113  (int)len, (char *)inbuf,
114  (long)integerpart,
115  (long)counter,
116  (long)frac,
117  (long)*value);
118  if(neg) {
119  *value = -*value;
120  }
121  return i;
122 }
123 /*---------------------------------------------------------------------------*/
124 size_t
125 lwm2m_plain_text_write_float32fix(uint8_t *outbuf, size_t outlen,
126  int32_t value, int bits)
127 {
128  int64_t v;
129  unsigned long integer_part;
130  unsigned long frac_part;
131  int n, o = 0;
132 
133  if(outlen == 0) {
134  return 0;
135  }
136  if(value < 0) {
137  *outbuf++ = '-';
138  outlen--;
139  o = 1;
140  value = -value;
141  }
142 
143  integer_part = (unsigned long)(value >> bits);
144  v = value - (integer_part << bits);
145  v = (v * 100) >> bits;
146  frac_part = (unsigned long)v;
147 
148  n = snprintf((char *)outbuf, outlen, "%lu.%02lu", integer_part, frac_part);
149  if(n < 0 || n >= outlen) {
150  return 0;
151  }
152  return n + o;
153 }
154 /*---------------------------------------------------------------------------*/
155 static size_t
156 write_boolean(const lwm2m_context_t *ctx, uint8_t *outbuf, size_t outlen,
157  int value)
158 {
159  if(outlen > 0) {
160  if(value) {
161  *outbuf = '1';
162  } else {
163  *outbuf = '0';
164  }
165  return 1;
166  }
167  return 0;
168 }
169 /*---------------------------------------------------------------------------*/
170 static size_t
171 write_int(const lwm2m_context_t *ctx, uint8_t *outbuf, size_t outlen,
172  int32_t value)
173 {
174  int n = snprintf((char *)outbuf, outlen, "%ld", (long)value);
175  if(n < 0 || n >= outlen) {
176  return 0;
177  }
178  return n;
179 }
180 /*---------------------------------------------------------------------------*/
181 static size_t
182 write_float32fix(const lwm2m_context_t *ctx, uint8_t *outbuf, size_t outlen,
183  int32_t value, int bits)
184 {
185  return lwm2m_plain_text_write_float32fix(outbuf, outlen, value, bits);
186 }
187 /*---------------------------------------------------------------------------*/
188 static size_t
189 write_string(const lwm2m_context_t *ctx, uint8_t *outbuf, size_t outlen,
190  const char *value, size_t stringlen)
191 {
192  int n = snprintf((char *)outbuf, outlen, "%.*s", (int) stringlen, value);
193  if(n < 0 || n >= outlen) {
194  return 0;
195  }
196  return n;
197 }
198 /*---------------------------------------------------------------------------*/
199 const lwm2m_writer_t lwm2m_plain_text_writer = {
200  write_int,
201  write_string,
202  write_float32fix,
203  write_boolean
204 };
205 /*---------------------------------------------------------------------------*/
206 static size_t
207 read_int(const lwm2m_context_t *ctx, const uint8_t *inbuf, size_t len,
208  int32_t *value)
209 {
210  return lwm2m_plain_text_read_int(inbuf, len, value);
211 }
212 /*---------------------------------------------------------------------------*/
213 static size_t
214 read_string(const lwm2m_context_t *ctx, const uint8_t *inbuf, size_t len,
215  uint8_t *value, size_t stringlen)
216 {
217  if(stringlen <= len) {
218  /* The outbuffer can not contain the full string including ending zero */
219  return 0;
220  }
221  memcpy(value, inbuf, len);
222  value[len] = '\0';
223  return len;
224 }
225 /*---------------------------------------------------------------------------*/
226 static size_t
227 read_float32fix(const lwm2m_context_t *ctx, const uint8_t *inbuf, size_t len,
228  int32_t *value, int bits)
229 {
230  return lwm2m_plain_text_read_float32fix(inbuf, len, value, bits);
231 }
232 /*---------------------------------------------------------------------------*/
233 static size_t
234 read_boolean(const lwm2m_context_t *ctx, const uint8_t *inbuf, size_t len,
235  int *value)
236 {
237  if(len > 0) {
238  if(*inbuf == '1' || *inbuf == '0') {
239  *value = *inbuf == '1' ? 1 : 0;
240  return 1;
241  }
242  }
243  return 0;
244 }
245 /*---------------------------------------------------------------------------*/
246 const lwm2m_reader_t lwm2m_plain_text_reader = {
247  read_int,
248  read_string,
249  read_float32fix,
250  read_boolean
251 };
252 /*---------------------------------------------------------------------------*/
253 /** @} */
Header file for the Contiki OMA LWM2M object API
Header file for the Contiki OMA LWM2M plain text reader / writer