[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