[Tinyos-2-commits] CVS: tinyos-2.x/support/sdk/c message.c, NONE,
1.1.2.1 message.h, NONE, 1.1.2.1 .cvsignore, 1.1.2.1,
1.1.2.2 Makefile.am, 1.1.2.1, 1.1.2.2 serialsource.c, 1.1.2.1,
1.1.2.2
David Gay
idgay at users.sourceforge.net
Tue May 2 15:52:10 PDT 2006
Update of /cvsroot/tinyos/tinyos-2.x/support/sdk/c
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28671
Modified Files:
Tag: tinyos-2_0_devel-BRANCH
.cvsignore Makefile.am serialsource.c
Added Files:
Tag: tinyos-2_0_devel-BRANCH
message.c message.h
Log Message:
mig support
use mig
--- NEW FILE: message.c ---
/* Copyright (c) 2006 Intel Corporation
* All rights reserved.
*
* This file is distributed under the terms in the attached INTEL-LICENSE
* file. If you do not find these files, copies can be found by writing to
* Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA,
* 94704. Attention: Intel License Inquiry.
*/
/* Authors: David Gay <dgay at intel-research.net>
* Intel Research Berkeley Lab
*/
#include <stdlib.h>
#include "message.h"
struct tmsg {
uint8_t *data;
int len;
};
tmsg_t *new_tmsg(void *packet, int len)
{
tmsg_t *x = malloc(sizeof(tmsg_t));
if (x)
{
x->data = packet;
x->len = len;
}
return x;
}
void free_tmsg(tmsg_t *msg)
{
if (msg)
free(msg);
}
void *tmsg_data(tmsg_t *msg)
{
return msg->data;
}
int tmsg_length(tmsg_t *msg)
{
return msg->len;
}
void tmsg_fail(void)
{
}
static int boundsp(tmsg_t *msg, size_t offset, size_t length)
{
if (offset + length <= msg->len * 8)
return 1;
tmsg_fail();
return 0;
}
static int64_t u2s(uint64_t x, size_t length)
{
if (x & 1ULL << (length - 1))
return (int64_t)x - (1LL << length);
else
return x;
}
uint64_t tmsg_uread_le(tmsg_t *msg, size_t offset, size_t length)
{
uint64_t x = 0;
if (boundsp(msg, offset, length))
{
size_t byte_offset = offset >> 3;
size_t bit_offset = offset & 7;
size_t shift = 0;
// all in one byte case
if (length + bit_offset <= 8)
return (msg->data[byte_offset] >> bit_offset) & ((1 << length) - 1);
// get some high order bits
if (offset > 0)
{
x = msg->data[byte_offset] >> bit_offset;
byte_offset++;
shift += 8 - bit_offset;
length -= 8 - bit_offset;
}
while (length >= 8)
{
x |= (uint64_t)msg->data[byte_offset++] << shift;
shift += 8;
length -= 8;
}
// data from last byte
if (length > 0)
x |= (uint64_t)(msg->data[byte_offset] & ((1 << length) - 1)) << shift;
}
return x;
}
int64_t tmsg_read_le(tmsg_t *msg, size_t offset, size_t length)
{
return u2s(tmsg_uread_le(msg, offset, length), length);
}
void tmsg_uwrite_le(tmsg_t *msg, size_t offset, size_t length, uint64_t x)
{
if (boundsp(msg, offset, length))
{
size_t byte_offset = offset >> 3;
size_t bit_offset = offset & 7;
size_t shift = 0;
// all in one byte case
if (length + bit_offset <= 8)
{
msg->data[byte_offset] =
((msg->data[byte_offset] & ~(((1 << length) - 1) << bit_offset))
| x << bit_offset);
return;
}
// set some high order bits
if (bit_offset > 0)
{
msg->data[byte_offset] =
((msg->data[byte_offset] & ((1 << bit_offset) - 1)) | x << bit_offset);
byte_offset++;
shift += 8 - bit_offset;
length -= 8 - bit_offset;
}
while (length >= 8)
{
msg->data[byte_offset++] = x >> shift;
shift += 8;
length -= 8;
}
// data for last byte
if (length > 0)
msg->data[byte_offset] =
(msg->data[byte_offset] & ~((1 << length) - 1)) | x >> shift;
}
}
void tmsg_write_le(tmsg_t *msg, size_t offset, size_t length, int64_t value)
{
tmsg_uwrite_le(msg, offset, length, value);
}
uint64_t tmsg_uread_be(tmsg_t *msg, size_t offset, size_t length)
{
uint64_t x = 0;
if (boundsp(msg, offset, length))
{
size_t byte_offset = offset >> 3;
size_t bit_offset = offset & 7;
// All in one byte case
if (length + bit_offset <= 8)
return (msg->data[byte_offset] >> (8 - bit_offset - length)) &
((1 << length) - 1);
// get some high order bits
if (bit_offset > 0)
{
length -= 8 - bit_offset;
x = (uint64_t)(msg->data[byte_offset] & ((1 << (8 - bit_offset)) - 1)) << length;
byte_offset++;
}
while (length >= 8)
{
length -= 8;
x |= (uint64_t)msg->data[byte_offset++] << length;
}
// data from last byte
if (length > 0)
x |= msg->data[byte_offset] >> (8 - length);
return x;
}
return x;
}
int64_t tmsg_read_be(tmsg_t *msg, size_t offset, size_t length)
{
return u2s(tmsg_uread_be(msg, offset, length), length);
}
void tmsg_uwrite_be(tmsg_t *msg, size_t offset, size_t length, uint64_t x)
{
if (boundsp(msg, offset, length))
{
size_t byte_offset = offset >> 3;
size_t bit_offset = offset & 7;
// all in one byte case
if (length + bit_offset <= 8) {
size_t mask = ((1 << length) - 1) << (8 - bit_offset - length);
msg->data[byte_offset] =
((msg->data[byte_offset] & ~mask) | x << (8 - bit_offset - length));
return;
}
// set some high order bits
if (bit_offset > 0)
{
size_t mask = (1 << (8 - bit_offset)) - 1;
length -= 8 - bit_offset;
msg->data[byte_offset] =
((msg->data[byte_offset] & ~mask) | x >> length);
byte_offset++;
}
while (length >= 8)
{
length -= 8;
msg->data[byte_offset++] = x >> length;
}
// data for last byte
if (length > 0)
{
size_t mask = (1 << (8 - length)) - 1;
msg->data[byte_offset] =
((msg->data[byte_offset] & mask) | x << (8 - length));
}
}
}
void tmsg_write_be(tmsg_t *msg, size_t offset, size_t length, int64_t value)
{
tmsg_uwrite_be(msg, offset, length, value);
}
/* u2f and f2u convert raw 32-bit values to/from float. This code assumes
that the floating point rep in the uint32_t values:
bit 31: sign, bits 30-23: exponent, bits 22-0: mantissa
matches that of a floating point value when such a value is stored in
memory.
*/
/* Note that C99 wants us to use the union approach rather than the
cast-a-pointer approach... */
union f_and_u {
uint32_t u;
float f;
};
static float u2f(uint32_t x)
{
union f_and_u y = { .u = x};
return y.f;
}
static uint32_t f2u(float x)
{
union f_and_u y = { .f = x};
return y.u;
}
float tmsg_read_float_le(tmsg_t *msg, size_t offset)
{
return u2f(tmsg_uread_le(msg, offset, 32));
}
void tmsg_write_float_le(tmsg_t *msg, size_t offset, float x)
{
tmsg_uwrite_le(msg, offset, 32, f2u(x));
}
float tmsg_read_float_be(tmsg_t *msg, size_t offset)
{
return u2f(tmsg_uread_be(msg, offset, 32));
}
void tmsg_write_float_be(tmsg_t *msg, size_t offset, float x)
{
tmsg_uwrite_be(msg, offset, 32, f2u(x));
}
--- NEW FILE: message.h ---
/* Copyright (c) 2006 Intel Corporation
* All rights reserved.
*
* This file is distributed under the terms in the attached INTEL-LICENSE
* file. If you do not find these files, copies can be found by writing to
* Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA,
* 94704. Attention: Intel License Inquiry.
*/
/* Authors: David Gay <dgay at intel-research.net>
* Intel Research Berkeley Lab
*/
#ifndef MESSAGE_H
#define MESSAGE_H
#include <stdint.h>
#include <stdlib.h>
typedef struct tmsg tmsg_t;
void tmsg_fail(void);
tmsg_t *new_tmsg(void *packet, int len);
void free_tmsg(tmsg_t *msg);
void *tmsg_data(tmsg_t *msg);
int tmsg_length(tmsg_t *msg);
uint64_t tmsg_read_ule(tmsg_t *msg, size_t bit_offset, size_t bit_length);
int64_t tmsg_read_le(tmsg_t *msg, size_t bit_offset, size_t bit_length);
void tmsg_write_ule(tmsg_t *msg, size_t bit_offset, size_t bit_length, uint64_t value);
void tmsg_write_le(tmsg_t *msg, size_t bit_offset, size_t bit_length, int64_t value);
uint64_t tmsg_read_ube(tmsg_t *msg, size_t bit_offset, size_t bit_length);
int64_t tmsg_read_be(tmsg_t *msg, size_t bit_offset, size_t bit_length);
void tmsg_write_ube(tmsg_t *msg, size_t bit_offset, size_t bit_length, uint64_t value);
void tmsg_write_be(tmsg_t *msg, size_t bit_offset, size_t bit_length, int64_t value);
float tmsg_read_float_le(tmsg_t *msg, size_t offset);
void tmsg_write_float_le(tmsg_t *msg, size_t offset, float x);
float tmsg_read_float_be(tmsg_t *msg, size_t offset);
void tmsg_write_float_be(tmsg_t *msg, size_t offset, float x);
#endif
Index: .cvsignore
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/c/Attic/.cvsignore,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -d -r1.1.2.1 -r1.1.2.2
*** .cvsignore 16 Feb 2006 01:20:01 -0000 1.1.2.1
--- .cvsignore 2 May 2006 22:52:04 -0000 1.1.2.2
***************
*** 16,17 ****
--- 16,20 ----
config.status
stamp-h1
+ serialprotocol.h
+ serialpacket.c
+ serialpacket.h
Index: Makefile.am
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/c/Attic/Makefile.am,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -d -r1.1.2.1 -r1.1.2.2
*** Makefile.am 16 Feb 2006 01:20:01 -0000 1.1.2.1
--- Makefile.am 2 May 2006 22:52:06 -0000 1.1.2.2
***************
*** 1,4 ****
--- 1,9 ----
AUTOMAKE_OPTIONS = foreign
+ TOS=$(shell ncc -print-tosdir)
+ SERIAL_H = $(TOS)/lib/serial/Serial.h
+
+ BUILT_SOURCES = serialpacket.h serialprotocol.h
+
bin_PROGRAMS=sf sflisten sfsend seriallisten
noinst_LIBRARIES=libmote.a
***************
*** 17,20 ****
--- 22,33 ----
libmote_a_SOURCES = \
+ message.c \
+ serialpacket.c \
serialsource.c \
sfsource.c
+
+ serialpacket.c serialpacket.h: $(SERIAL_H)
+ mig -o serialpacket.h --c-prefix=spacket c $(SERIAL_H) serial_packet
+
+ serialprotocol.h: $(SERIAL_H)
+ ncg -o $@ -c-prefix=SERIAL c $(SERIAL_H) Serial.h
Index: serialsource.c
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/c/Attic/serialsource.c,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -d -r1.1.2.1 -r1.1.2.2
*** serialsource.c 16 Feb 2006 01:20:01 -0000 1.1.2.1
--- serialsource.c 2 May 2006 22:52:07 -0000 1.1.2.2
***************
*** 23,26 ****
--- 23,27 ----
#include "serialsource.h"
+ #include "serialprotocol.h"
typedef int bool;
***************
*** 34,44 ****
MTU = 256,
ACK_TIMEOUT = 1000000, /* in us */
! SYNC_BYTE = 0x7e,
! ESCAPE_BYTE = 0x7d,
! P_ACK = 64,
! P_PACKET_ACK = 65,
! P_PACKET_NO_ACK = 66,
! P_UNKNOWN = 255
};
--- 35,45 ----
MTU = 256,
ACK_TIMEOUT = 1000000, /* in us */
! SYNC_BYTE = SERIAL_HDLC_FLAG_BYTE,
! ESCAPE_BYTE = SERIAL_HDLC_CTLESC_BYTE,
! P_ACK = SERIAL_SERIAL_PROTO_ACK,
! P_PACKET_ACK = SERIAL_SERIAL_PROTO_PACKET_ACK,
! P_PACKET_NO_ACK = SERIAL_SERIAL_PROTO_PACKET_NOACK,
! P_UNKNOWN = SERIAL_SERIAL_PROTO_PACKET_UNKNOWN
};
More information about the Tinyos-2-commits
mailing list