/* * Copyright (c) 2011, Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Institute nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE 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. * * This file is part of the Contiki operating system. * */ #define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args) #define DEBUG 0 #if DEBUG #define PRINTD(FORMAT,args...) printf_P(PSTR(FORMAT),##args) #else #define PRINTD(...) #endif #include "contiki.h" #include "bootloader_if.h" #include #include #include #include #if AVR_WEBSERVER //#include "httpd-fs.h" //#include "httpd-cgi.h" #endif #include "contiki-net.h" #include "params.h" #if WITH_NODE_ID uint16_t node_id; #endif #if CONTIKI_CONF_RANDOM_MAC extern uint8_t rng_get_uint8(void); static void generate_new_eui64(uint8_t eui64[8]) { eui64[0] = 0x02; eui64[1] = rng_get_uint8(); eui64[2] = rng_get_uint8(); eui64[3] = 0xFF; eui64[4] = 0xFE; eui64[5] = rng_get_uint8(); eui64[6] = rng_get_uint8(); eui64[7] = rng_get_uint8(); } #endif #if AVR_WEBSERVER /* Webserver builds can set these in httpd-fsdata.c via makefsdata.h */ extern uint8_t default_mac_address[8]; extern uint8_t default_server_name[16]; extern uint8_t default_domain_name[30]; #else const uint8_t default_mac_address[8] PROGMEM = PARAMS_EUI64ADDR; const uint8_t default_server_name[] PROGMEM = PARAMS_SERVERNAME; const uint8_t default_domain_name[] PROGMEM = PARAMS_DOMAINNAME; #endif #if PARAMETER_STORAGE==0 /* 0 Hard coded, minmal program and eeprom usage. */ uint8_t params_get_eui64(uint8_t *eui64) { #if CONTIKI_CONF_RANDOM_MAC PRINTD("Generating random EUI64 MAC\n"); generate_new_eui64(eui64); return 1; #else uint8_t i; #if BOOTLOADER_GET_MAC for (i=0;i 26)) x[1]=x[0]; /* Do exclusive or test on the two values read */ if((uint8_t)x[0]!=(uint8_t)~x[1]) {//~x[1] can promote comparison to 16 bit /* Verification fails, rewrite everything */ uint8_t i,buffer[32]; PRINTD("EEPROM is corrupt, rewriting with defaults.\n"); #if CONTIKI_CONF_RANDOM_MAC PRINTD("Generating random EUI64 MAC\n"); generate_new_eui64(&buffer); randomeui64=1; #else for (i=0;iSet EEPROM RF channel to %d\n",x); } } return x; } uint8_t params_get_eui64(uint8_t *eui64) { size_t size = sizeof(linkaddr_t); if(settings_get(SETTINGS_KEY_EUI64, 0, (unsigned char*)eui64, &size) == SETTINGS_STATUS_OK) { PRINTD("<-Get EUI64 MAC\n"); return 0; } #if CONTIKI_CONF_RANDOM_MAC PRINTD("Generating random EUI64 MAC\n"); generate_new_eui64(eui64); #else uint8_t i; #if BOOTLOADER_GET_MAC for (i=0;iSet EEPROM MAC address\n"); } #if CONTIKI_CONF_RANDOM_MAC return 1; #else return 0; #endif } uint16_t params_get_panid(void) { uint16_t x; size_t size = 2; if (settings_get(SETTINGS_KEY_PAN_ID, 0,(unsigned char*)&x, &size) == SETTINGS_STATUS_OK) { PRINTD("<-Get PAN ID of %04x\n",x); } else { x=IEEE802154_PANID; if (settings_add_uint16(SETTINGS_KEY_PAN_ID,x)==SETTINGS_STATUS_OK) { PRINTD("->Set EEPROM PAN ID to %04x\n",x); } } return x; } uint16_t params_get_panaddr(void) { uint16_t x; size_t size = 2; if (settings_get(SETTINGS_KEY_PAN_ADDR, 0,(unsigned char*)&x, &size) == SETTINGS_STATUS_OK) { PRINTD("<-Get PAN address of %04x\n",x); } else { x=PARAMS_PANADDR; if (settings_add_uint16(SETTINGS_KEY_PAN_ADDR,x)==SETTINGS_STATUS_OK) { PRINTD("->Set EEPROM PAN address to %04x\n",x); } } return x; } uint8_t params_get_txpower(void) { uint8_t x; size_t size = 1; PRINTD("params_get_txpower\n",x); if (settings_get(SETTINGS_KEY_TXPOWER, 0,(unsigned char*)&x, &size) == SETTINGS_STATUS_OK) { PRINTD("<-Get tx power of %d (0=max)\n",x); } else { x=PARAMS_TXPOWER; if (settings_add_uint8(SETTINGS_KEY_TXPOWER,x)==SETTINGS_STATUS_OK) { PRINTD("->Set EEPROM tx power of %d (0=max)\n",x); } } return x; } uint8_t params_get_ccathresholds(void) { uint8_t x; size_t size = 1; if (settings_get(SETTINGS_KEY_TXPOWER, 0,(unsigned char*)&x, &size) == SETTINGS_STATUS_OK) { PRINTD("<-Get tx power of %d (0=max)\n",x); } else { x=PARAMS_TXPOWER; if (settings_add_uint8(SETTINGS_KEY_TXPOWER,x)==SETTINGS_STATUS_OK) { PRINTD("->Set EEPROM tx power of %d (0=max)\n",x); } } return x; } settings_status_t params_save_panid(void) { radio_value_t value; settings_status_t rx=SETTINGS_STATUS_OK; if(NETSTACK_RADIO.get_value(RADIO_PARAM_PAN_ID, &value) == RADIO_RESULT_OK) { PRINTD("%04x\n", value); if(settings_set_uint16(SETTINGS_KEY_PAN_ID, value) != SETTINGS_STATUS_OK) { PRINTD("settings-panid: `save` failed: \n"); rx = SETTINGS_STATUS_FAILURE; } } else { rx = SETTINGS_STATUS_FAILURE; } return rx; } settings_status_t params_save_channel(void) { radio_value_t value; settings_status_t rx=SETTINGS_STATUS_OK; if(NETSTACK_RADIO.get_value(RADIO_PARAM_CHANNEL, &value) == RADIO_RESULT_OK) { PRINTD("%d\n", value); if(settings_set_uint8(SETTINGS_KEY_CHANNEL, value) != SETTINGS_STATUS_OK) { PRINTD("settings-channel: `save` failed: \n"); rx = SETTINGS_STATUS_FAILURE; } } else { rx = SETTINGS_STATUS_FAILURE; } return rx; } settings_status_t params_save_txpower(void) { radio_value_t value; settings_status_t rx=SETTINGS_STATUS_OK; if(NETSTACK_RADIO.get_value(RADIO_PARAM_TXPOWER, &value) == RADIO_RESULT_OK) { PRINTD("%d\n", value); if(settings_set_uint8(SETTINGS_KEY_TXPOWER, value) != SETTINGS_STATUS_OK) { PRINTD("settings-txpower: `save` failed: \n"); rx = SETTINGS_STATUS_FAILURE; } } else { rx = SETTINGS_STATUS_FAILURE; } return rx; } radio_result_t get_param(radio_param_t param, radio_value_t *value) { radio_result_t rv; rv = NETSTACK_RADIO.get_value(param, value); switch(rv) { case RADIO_RESULT_ERROR: printf("Radio returned an error\n"); break; case RADIO_RESULT_INVALID_VALUE: printf("Value %d is invalid\n", *value); break; case RADIO_RESULT_NOT_SUPPORTED: printf("Param %u not supported\n", param); break; case RADIO_RESULT_OK: break; default: printf("Unknown return value\n"); break; } return rv; } /*---------------------------------------------------------------------------*/ radio_result_t set_param(radio_param_t param, radio_value_t value) { radio_result_t rv; rv = NETSTACK_RADIO.set_value(param, value); switch(rv) { case RADIO_RESULT_ERROR: printf("Radio returned an error\n"); break; case RADIO_RESULT_INVALID_VALUE: printf("Value %d is invalid\n", value); break; case RADIO_RESULT_NOT_SUPPORTED: printf("Param %u not supported\n", param); break; case RADIO_RESULT_OK: break; default: printf("Unknown return value\n"); break; } return rv; } #endif /* CONTIKI_CONF_SETTINGS_MANAGER */