From 8a401ea9d9ecc681fd20a3c9e5e2901c49120300 Mon Sep 17 00:00:00 2001 From: julienabeille Date: Tue, 14 Oct 2008 09:45:17 +0000 Subject: [PATCH] apps for raven LCD menu --- .../Makefile.raven-lcd-interface | 3 + apps/raven-lcd-interface/raven-lcd.c | 270 ++++++++++++++++++ apps/raven-lcd-interface/raven-lcd.h | 13 + 3 files changed, 286 insertions(+) create mode 100644 apps/raven-lcd-interface/Makefile.raven-lcd-interface create mode 100644 apps/raven-lcd-interface/raven-lcd.c create mode 100644 apps/raven-lcd-interface/raven-lcd.h diff --git a/apps/raven-lcd-interface/Makefile.raven-lcd-interface b/apps/raven-lcd-interface/Makefile.raven-lcd-interface new file mode 100644 index 000000000..daab50e37 --- /dev/null +++ b/apps/raven-lcd-interface/Makefile.raven-lcd-interface @@ -0,0 +1,3 @@ +raven-lcd-interface_src = raven-lcd.c + + diff --git a/apps/raven-lcd-interface/raven-lcd.c b/apps/raven-lcd-interface/raven-lcd.c new file mode 100644 index 000000000..bd2e50dfb --- /dev/null +++ b/apps/raven-lcd-interface/raven-lcd.c @@ -0,0 +1,270 @@ +/* Copyright (c) 2008, Swedish Institute of Computer Science + * All rights reserved. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $Id: raven-lcd.c,v 1.1 2008/10/14 09:45:17 julienabeille Exp $ +*/ + +/** + * \brief This module contains code to interface a Contiki-based + * project on the AVR Raven platform's ATMega1284P chip to the LCD + * driver chip (ATMega3290P) on the Raven. + * + * \author Blake Leverett + * +*/ + +/** \addtogroup raven + * @{ + */ + +/** + * \defgroup ravenserial Serial interface between Raven processors + * @{ + */ +/** + * \file + * This file contains code to connect the two AVR Raven processors via a serial connection. + * + */ + + + +#include "contiki.h" +#include "contiki-lib.h" +#include "contiki-net.h" +#include "webserver-nogui.h" +#include "httpd-cgi.h" + +#include "frame.h" +#include "mac.h" + +#include "raven-lcd.h" + +#include +#include + + +static u16_t addr[8]; +static u8_t count = 0; +static u8_t seqno; +uip_ipaddr_t dest_addr; + +#define cmd_len 8 +static struct{ + u8_t frame[cmd_len]; + u8_t ndx; + u8_t len; + u8_t cmd; + u8_t done; +} cmd; + +#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) +#define UIP_ICMP_BUF ((struct uip_icmp_hdr *)&uip_buf[uip_l2_l3_hdr_len]) +#define PING6_DATALEN 16 +#define CMD_PING 0x81 +#define CMD_TEMP 0x80 + +#define SOF_CHAR 1 +#define EOF_CHAR 4 + +void rs232_send(uint8_t port, unsigned char c); + + +/*---------------------------------------------------------------------------*/ +/* Sends a ping packet out the radio */ +static void +raven_ping6(void) +{ + /* ping the router */ + // Setup destination address. + struct uip_nd6_defrouter *defrouter; + uint8_t i,tmp; + + defrouter = uip_nd6_choose_defrouter(); + /* Get address from defrouter struct */ + memcpy(addr, defrouter->nb->ipaddr.u8, 16); + /* Swap the bytes in the address array */ + for (i=0;i<8;i++) + { + tmp = addr[i] & 0xff; + addr[i] >>= 8; + addr[i] |= tmp << 8; + } + uip_ip6addr(&dest_addr, addr[0], addr[1],addr[2], + addr[3],addr[4],addr[5],addr[6],addr[7]); + + UIP_IP_BUF->vtc = 0x60; + UIP_IP_BUF->tcflow = 1; + UIP_IP_BUF->flow = 0; + UIP_IP_BUF->proto = UIP_PROTO_ICMP6; + UIP_IP_BUF->ttl = uip_netif_physical_if.cur_hop_limit; + uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &dest_addr); + uip_netif_select_src(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr); + + UIP_ICMP_BUF->type = ICMP6_ECHO_REQUEST; + UIP_ICMP_BUF->icode = 0; + /* set identifier and sequence number to 0 */ + memset((void *)UIP_ICMP_BUF + UIP_ICMPH_LEN, 0, 4); + /* put one byte of data */ + memset((void *)UIP_ICMP_BUF + UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN, + count, PING6_DATALEN); + + + uip_len = UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN + UIP_IPH_LEN + PING6_DATALEN; + UIP_IP_BUF->len[0] = (u8_t)((uip_len - 40) >> 8); + UIP_IP_BUF->len[1] = (u8_t)((uip_len - 40) & 0x00FF); + + UIP_ICMP_BUF->icmpchksum = 0; + UIP_ICMP_BUF->icmpchksum = ~uip_icmp6chksum(); + + + tcpip_ipv6_output(); +} + +/*---------------------------------------------------------------------------*/ +/* Send a serial command frame to the ATMega3290 Processsor on Raven via serial port */ +static void +send_frame(uint8_t cmd, uint8_t len, uint8_t *payload) +{ + uint8_t i; + + rs232_send(0, SOF_CHAR); /* Start of Frame */ + rs232_send(0, len); + rs232_send(0, cmd); + for (i=0;i= cmd.len+3){ + /* all done, check ETX */ + if (ch == 0x04){ + cmd.done = true; + process_post(&raven_lcd_process, SERIAL_CMD, 0); + } else { + /* Failed ETX */ + cmd.ndx = 0; + } + } else { + /* Just grab and store payload */ + cmd.frame[cmd.ndx - 3] = ch; + } + break; + } + + cmd.ndx++; + + return 0; +} + +/*---------------------------------------------------------------------------*/ +PROCESS(raven_lcd_process, "Raven LCD interface process"); +PROCESS_THREAD(raven_lcd_process, ev, data) +{ + u8_t error; + + PROCESS_BEGIN(); + + if((error = icmp6_new(NULL)) == 0) { + while(1) { + PROCESS_YIELD(); + raven_gui_loop(ev, data); + } + } + PROCESS_END(); +} +/** @} */ +/** @} */ diff --git a/apps/raven-lcd-interface/raven-lcd.h b/apps/raven-lcd-interface/raven-lcd.h new file mode 100644 index 000000000..f30407d55 --- /dev/null +++ b/apps/raven-lcd-interface/raven-lcd.h @@ -0,0 +1,13 @@ +#ifndef raven_lcd_h +#define raven_lcd_h + +int raven_lcd_serial_input(unsigned char ch); +PROCESS_NAME(raven_lcd_process); + +/* Events for the Raven LCD processing loop */ +#define PING_REQUEST 0xc1 +#define PING_REPLY 0xc0 +#define SERIAL_CMD 0x1 + + +#endif