[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