📄 tossim.c
字号:
/* * "Copyright (c) 2005 Stanford University. All rights reserved. * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice, the following two paragraphs and the author appear in all * copies of this software. * * IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN * IF STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * STANFORD UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND STANFORD UNIVERSITY * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, * ENHANCEMENTS, OR MODIFICATIONS." *//** * Implementation of TOSSIM C++ classes. Generally just directly * call their C analogues. * * @author Philip Levis * @author Chad Metcalf * @date July 15 2007 */// $Id: tossim.c,v 1.1 2007/10/03 01:50:20 hiro Exp $#include <stdint.h>#include <tossim.h>#include <sim_tossim.h>#include <sim_mote.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <hashtable.h>#include <mac.c>#include <radio.c>#include <packet.c>#include <SerialPacket.c>#include <sim_noise.h>uint16_t TOS_NODE_ID = 1;Variable::Variable(char* str, char* formatStr, int array, int which) { name = str; format = formatStr; isArray = array; mote = which; int sLen = strlen(name); realName = (char*)malloc(sLen + 1); memcpy(realName, name, sLen + 1); realName[sLen] = 0; for (int i = 0; i < sLen; i++) { if (realName[i] == '.') { realName[i] = '$'; } } // printf("Creating %s realName: %s format: %s %s\n", name, realName, formatStr, array? "[]":""); if (sim_mote_get_variable_info(mote, realName, &ptr, &len) == 0) { data = (char*)malloc(len + 1); data[len] = 0; } else { printf("Could not find variable %s\n", realName); data = NULL; ptr = NULL; } printf("Allocated variable %s\n", realName);}Variable::~Variable() { printf("Freeing variable %s\n", realName); free(data); free(realName);}/* This is the sdbm algorithm, taken from http://www.cs.yorku.ca/~oz/hash.html -pal */static unsigned int tossim_hash(void* key) { char* str = (char*)key; unsigned int hashVal = 0; int c; while ((c = *str++)) hashVal = c + (hashVal << 6) + (hashVal << 16) - hashVal; return hashVal;}static int tossim_hash_eq(void* key1, void* key2) { return strcmp((char*)key1, (char*)key2) == 0;}variable_string_t Variable::getData() { if (data != NULL && ptr != NULL) { str.ptr = data; str.type = format; str.len = len; str.isArray = isArray; // printf("Getting %s %s %s\n", format, isArray? "[]":"", name); memcpy(data, ptr, len); } else { str.ptr = "<no such variable>"; str.type = "<no such variable>"; str.len = strlen("<no such variable>"); str.isArray = 0; } return str;}Mote::Mote(nesc_app_t* n) { app = n; varTable = create_hashtable(128, tossim_hash, tossim_hash_eq);}Mote::~Mote(){}unsigned long Mote::id() { return nodeID;}long long int Mote::euid() { return sim_mote_euid(nodeID);}void Mote::setEuid(long long int val) { sim_mote_set_euid(nodeID, val);}long long int Mote::bootTime() { return sim_mote_start_time(nodeID);}void Mote::bootAtTime(long long int time) { sim_mote_set_start_time(nodeID, time); sim_mote_enqueue_boot_event(nodeID);}bool Mote::isOn() { return sim_mote_is_on(nodeID);}void Mote::turnOff() { sim_mote_turn_off(nodeID);}void Mote::turnOn() { sim_mote_turn_on(nodeID);}void Mote::setID(unsigned long val) { nodeID = val;}Variable* Mote::getVariable(char* name) { char* typeStr = ""; int isArray; Variable* var; var = (Variable*)hashtable_search(varTable, name); if (var == NULL) { // Could hash this for greater efficiency, // but that would either require transformation // in Tossim class or a more complex typemap. if (app != NULL) { for (int i = 0; i < app->numVariables; i++) { if(strcmp(name, app->variableNames[i]) == 0) { typeStr = app->variableTypes[i]; isArray = app->variableArray[i]; break; } } } // printf("Getting variable %s of type %s %s\n", name, typeStr, isArray? "[]" : ""); var = new Variable(name, typeStr, isArray, nodeID); hashtable_insert(varTable, name, var); } return var;}void Mote::addNoiseTraceReading(int val) { sim_noise_trace_add(id(), (char)val);}void Mote::createNoiseModel() { sim_noise_create_model(id());}int Mote::generateNoise(int when) { return (int)sim_noise_generate(id(), when);}Tossim::Tossim(nesc_app_t* n) { app = n; init();}Tossim::~Tossim() { sim_end();}void Tossim::init() { sim_init(); motes = (Mote**)malloc(sizeof(Mote*) * (TOSSIM_MAX_NODES + 1)); memset(motes, 0, sizeof(Mote*) * TOSSIM_MAX_NODES);}long long int Tossim::time() { return sim_time();}long long int Tossim::ticksPerSecond() { return sim_ticks_per_sec();}char* Tossim::timeStr() { sim_print_now(timeBuf, 256); return timeBuf;}void Tossim::setTime(long long int val) { sim_set_time(val);}Mote* Tossim::currentNode() { return getNode(sim_node());}Mote* Tossim::getNode(unsigned long nodeID) { if (nodeID > TOSSIM_MAX_NODES) { nodeID = TOSSIM_MAX_NODES; // log an error, asked for an invalid node } else { if (motes[nodeID] == NULL) { motes[nodeID] = new Mote(app); if (nodeID == TOSSIM_MAX_NODES) { motes[nodeID]->setID(0xffff); } else { motes[nodeID]->setID(nodeID); } } return motes[nodeID]; }}void Tossim::setCurrentNode(unsigned long nodeID) { sim_set_node(nodeID);}void Tossim::addChannel(char* channel, FILE* file) { sim_add_channel(channel, file);}bool Tossim::removeChannel(char* channel, FILE* file) { return sim_remove_channel(channel, file);}void Tossim::randomSeed(int seed) { return sim_random_seed(seed);}bool Tossim::runNextEvent() { return sim_run_next_event();}MAC* Tossim::mac() { return new MAC();}Radio* Tossim::radio() { return new Radio();}Packet* Tossim::newPacket() { return new Packet();}SerialPacket* Tossim::newSerialPacket() { return new SerialPacket();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -