⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config.c

📁 含有完整TCP/IP PPP协议的嵌入式操作系统
💻 C
字号:
/* * Copyright (C) 2003 by egnite Software GmbH. 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 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 EGNITE SOFTWARE GMBH 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 EGNITE * SOFTWARE GMBH 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. * * For additional information see http://www.ethernut.de/ * *//*! * $Log: config.c,v $ * Revision 1.3  2004/05/11 17:23:05  drsung * Advanced radio stations are now used depending of macro ETHERNUT2. * * Revision 1.2  2003/11/04 17:46:52  haraldkipp * Adapted to Ethernut 2 * * Revision 1.1  2003/07/21 17:50:48  haraldkipp * First check in * */#include <sys/types.h>#include <stdlib.h>#include <string.h>#include <arpa/inet.h>#include <net/if_var.h>#include "config.h"#include <stdio.h>/*! * \brief List of radio stations. */RADIOSTATION *station;/*! * \brief Radio status and control. */RADIOCONTROL radio;/* * Save a binary into the EEPROM. */static int ConfigSaveBinary(int addr, void *val, size_t len){    size_t i;    u_char *cp = val;    for (i = 0; i < len; cp++, i++)        if (eeprom_read_byte((void *) (addr + i)) != *cp)            eeprom_write_byte((void *) (addr + i), *cp);    return len;}/* * Save a string into the EEPROM. */static int ConfigSaveString(int addr, u_char * str){    int rc = 0;    do {        if (eeprom_read_byte((void *) (addr + rc)) != *str)            eeprom_write_byte((void *) (addr + rc), *str);        rc++;    } while (*str++);    return rc;}/* * Read a string from EEPROM. */static size_t ConfigLoadString(int addr, u_char * str, size_t size){    size_t rc = 0;    while (rc < size) {        *str = eeprom_read_byte((void *) (addr + rc));        rc++;        if (*str++ == 0)            break;    }    return rc;}/* * Read a binary value from EEPROM. */static int ConfigLoadBinary(int addr, void *val, size_t len){    size_t i;    u_char *cp = val;    for (i = 0; i < len; cp++, i++)        *cp = eeprom_read_byte((void *) (addr + i));    return len;}/*! * \brief Calculate total size of configuration data. * * \return Number of bytes used by configuration data. */size_t ConfigSize(void){    size_t rc = 0;    u_char idx;    RADIOSTATION *rsp;    for (idx = 0; idx < MAXNUM_STATIONS; idx++) {        rsp = &station[idx];        if (station[idx].rs_port == 0)            break;        rc += sizeof(rsp->rs_port);        rc += sizeof(rsp->rs_ip);        if (rsp->rs_url)            rc += strlen(rsp->rs_url);        rc++;    }    rc += sizeof(station[0].rs_port);    return rc;}/*! * \brief Configure a station list entry. * * \param idx Index of the entry. * \param url URL of the station. * * \return 0 on success, -1 otherwise. */int ConfigStation(u_char idx, CONST u_char * url){    u_long ip;    u_short port = 80;    u_char *buf;    u_char *cp;    if (idx >= MAXNUM_STATIONS) {        idx = 0;        while (idx < MAXNUM_STATIONS && station[idx].rs_port)            idx++;    }    if (idx >= MAXNUM_STATIONS)        return -1;    else {        buf = malloc(strlen(url) + 1);        /* Extract IP address. */        cp = buf;        while (*url && *url != '/' && *url != ':')            *cp++ = *url++;        *cp = 0;        if ((int) (ip = inet_addr(buf)) == -1)            idx = -1;        else {            /* Extract URL path. */            cp = buf;            if (*url == '/') {                url++;                while (*url && *url != ':')                    *cp++ = *url++;            }            *cp = 0;            /* Extract port. */            if (*url == ':')                port = atoi(url + 1);            if (port) {                station[idx].rs_ip = ip;                station[idx].rs_port = port;                if (*buf) {                    station[idx].rs_url = malloc(strlen(buf) + 1);                    strcpy(station[idx].rs_url, buf);                }            }        }        free(buf);    }    return idx;}/* * Allocate heap memory for configuration structure. */static void ConfigCreate(void){    u_char idx;    if (station == 0)        station = malloc(MAXNUM_STATIONS * sizeof(RADIOSTATION));    else {        /* Release all memory occupied by the current configuration. */        for (idx = 0; idx < MAXNUM_STATIONS; idx++) {            if (station[idx].rs_port == 0)                break;            if (station[idx].rs_url)                free(station[idx].rs_url);        }    }    memset(station, 0, MAXNUM_STATIONS * sizeof(RADIOSTATION));}/*! * \brief Reset configuration. */void ConfigResetFactory(void){    ConfigCreate();    /* Initial radio control settings. */    radio.rc_rstation = 2;    radio.rc_rvolume = 223;    /*      * Add pre-configured radio stations.      */    /* Local server. */    ConfigStation(MAXNUM_STATIONS, "192.168.192.11:8000");    /* elDOradio 56 kbit */    ConfigStation(MAXNUM_STATIONS, "129.217.234.42/128:8000");    /* Virgin 32 kbit. */    ConfigStation(MAXNUM_STATIONS, "212.187.204.62:80");    /* qpop.nl 48 kbit */    ConfigStation(MAXNUM_STATIONS, "194.109.192.226:8010");    /* idobi 24 kbit */    ConfigStation(MAXNUM_STATIONS, "66.28.100.131:8004");    /* Radiosound-7-24 24 kbit. */    ConfigStation(MAXNUM_STATIONS, "64.202.98.51:7650");    /* DH Netradio 56 kbit */    ConfigStation(MAXNUM_STATIONS, "205.188.234.38:8030");    /* Cable radio 56 kbit. */    ConfigStation(MAXNUM_STATIONS, "62.25.96.7:8080");    /* MIBN1 40 kbit. */    ConfigStation(MAXNUM_STATIONS, "216.234.109.21:8000");    /* RFK 56 kbit */    ConfigStation(MAXNUM_STATIONS, "64.202.98.33:2530");    /* Braingell 24 kbit. */    ConfigStation(MAXNUM_STATIONS, "216.237.145.20:8000");    /* HipHop 48 kbit. */    ConfigStation(MAXNUM_STATIONS, "64.202.98.33:6150");    /* Flensburg 56 kbit */    ConfigStation(MAXNUM_STATIONS, "217.160.210.37:8000");    /* Boombastic 24 kbit. */    ConfigStation(MAXNUM_STATIONS, "212.43.230.20:8000");    /* Russia 24 kbit */    ConfigStation(MAXNUM_STATIONS, "62.118.255.5:9000");    /* Frequence3  16 kbit. */    ConfigStation(MAXNUM_STATIONS, "212.180.2.19:8010");    /* KCTI Country 16 kbit. */    ConfigStation(MAXNUM_STATIONS, "63.125.62.117:8000");    /* Klassik 40 kbit. */    ConfigStation(MAXNUM_STATIONS, "62.157.113.86:8000");    /* m2ktalk 8kbit */    ConfigStation(MAXNUM_STATIONS, "209.17.76.226:8010");    /* Christian Media 16 kbit. */    ConfigStation(MAXNUM_STATIONS, "64.202.98.32:6610");    /* Newsradio 24 kbit. */    ConfigStation(MAXNUM_STATIONS, "65.172.162.93:9191");#ifdef ETHERNUT2    /*     * These stations require Ethernut 2.     */    /* Grapeshot 128 kbit. */    ConfigStation(MAXNUM_STATIONS, "66.28.45.159:8075");    /* Radiostorm 128 kbit. */    ConfigStation(MAXNUM_STATIONS, "64.236.34.141/stream/1014:80");    /* Digitally imported 128 kbit. */    ConfigStation(MAXNUM_STATIONS, "205.188.209.193/stream/1003:80");    /* SmoothJazz 128 kbit */    ConfigStation(MAXNUM_STATIONS, "64.236.34.141/stream/1005:80");    /* Tosh Jamaica 128 kbit. */    ConfigStation(MAXNUM_STATIONS, "38.144.33.148:8022");    /* weird 160 kbit */    ConfigStation(MAXNUM_STATIONS, "209.98.88.40:8007");    /* Stratovarius 192 kbit */    ConfigStation(MAXNUM_STATIONS, "210.120.247.22:1290");    /* Virgin 128 kbit. */    ConfigStation(MAXNUM_STATIONS, "64.236.34.72/stream/1031:80");    /* Virgin 128 kbit. */    ConfigStation(MAXNUM_STATIONS, "64.236.34.141/stream/1031:80");#endif}/*! * \brief Load configuration from EEPROM. * * If no configuration is available, some preconfigured stations * are loaded. * * \return 0 on success, -1 if no configuration data had been found. */int ConfigLoad(void){    int rc = -1;    int addr = CONFAPP_EE_OFFSET;    char *buf;    u_char idx;    RADIOSTATION *rsp;    buf = malloc(MAXLEN_URL + 1);    addr += ConfigLoadString(addr, buf, sizeof(CONFAPP_EE_NAME));    if (strcmp(buf, CONFAPP_EE_NAME) == 0) {        ConfigCreate();        rc = 0;        /*          * Read radio settings from EEPROM.         */        addr += ConfigLoadBinary(addr, &radio.rc_rstation, sizeof(radio.rc_rstation));        addr += ConfigLoadBinary(addr, &radio.rc_rvolume, sizeof(radio.rc_rvolume));        /*          * Read station configuration from EEPROM.         */        for (idx = 0; idx < MAXNUM_STATIONS; idx++) {            rsp = &station[idx];            addr += ConfigLoadBinary(addr, &rsp->rs_port, sizeof(rsp->rs_port));            addr += ConfigLoadBinary(addr, &rsp->rs_ip, sizeof(rsp->rs_ip));            addr += ConfigLoadString(addr, buf, MAXLEN_URL);            if (*buf) {                rsp->rs_url = malloc(strlen(buf) + 1);                strcpy(rsp->rs_url, buf);            }        }    }    free(buf);    return rc;}/*! * \brief Save radio control settings. * * Saves currently selected station and volume. */void ConfigSaveControl(void){    int addr = CONFAPP_EE_OFFSET + sizeof(CONFAPP_EE_NAME);    /* Save radio control. */    addr += ConfigSaveBinary(addr, &radio.rc_cstation, sizeof(radio.rc_cstation));    addr += ConfigSaveBinary(addr, &radio.rc_cvolume, sizeof(radio.rc_cvolume));}/*! * \brief Save configuration in EEPROM. */void ConfigSave(void){    u_char idx;    RADIOSTATION *rsp;    int addr = CONFAPP_EE_OFFSET;    NutNetSaveConfig();    /* Save our name. */    addr += ConfigSaveString(addr, CONFAPP_EE_NAME);    /* Save radio control. */    addr += ConfigSaveBinary(addr, &radio.rc_cstation, sizeof(radio.rc_cstation));    addr += ConfigSaveBinary(addr, &radio.rc_cvolume, sizeof(radio.rc_cvolume));    /* Save stations. */    for (idx = 0; idx < MAXNUM_STATIONS; idx++) {        rsp = &station[idx];        addr += ConfigSaveBinary(addr, &rsp->rs_port, sizeof(rsp->rs_port));        addr += ConfigSaveBinary(addr, &rsp->rs_ip, sizeof(rsp->rs_ip));        if (rsp->rs_url)            addr += ConfigSaveString(addr, rsp->rs_url);        else            addr += ConfigSaveString(addr, "");    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -