[Tinyos-commits] CVS: tinyos-1.x/tos/lib/VM/languages/motlle/src mate-interface.mt, 1.4, 1.5 sf.mt, 1.3, 1.4

David Gay idgay at users.sourceforge.net
Thu Nov 17 14:38:59 PST 2005


Update of /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2235

Modified Files:
	mate-interface.mt sf.mt 
Log Message:
support non-mica platforms, which implies
  - supporting the new serial forwarder protocol
  - handling per-platform header formats


Index: mate-interface.mt
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/src/mate-interface.mt,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** mate-interface.mt	1 Nov 2005 02:28:11 -0000	1.4
--- mate-interface.mt	17 Nov 2005 22:38:57 -0000	1.5
***************
*** 11,69 ****
  any mvirus_chunk_size;
  any chunk_offset = 6;
- any data_offset = 5;
  any value_size;
  any version = 1;
  any debug_level = 0;
  
- any hexchar(n)
-   if (n <= 9) '0' + n
-   else 'a' + n - 10;
- 
- any hex8(n)
- {
-   any s = make_string(2);
-   s[0] = hexchar((n & 0xf0) >> 4);
-   s[1] = hexchar(n & 0xf);
-   s;
- }
- 
- any hexprint(s)
- {
-   for (any i = 0; i < string_length(s); i++)
-     display(format("%s ", hex8(s[i])));
-   newline();
- }
- 
- any write16(s, offset, n)
- {
-   s[offset] = n;
-   s[offset + 1] = n >> 8;
- }
- 
- any write32(s, offset, n)
- {
-   s[offset] = n;
-   s[offset + 1] = n >> 8;
-   s[offset + 2] = n >> 16;
-   s[offset + 3] = n >> 24;
- }
- 
- any read32(s, offset)
- {
-   return
-     s[offset] | s[offset + 1] << 8 | s[offset + 2] << 16 | s[offset + 3] << 24;
- }
- 
- any make_packet(dest, id, length)
- {
-   any p = make_string(length + data_offset);
- 
-   write16(p, 0, dest);
-   p[2] = id;
-   p[4] = length;
- 
-   return p;
- }
- 
  any mate_compile(compile, s)
  {
--- 11,18 ----
***************
*** 114,120 ****
      
    // send image in chunks...
!   packet = make_packet(0xffff, 0x20, mvirus_chunk_size + chunk_offset);
!   write32(packet, data_offset, version++);
!   packet[data_offset + 4] = 0;
  
    piece = 0;
--- 63,69 ----
      
    // send image in chunks...
!   packet = make_string(mvirus_chunk_size + chunk_offset);
!   write32(packet, 0, version++);
!   packet[4] = 0;
  
    piece = 0;
***************
*** 122,131 ****
    for (;;)
      {
!       any i;
  
!       packet[data_offset + 5] = piece++;
        i = 0;
        while (i < mvirus_chunk_size && offset < ilen)
! 	packet[data_offset + chunk_offset + i++] = image[offset++];
  
        if (debug_level >= 2)
--- 71,80 ----
    for (;;)
      {
!       int i;
  
!       packet[5] = piece++;
        i = 0;
        while (i < mvirus_chunk_size && offset < ilen)
! 	packet[chunk_offset + i++] = image[offset++];
  
        if (debug_level >= 2)
***************
*** 135,139 ****
  	}
  
!       if (write_sf_packet(fd, packet) < 0)
  	{
  	  display(format("\n program send FAILED on packet %d\n", piece));
--- 84,88 ----
  	}
  
!       if (write_sf_packet(fd, broadcast, 0x20, packet) < 0)
  	{
  	  display(format("\n program send FAILED on packet %d\n", piece));
***************
*** 152,165 ****
  any read_mate_version(sf)
  {
!   any version_request = make_string(5), version_msg;
! 
!   write16(version_request, 0, 0xffff);
!   version_request[2] = 0x22;
!   version_request[4] = 0;
  
!   if (write_sf_packet(sf, version_request) == 0 &&
!       string?(version_msg = read_sf_packet(sf, 2000)))
      {
!       version = read32(version_msg, 5) + 1;
        return true;
      }
--- 101,110 ----
  any read_mate_version(sf)
  {
!   any version_msg;
  
!   if (write_sf_packet(sf, broadcast, 0x22, "") == 0 &&
!       vector?(version_msg = read_sf_packet(sf, 2000)))
      {
!       version = read32(version_msg[fm_body], 0) + 1;
        return true;
      }
***************
*** 198,202 ****
  	  if (!host) host = "localhost";
  	  sf = open_sf_source(host, 9001);
! 	  if (sf >= 0)
  	    {
  	      get_mate_version(sf);
--- 143,147 ----
  	  if (!host) host = "localhost";
  	  sf = open_sf_source(host, 9001);
! 	  if (sf)
  	    {
  	      get_mate_version(sf);
***************
*** 210,216 ****
      },
  	       fn (error)
! 		 pformat(stdout(), "unexpected ERROR %d\n", error));
!   if (sf >= 0)
!     unix_close(sf);
  
    ok;
--- 155,161 ----
      },
  	       fn (error)
! 		 pformat(stdout(), "unexpected ERROR %s\n", error));
!   if (sf)
!     unix_close(car(sf));
  
    ok;

Index: sf.mt
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/src/sf.mt,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** sf.mt	1 Nov 2005 02:28:11 -0000	1.3
--- sf.mt	17 Nov 2005 22:38:57 -0000	1.4
***************
*** 8,11 ****
--- 8,14 ----
   * 94704.  Attention:  Intel License Inquiry.
   */
+ 
+ any debug_level;
+ 
  any saferead(fd, s)
  {
***************
*** 20,24 ****
        actual += n;
      };
!   return true;
  }
  
--- 23,27 ----
        actual += n;
      };
!   return s;
  }
  
***************
*** 35,39 ****
        actual += n;
      };
!   return true;
  }
  
--- 38,146 ----
        actual += n;
      };
!   return s;
! }
! 
! any hexchar(n)
!   if (n <= 9) '0' + n
!   else 'a' + n - 10;
! 
! any hex8(n)
! {
!   any s = make_string(2);
!   s[0] = hexchar((n & 0xf0) >> 4);
!   s[1] = hexchar(n & 0xf);
!   s;
! }
! 
! any hexprint(s)
! {
!   for (any i = 0; i < string_length(s); i++)
!     display(format("%s ", hex8(s[i])));
!   newline();
! }
! 
! any write16(s, offset, n)
! {
!   s[offset] = n;
!   s[offset + 1] = n >> 8;
! }
! 
! any write32(s, offset, n)
! {
!   s[offset] = n;
!   s[offset + 1] = n >> 8;
!   s[offset + 2] = n >> 16;
!   s[offset + 3] = n >> 24;
! }
! 
! any read16(s, offset)
!   s[offset] | s[offset + 1] << 8;
! 
! any read32(s, offset)
!   s[offset] | s[offset + 1] << 8 | s[offset + 2] << 16 | s[offset + 3] << 24;
! 
! 
! int broadcast = 0xffff;
! int platform_mica = 1, platform_telos = 2, platform_micaz = 3,
!   platform_eyes = 4;
! vector platforms;
! int fp_read_header = 0, fp_write_header = 1, fp_data_offset = 2;
! int fm_addr = 0, fm_id = 1, fm_body = 2;
! 
! {
!   // Encode and decode headers for each platform. The encoders leave
!   // space for 1 byte for the total packet length.
!   any read_mica_header(string msg) 
!     vector(read16(msg, 0), msg[2], msg[4]);
! 
!   any write_mica_header(string msg, int addr, int id, int length)
!   {
!     write16(msg, 1, addr);
!     msg[3] = id;
!     msg[5] = length;
!   }
! 
!   any read_cc2420_header(string msg) 
!     vector(read16(msg, 6), msg[8], msg[0]);
! 
!   any write_cc2420_header(string msg, int addr, int id, int length)
!   {
!     write16(msg, 7, addr);
!     msg[9] = id;
!     msg[1] = length;
!   }
! 
!   platforms =
!     vector(false,
! 	   vector(read_mica_header, write_mica_header, 5),
! 	   vector(read_cc2420_header, write_cc2420_header, 10),
! 	   vector(read_cc2420_header, write_cc2420_header, 10));
! }
! 
! any make_packet(platform, dest, id, s)
! {
!   int length = string_length(s);
!   int offset = 1 + platforms[platform][fp_data_offset];
!   string p = make_string(offset + length);
! 
!   platforms[platform][fp_write_header](p, dest, id, length);
!   for (int i = 0; i < length; i++)
!     p[offset + i] = s[i];
! 
!   return p;
! }
! 
! any unmake_packet(platform, packet)
! {
!   vector header = platforms[platform][fp_read_header](packet);
!   int length = header[fm_body];
!   int offset = platforms[platform][fp_data_offset];
!   string body = make_string(length);
! 
!   for (int i = 0; i < length; i++)
!     body[i] = packet[offset + i];
!   header[fm_body] = body;
! 
!   return header;
  }
  
***************
*** 44,75 ****
  {
    any fd = unix_tcp_connect(host, port);
  
!   if (fd >= 0 && init_sf_source(fd) < 0)
      {
        unix_close(fd);
!       fd = -1;
      }
!   return fd;
  }
  
  any init_sf_source(fd)
! "n1 -> n2. Initialise connection to serial forwarder on fd n1.\n\
! Return 0 if successful, -1 if serial forwarder not recognised"
  {
    any version = make_string(2);
  
!   if (safewrite(fd, "T ") && saferead(fd, version) &&
!       version[0] == 'T' && version[1] >= ' ')
!     0;
!   else
!     -1;
  }
  
! any read_sf_packet(fd, timeout)
! "n1 n2 -> s. Read a packet from serial forwarder on fd n1, with timeout\n\
! n2 (null for infinite).\n\
! Return -1 for failure, 0 for time out, packet for success"
  {
    any length = make_string(1), packet, ok;
  
    ok = unix_select(fd . null, null, null, timeout);
--- 151,199 ----
  {
    any fd = unix_tcp_connect(host, port);
+   if (fd < 0)
+     return false;
  
!   any sf = init_sf_source(fd);
!   if (!sf)
      {
        unix_close(fd);
!       return false;
      }
! 
!   return sf;
  }
  
  any init_sf_source(fd)
! "n1 -> sf. Initialise connection to serial forwarder on fd n1.\n\
! Return a serial forwarder descriptor if successful, false if serial\n\
! forwarder not recognised"
  {
    any version = make_string(2);
+   int platform = platform_mica; // default
  
!   if (!(safewrite(fd, "T!") && saferead(fd, version) &&
! 	version[0] == 'T' && version[1] >= ' '))
!     return false;
! 
!   if (version[1] >= '!') 
!     {
!       any platformid = saferead(fd, make_string(4));
! 
!       if (!platformid || !safewrite(fd, make_string(4)))
! 	return false;
!       platform = read32(platformid, 0);
!     }
! 
!   return fd . platform;
  }
  
! any read_sf_packet(sf, timeout)
! "n1 n2 -> [n3, n4, s]. Read a packet from serial forwarder on fd n1, with\n\
! timeout n2 (null for infinite).\n\
! Return -1 for failure, 0 for time out, packet for success. A packet has\n\
! a from address (n3), and id (n4) and a body (s)"
  {
    any length = make_string(1), packet, ok;
+   int fd = car(sf);
  
    ok = unix_select(fd . null, null, null, timeout);
***************
*** 80,96 ****
        packet = make_string(length[0]);
        if (saferead(fd, packet))
! 	return packet;
      }
    return -1;
  }
  
! any write_sf_packet(fd, packet)
! "n1 s -> n2. Writes packet s to serial forwarder on fd n1.\n\
  Returns -1 for failure, 0 for success"
  {
!   any length = make_string(1);
  
!   length[0] = string_length(packet);
!   if (safewrite(fd, length) && safewrite(fd, packet))
      0;
    else
--- 204,233 ----
        packet = make_string(length[0]);
        if (saferead(fd, packet))
! 	{
! 	  if (debug_level >= 3)
! 	    {
! 	      display("received ");
! 	      hexprint(packet);
! 	    }
! 	  return unmake_packet(cdr(sf), packet);
! 	}
      }
    return -1;
  }
  
! any write_sf_packet(sf, dest, id, body)
! "sf n2 n3 s -> n4. Writes packet s to serial forwarder on fd n1. The header\n\
! is constructed from the destination address (n2), id (n3) and body (s).\n\
  Returns -1 for failure, 0 for success"
  {
!   string packet = make_packet(cdr(sf), dest, id, body);
  
!   packet[0] = string_length(packet) - 1;
!   if (debug_level >= 3)
!     {
!       display(format("sending(sf %s) ", sf));
!       hexprint(packet);
!     }
!   if (safewrite(car(sf), packet))
      0;
    else



More information about the Tinyos-commits mailing list