commit 2e9b87dab63238d0e23416745b80d1f084e4e14d Author: dviid Date: Sat Nov 30 21:22:19 2013 +0100 HAHA! commit Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5509140 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.DS_Store diff --git a/of/waspmote_spacebrew_bridge/.gitignore b/of/waspmote_spacebrew_bridge/.gitignore new file mode 100644 index 0000000..1c338b8 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/.gitignore @@ -0,0 +1,130 @@ +######################### +# .gitignore file for Xcode4 / OS X Source projects +# +# Version 2.0 +# For latest version, see: http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects +# +# 2013 updates: +# - fixed the broken "save personal Schemes" +# +# NB: if you are storing "built" products, this WILL NOT WORK, +# and you should use a different .gitignore (or none at all) +# This file is for SOURCE projects, where there are many extra +# files that we want to exclude +# +######################### + +##### +# OS X temporary files that should never be committed + +.DS_Store +*.swp +*.lock +profile + + +#### +# Xcode temporary files that should never be committed +# +# NB: NIB/XIB files still exist even on Storyboard projects, so we want this... + +*~.nib + + +#### +# Xcode build files - +# +# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData" + +DerivedData/ + +# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build" + +build/ + +bin/ + +##### +# Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups) +# +# This is complicated: +# +# SOMETIMES you need to put this file in version control. +# Apple designed it poorly - if you use "custom executables", they are +# saved in this file. +# 99% of projects do NOT use those, so they do NOT want to version control this file. +# ..but if you're in the 1%, comment out the line "*.pbxuser" + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 +# NB: also, whitelist the default ones, some projects need to use these +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + + +#### +# Xcode 4 - semi-personal settings +# +# +# OPTION 1: --------------------------------- +# throw away ALL personal settings (including custom schemes! +# - unless they are "shared") +# +# NB: this is exclusive with OPTION 2 below +xcuserdata + +# OPTION 2: --------------------------------- +# get rid of ALL personal settings, but KEEP SOME OF THEM +# - NB: you must manually uncomment the bits you want to keep +# +# NB: this is exclusive with OPTION 1 above +# +#xcuserdata/**/* + +# (requires option 2 above): Personal Schemes +# +#!xcuserdata/**/xcschemes/* + +#### +# XCode 4 workspaces - more detailed +# +# Workspaces are important! They are a core feature of Xcode - don't exclude them :) +# +# Workspace layout is quite spammy. For reference: +# +# /(root)/ +# /(project-name).xcodeproj/ +# project.pbxproj +# /project.xcworkspace/ +# contents.xcworkspacedata +# /xcuserdata/ +# /(your name)/xcuserdatad/ +# UserInterfaceState.xcuserstate +# /xcsshareddata/ +# /xcschemes/ +# (shared scheme name).xcscheme +# /xcuserdata/ +# /(your name)/xcuserdatad/ +# (private scheme).xcscheme +# xcschememanagement.plist +# +# + +#### +# Xcode 4 - Deprecated classes +# +# Allegedly, if you manually "deprecate" your classes, they get moved here. +# +# We're using source-control, so this is a "feature" that we do not want! + +*.moved-aside + + +#### +# UNKNOWN: recommended by others, but I can't discover what these files are +# +# ...none. Everything is now explained. diff --git a/of/waspmote_spacebrew_bridge/Makefile b/of/waspmote_spacebrew_bridge/Makefile new file mode 100644 index 0000000..7a7fe8b --- /dev/null +++ b/of/waspmote_spacebrew_bridge/Makefile @@ -0,0 +1,13 @@ +# Attempt to load a config.make file. +# If none is found, project defaults in config.project.make will be used. +ifneq ($(wildcard config.make),) + include config.make +endif + +# make sure the the OF_ROOT location is defined +ifndef OF_ROOT + OF_ROOT=../../.. +endif + +# call the project makefile! +include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk diff --git a/of/waspmote_spacebrew_bridge/Project.xcconfig b/of/waspmote_spacebrew_bridge/Project.xcconfig new file mode 100644 index 0000000..f4f976c --- /dev/null +++ b/of/waspmote_spacebrew_bridge/Project.xcconfig @@ -0,0 +1,17 @@ +//THE PATH TO THE ROOT OF OUR OF PATH RELATIVE TO THIS PROJECT. +//THIS NEEDS TO BE DEFINED BEFORE CoreOF.xcconfig IS INCLUDED +OF_PATH = ../../../of_v0.8.0_osx_release + +//THIS HAS ALL THE HEADER AND LIBS FOR OF CORE +#include "../../../of_v0.8.0_osx_release/libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig" + +//ICONS - NEW IN 0072 +ICON_NAME_DEBUG = icon-debug.icns +ICON_NAME_RELEASE = icon.icns +ICON_FILE_PATH = $(OF_PATH)/libs/openFrameworksCompiled/project/osx/ + +//IF YOU WANT AN APP TO HAVE A CUSTOM ICON - PUT THEM IN YOUR DATA FOLDER AND CHANGE ICON_FILE_PATH to: +//ICON_FILE_PATH = bin/data/ + +OTHER_LDFLAGS = $(OF_CORE_LIBS) +HEADER_SEARCH_PATHS = $(OF_CORE_HEADERS) diff --git a/of/waspmote_spacebrew_bridge/addons.make b/of/waspmote_spacebrew_bridge/addons.make new file mode 100644 index 0000000..90083e1 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/addons.make @@ -0,0 +1,2 @@ +ofxLibwebsockets +ofxSpacebrew diff --git a/of/waspmote_spacebrew_bridge/config.make b/of/waspmote_spacebrew_bridge/config.make new file mode 100644 index 0000000..df10f64 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/config.make @@ -0,0 +1,142 @@ +################################################################################ +# CONFIGURE PROJECT MAKEFILE (optional) +# This file is where we make project specific configurations. +################################################################################ + +################################################################################ +# OF ROOT +# The location of your root openFrameworks installation +# (default) OF_ROOT = ../../.. +################################################################################ +# OF_ROOT = ../../.. + +################################################################################ +# PROJECT ROOT +# The location of the project - a starting place for searching for files +# (default) PROJECT_ROOT = . (this directory) +# +################################################################################ +# PROJECT_ROOT = . + +################################################################################ +# PROJECT SPECIFIC CHECKS +# This is a project defined section to create internal makefile flags to +# conditionally enable or disable the addition of various features within +# this makefile. For instance, if you want to make changes based on whether +# GTK is installed, one might test that here and create a variable to check. +################################################################################ +# None + +################################################################################ +# PROJECT EXTERNAL SOURCE PATHS +# These are fully qualified paths that are not within the PROJECT_ROOT folder. +# Like source folders in the PROJECT_ROOT, these paths are subject to +# exlclusion via the PROJECT_EXLCUSIONS list. +# +# (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXTERNAL_SOURCE_PATHS = + +################################################################################ +# PROJECT EXCLUSIONS +# These makefiles assume that all folders in your current project directory +# and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations +# to look for source code. The any folders or files that match any of the +# items in the PROJECT_EXCLUSIONS list below will be ignored. +# +# Each item in the PROJECT_EXCLUSIONS list will be treated as a complete +# string unless teh user adds a wildcard (%) operator to match subdirectories. +# GNU make only allows one wildcard for matching. The second wildcard (%) is +# treated literally. +# +# (default) PROJECT_EXCLUSIONS = (blank) +# +# Will automatically exclude the following: +# +# $(PROJECT_ROOT)/bin% +# $(PROJECT_ROOT)/obj% +# $(PROJECT_ROOT)/%.xcodeproj +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXCLUSIONS = + +################################################################################ +# PROJECT LINKER FLAGS +# These flags will be sent to the linker when compiling the executable. +# +# (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ + +# Currently, shared libraries that are needed are copied to the +# $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to +# add a runtime path to search for those shared libraries, since they aren't +# incorporated directly into the final executable application binary. +# TODO: should this be a default setting? +# PROJECT_LDFLAGS=-Wl,-rpath=./libs + +################################################################################ +# PROJECT DEFINES +# Create a space-delimited list of DEFINES. The list will be converted into +# CFLAGS with the "-D" flag later in the makefile. +# +# (default) PROJECT_DEFINES = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_DEFINES = + +################################################################################ +# PROJECT CFLAGS +# This is a list of fully qualified CFLAGS required when compiling for this +# project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS +# defined in your platform specific core configuration files. These flags are +# presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. +# +# (default) PROJECT_CFLAGS = (blank) +# +# Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in +# your platform specific configuration file will be applied by default and +# further flags here may not be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CFLAGS = + +################################################################################ +# PROJECT OPTIMIZATION CFLAGS +# These are lists of CFLAGS that are target-specific. While any flags could +# be conditionally added, they are usually limited to optimization flags. +# These flags are added BEFORE the PROJECT_CFLAGS. +# +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) +# +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) +# +# Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the +# PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration +# file will be applied by default and further optimization flags here may not +# be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE = +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG = + +################################################################################ +# PROJECT COMPILERS +# Custom compilers can be set for CC and CXX +# (default) PROJECT_CXX = (blank) +# (default) PROJECT_CC = (blank) +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CXX = +# PROJECT_CC = diff --git a/of/waspmote_spacebrew_bridge/openFrameworks-Info.plist b/of/waspmote_spacebrew_bridge/openFrameworks-Info.plist new file mode 100644 index 0000000..edb46d2 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/openFrameworks-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.yourcompany.openFrameworks + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CFBundleIconFile + ${ICON} + + diff --git a/of/waspmote_spacebrew_bridge/src/WaspFrameParser.cpp b/of/waspmote_spacebrew_bridge/src/WaspFrameParser.cpp new file mode 100644 index 0000000..ec55514 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/src/WaspFrameParser.cpp @@ -0,0 +1,114 @@ +// +// WaspFrameParser.cpp +// waspmote_gateway_parser +// +// Created by dviid on 11/23/13. +// +// + +#include "WaspFrameParser.h" + +#define FRAME_DELIM "<=>" +#define FRAME_SEP '#' + +#include +#include + +ostream& operator<<(ostream& out, const WaspFrame& wf) +{ + out << "--- WaspFrame ---" << endl; + out << "Serial Id: " << wf.serial_id << endl; + out << "Mote Id: " << wf.mote_id << endl; + out << "Frame Seq.: " << wf.frame_seq << endl; + out << "MAC: " << wf.mac << endl; + out << "ADC: " << wf.adc_data << endl; + out << "BATT: " << wf.battery_level << endl; + out << "-----------------" << endl; + + return out; + +} + +void WaspFrameParser::ASCII_split_frame(string &input, vector &output) +{ + //cout << "PARSE: " << input << endl; + + string d = FRAME_DELIM; + string token; + size_t i, j = 0; + + + // CASE A + if((i = input.find(d)) == std::string::npos) { + input.erase(0, input.length()); + return; + } + + while((j = input.find(d)) != std::string::npos) { + token = input.substr(0, j); + + //cout << "TOKEN: " << token << endl; + + output.push_back(string(token)); + + input.erase(0, j + d.length()); + + //cout << "NEXT: " << input << endl; + } + +} + +void WaspFrameParser::ASCII_token_frame(string &input, vector &output) +{ + //cout << endl << "frame -- " << input << endl; + + stringstream ss(input); + string tok; + while(getline(ss, tok, FRAME_SEP)) + { + output.push_back(tok); + } +} + +void WaspFrameParser::ASCII_process(string &input, vector &output) +{ + vector r; + WaspFrameParser::ASCII_split_frame(input, r); + + for(int i = 0; i < r.size(); i++) { + + vector t; + WaspFrameParser::ASCII_token_frame(r[i], t); + + //cout << "SIZE:::" << t.size() << endl; + + if(t.size() < MIN_FRAME_ENTRIES) continue; // not valid frame + + WaspFrame* wp = new WaspFrame(); + + wp->serial_id = t[1]; + wp->mote_id = t[2]; + wp->frame_seq = atoi(t[3].c_str()); + wp->mac = t[4]; + wp->adc_data = atoi(WaspFrameParser::ASCII_parse("CI0:", t[5]).c_str()); + wp->battery_level = atoi(WaspFrameParser::ASCII_parse("BAT:", t[6]).c_str()); + + //cout << (*wp) << endl; + + output.push_back(*wp); + + } + +} + +string WaspFrameParser::ASCII_parse(string id, string input) +{ + size_t i; + if((i = input.find(id)) != std::string::npos) { + return input.substr(i + id.length(), input.length()); + } + return ""; + +} + + diff --git a/of/waspmote_spacebrew_bridge/src/WaspFrameParser.h b/of/waspmote_spacebrew_bridge/src/WaspFrameParser.h new file mode 100644 index 0000000..c41e890 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/src/WaspFrameParser.h @@ -0,0 +1,50 @@ +// +// WaspFrameParser.h +// waspmote_gateway_parser +// +// Created by dviid on 11/23/13. +// +// + +#ifndef __waspmote_gateway_parser__WaspFrameParser__ +#define __waspmote_gateway_parser__WaspFrameParser__ + +#include +#include +#include + +using namespace std; + +#define MIN_FRAME_ENTRIES 7 + +class WaspFrame { + +public: + + WaspFrame(){;} + + string serial_id; + string mote_id; + int frame_seq; + string mac; + int adc_data; + int battery_level; + + friend ostream& operator<<(ostream& os, const WaspFrame& wf); + +}; + +class WaspFrameParser { + +public: + + static void ASCII_split_frame(string &input, vector &output); + static void ASCII_token_frame(string &input, vector &output); + + static void ASCII_process(string &input, vector &output); + + static string ASCII_parse(string id, string input); + +}; + +#endif /* defined(__waspmote_gateway_parser__WaspFrameParser__) */ diff --git a/of/waspmote_spacebrew_bridge/src/main.cpp b/of/waspmote_spacebrew_bridge/src/main.cpp new file mode 100644 index 0000000..a7d241d --- /dev/null +++ b/of/waspmote_spacebrew_bridge/src/main.cpp @@ -0,0 +1,13 @@ +#include "ofMain.h" +#include "testApp.h" + +//======================================================================== +int main( ){ + ofSetupOpenGL(1024,768,OF_WINDOW); // <-------- setup the GL context + + // this kicks off the running of my app + // can be OF_WINDOW or OF_FULLSCREEN + // pass in width and height too: + ofRunApp(new testApp()); + +} diff --git a/of/waspmote_spacebrew_bridge/src/testApp.cpp b/of/waspmote_spacebrew_bridge/src/testApp.cpp new file mode 100644 index 0000000..a022a95 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/src/testApp.cpp @@ -0,0 +1,105 @@ +#include "testApp.h" + +#include "WaspFrameParser.h" + +#include + +#define wasp_signature "usbserial" +#define wasp_baud 115200 + + +bool testApp::setup_serial() { + + //_serial.enumerateDevices(); + + vector list = _serial.getDeviceList(); + + for(int i = 0; i < list.size(); i++) { + if (list[i].getDeviceName().find(wasp_signature) != std::string::npos) { + _serial.setup(list[i].getDevicePath(), wasp_baud); + return true; + } + } + + return false; +} + +string wp_ascii_split(string input) +{ + +} + +//-------------------------------------------------------------- +void testApp::setup(){ + + _serial_set = setup_serial(); +} + +//-------------------------------------------------------------- +void testApp::update(){ + + static vector r; + r.clear(); + + if(_serial.available() >= BUFFER_LEN) { + _serial.readBytes(_buffer, BUFFER_LEN); + _payload += string(_buffer, _buffer + BUFFER_LEN); + + WaspFrameParser::ASCII_process(_payload, r); + for(int i = 0; i < r.size(); i++) { + ofLog() << r[i] << endl; + } + + } + +} + +//-------------------------------------------------------------- +void testApp::draw(){ + +} + +//-------------------------------------------------------------- +void testApp::keyPressed(int key){ + +} + +//-------------------------------------------------------------- +void testApp::keyReleased(int key){ + +} + +//-------------------------------------------------------------- +void testApp::mouseMoved(int x, int y ){ + +} + +//-------------------------------------------------------------- +void testApp::mouseDragged(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void testApp::mousePressed(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void testApp::mouseReleased(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void testApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void testApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void testApp::dragEvent(ofDragInfo dragInfo){ + +} diff --git a/of/waspmote_spacebrew_bridge/src/testApp.h b/of/waspmote_spacebrew_bridge/src/testApp.h new file mode 100644 index 0000000..5b1f0d5 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/src/testApp.h @@ -0,0 +1,38 @@ +#pragma once + +#include "ofMain.h" +#include "OfSerial.h" + +#define BUFFER_LEN 136 + +class testApp : public ofBaseApp{ + + public: + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y ); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + + bool setup_serial(); + + string wp_ascii_split(string input); + + public: + + ofSerial _serial; + bool _serial_set; + + unsigned char _buffer[BUFFER_LEN]; + string _payload; + + +}; diff --git a/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/project.pbxproj b/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8a690dd --- /dev/null +++ b/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/project.pbxproj @@ -0,0 +1,696 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 38AD44EF5A53275A6BCEB17D /* Client.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C49850835B8C1A87752B848B /* Client.cpp */; }; + 4E0BC6F68981D5538037B4A1 /* Protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C3D119DB77E08C463602F6B /* Protocol.cpp */; }; + 5AF10231860099AC511B768B /* Events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 20F3AB7BE263F7B762023258 /* Events.cpp */; }; + 738C7523616DFE0113B46841 /* Connection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C64F99C0758EC4AA46186D8 /* Connection.cpp */; }; + 76661BF99CD97417EE5B675D /* ofxSpacebrew.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A2DC940594BBC41CB933B8E6 /* ofxSpacebrew.cpp */; }; + B44A2ABF3E925768864FD80A /* Reactor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6520A5947E5A4C4ED7A91553 /* Reactor.cpp */; }; + B5F6FF34184A6F0E0063881D /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5F6FF2F184A6F0E0063881D /* main.cpp */; }; + B5F6FF35184A6F0E0063881D /* testApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5F6FF30184A6F0E0063881D /* testApp.cpp */; }; + B5F6FF36184A6F0E0063881D /* WaspFrameParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5F6FF32184A6F0E0063881D /* WaspFrameParser.cpp */; }; + BBAB23CB13894F3D00AA2426 /* GLUT.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BBAB23BE13894E4700AA2426 /* GLUT.framework */; }; + C5688FC85C0AE0B5E4E5F9CE /* Server.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C53FF33B244987E09C8CC63F /* Server.cpp */; }; + C6E1C4962CC70798B430DCBC /* jsoncpp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9413D837F3E273803A5F776E /* jsoncpp.cpp */; }; + E4328149138ABC9F0047C5CB /* openFrameworksDebug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4328148138ABC890047C5CB /* openFrameworksDebug.a */; }; + E45BE97B0E8CC7DD009D7055 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9710E8CC7DD009D7055 /* AGL.framework */; }; + E45BE97C0E8CC7DD009D7055 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */; }; + E45BE97D0E8CC7DD009D7055 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */; }; + E45BE97E0E8CC7DD009D7055 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9740E8CC7DD009D7055 /* Carbon.framework */; }; + E45BE97F0E8CC7DD009D7055 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */; }; + E45BE9800E8CC7DD009D7055 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */; }; + E45BE9810E8CC7DD009D7055 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9770E8CC7DD009D7055 /* CoreServices.framework */; }; + E45BE9830E8CC7DD009D7055 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE9790E8CC7DD009D7055 /* OpenGL.framework */; }; + E45BE9840E8CC7DD009D7055 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */; }; + E4C2424710CC5A17004149E2 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424410CC5A17004149E2 /* AppKit.framework */; }; + E4C2424810CC5A17004149E2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424510CC5A17004149E2 /* Cocoa.framework */; }; + E4C2424910CC5A17004149E2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4C2424610CC5A17004149E2 /* IOKit.framework */; }; + E4EB6799138ADC1D00A09F29 /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBAB23BE13894E4700AA2426 /* GLUT.framework */; }; + E7E077E515D3B63C0020DFD4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E077E415D3B63C0020DFD4 /* CoreVideo.framework */; }; + E7E077E815D3B6510020DFD4 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E077E715D3B6510020DFD4 /* QTKit.framework */; }; + E7F985F815E0DEA3003869B5 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7F985F515E0DE99003869B5 /* Accelerate.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + E4328147138ABC890047C5CB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = E4B27C1510CBEB8E00536013; + remoteInfo = openFrameworks; + }; + E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = E4B27C1410CBEB8E00536013; + remoteInfo = openFrameworks; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + E4C2427710CC5ABF004149E2 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BBAB23CB13894F3D00AA2426 /* GLUT.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0C3D119DB77E08C463602F6B /* Protocol.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = Protocol.cpp; path = ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/src/Protocol.cpp; sourceTree = SOURCE_ROOT; }; + 0C64F99C0758EC4AA46186D8 /* Connection.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = Connection.cpp; path = ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/src/Connection.cpp; sourceTree = SOURCE_ROOT; }; + 1027C25C1BA06D686A1D8762 /* ofxSpacebrew.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 30; name = ofxSpacebrew.h; path = ../../../of_v0.8.0_osx_release/addons/ofxSpacebrew/src/ofxSpacebrew.h; sourceTree = SOURCE_ROOT; }; + 20F3AB7BE263F7B762023258 /* Events.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = Events.cpp; path = ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/src/Events.cpp; sourceTree = SOURCE_ROOT; }; + 6520A5947E5A4C4ED7A91553 /* Reactor.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = Reactor.cpp; path = ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/src/Reactor.cpp; sourceTree = SOURCE_ROOT; }; + 9413D837F3E273803A5F776E /* jsoncpp.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = jsoncpp.cpp; path = ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/jsoncpp/jsoncpp.cpp; sourceTree = SOURCE_ROOT; }; + A2DC940594BBC41CB933B8E6 /* ofxSpacebrew.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = ofxSpacebrew.cpp; path = ../../../of_v0.8.0_osx_release/addons/ofxSpacebrew/src/ofxSpacebrew.cpp; sourceTree = SOURCE_ROOT; }; + B5F6FF2F184A6F0E0063881D /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + B5F6FF30184A6F0E0063881D /* testApp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = testApp.cpp; sourceTree = ""; }; + B5F6FF31184A6F0E0063881D /* testApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = testApp.h; sourceTree = ""; }; + B5F6FF32184A6F0E0063881D /* WaspFrameParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WaspFrameParser.cpp; sourceTree = ""; }; + B5F6FF33184A6F0E0063881D /* WaspFrameParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WaspFrameParser.h; sourceTree = ""; }; + BBAB23BE13894E4700AA2426 /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = ../../../of_v0.8.0_osx_release/libs/glut/lib/osx/GLUT.framework; sourceTree = ""; }; + C49850835B8C1A87752B848B /* Client.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = Client.cpp; path = ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/src/Client.cpp; sourceTree = SOURCE_ROOT; }; + C53FF33B244987E09C8CC63F /* Server.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 30; name = Server.cpp; path = ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/src/Server.cpp; sourceTree = SOURCE_ROOT; }; + E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = openFrameworksLib.xcodeproj; path = ../../../of_v0.8.0_osx_release/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj; sourceTree = SOURCE_ROOT; }; + E45BE9710E8CC7DD009D7055 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; }; + E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = ""; }; + E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; + E45BE9740E8CC7DD009D7055 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; + E45BE9770E8CC7DD009D7055 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; + E45BE9790E8CC7DD009D7055 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; + E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = ""; }; + E4B69B5B0A3A1756003C02F2 /* waspmote_spacebrew_bridgeDebug.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = waspmote_spacebrew_bridgeDebug.app; sourceTree = BUILT_PRODUCTS_DIR; }; + E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = "openFrameworks-Info.plist"; sourceTree = ""; }; + E4C2424410CC5A17004149E2 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + E4C2424510CC5A17004149E2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + E4C2424610CC5A17004149E2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; + E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = CoreOF.xcconfig; path = ../../../of_v0.8.0_osx_release/libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig; sourceTree = SOURCE_ROOT; }; + E4EB6923138AFD0F00A09F29 /* Project.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Project.xcconfig; sourceTree = ""; }; + E7E077E415D3B63C0020DFD4 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = /System/Library/Frameworks/CoreVideo.framework; sourceTree = ""; }; + E7E077E715D3B6510020DFD4 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = /System/Library/Frameworks/QTKit.framework; sourceTree = ""; }; + E7F985F515E0DE99003869B5 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = /System/Library/Frameworks/Accelerate.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + E4B69B590A3A1756003C02F2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E7F985F815E0DEA3003869B5 /* Accelerate.framework in Frameworks */, + E7E077E815D3B6510020DFD4 /* QTKit.framework in Frameworks */, + E4EB6799138ADC1D00A09F29 /* GLUT.framework in Frameworks */, + E4328149138ABC9F0047C5CB /* openFrameworksDebug.a in Frameworks */, + E45BE97B0E8CC7DD009D7055 /* AGL.framework in Frameworks */, + E45BE97C0E8CC7DD009D7055 /* ApplicationServices.framework in Frameworks */, + E45BE97D0E8CC7DD009D7055 /* AudioToolbox.framework in Frameworks */, + E45BE97E0E8CC7DD009D7055 /* Carbon.framework in Frameworks */, + E45BE97F0E8CC7DD009D7055 /* CoreAudio.framework in Frameworks */, + E45BE9800E8CC7DD009D7055 /* CoreFoundation.framework in Frameworks */, + E45BE9810E8CC7DD009D7055 /* CoreServices.framework in Frameworks */, + E45BE9830E8CC7DD009D7055 /* OpenGL.framework in Frameworks */, + E45BE9840E8CC7DD009D7055 /* QuickTime.framework in Frameworks */, + E4C2424710CC5A17004149E2 /* AppKit.framework in Frameworks */, + E4C2424810CC5A17004149E2 /* Cocoa.framework in Frameworks */, + E4C2424910CC5A17004149E2 /* IOKit.framework in Frameworks */, + E7E077E515D3B63C0020DFD4 /* CoreVideo.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 213FDE476BBC2B9B0347CC2F /* src */ = { + isa = PBXGroup; + children = ( + C53FF33B244987E09C8CC63F /* Server.cpp */, + 6520A5947E5A4C4ED7A91553 /* Reactor.cpp */, + 0C3D119DB77E08C463602F6B /* Protocol.cpp */, + 20F3AB7BE263F7B762023258 /* Events.cpp */, + 0C64F99C0758EC4AA46186D8 /* Connection.cpp */, + C49850835B8C1A87752B848B /* Client.cpp */, + ); + name = src; + sourceTree = ""; + }; + 5AC16A8D6EC87B59A03906C1 /* jsoncpp */ = { + isa = PBXGroup; + children = ( + 9413D837F3E273803A5F776E /* jsoncpp.cpp */, + ); + name = jsoncpp; + sourceTree = ""; + }; + 70911A54686309FC932B3014 /* libs */ = { + isa = PBXGroup; + children = ( + 5AC16A8D6EC87B59A03906C1 /* jsoncpp */, + AB97697EC6F10E7234EFF261 /* ofxLibwebsockets */, + ); + name = libs; + sourceTree = ""; + }; + 961F0189D3FC79A9A11F56E1 /* ofxSpacebrew */ = { + isa = PBXGroup; + children = ( + D6F68A2D0DCDC44496E81840 /* src */, + ); + name = ofxSpacebrew; + sourceTree = ""; + }; + AAE50E341C7382A4EF10AF5A /* ofxLibwebsockets */ = { + isa = PBXGroup; + children = ( + 70911A54686309FC932B3014 /* libs */, + ); + name = ofxLibwebsockets; + sourceTree = ""; + }; + AB97697EC6F10E7234EFF261 /* ofxLibwebsockets */ = { + isa = PBXGroup; + children = ( + 213FDE476BBC2B9B0347CC2F /* src */, + ); + name = ofxLibwebsockets; + sourceTree = ""; + }; + BB4B014C10F69532006C3DED /* addons */ = { + isa = PBXGroup; + children = ( + AAE50E341C7382A4EF10AF5A /* ofxLibwebsockets */, + 961F0189D3FC79A9A11F56E1 /* ofxSpacebrew */, + ); + name = addons; + sourceTree = ""; + }; + BBAB23C913894ECA00AA2426 /* system frameworks */ = { + isa = PBXGroup; + children = ( + E7F985F515E0DE99003869B5 /* Accelerate.framework */, + E4C2424410CC5A17004149E2 /* AppKit.framework */, + E4C2424510CC5A17004149E2 /* Cocoa.framework */, + E4C2424610CC5A17004149E2 /* IOKit.framework */, + E45BE9710E8CC7DD009D7055 /* AGL.framework */, + E45BE9720E8CC7DD009D7055 /* ApplicationServices.framework */, + E45BE9730E8CC7DD009D7055 /* AudioToolbox.framework */, + E45BE9740E8CC7DD009D7055 /* Carbon.framework */, + E45BE9750E8CC7DD009D7055 /* CoreAudio.framework */, + E45BE9760E8CC7DD009D7055 /* CoreFoundation.framework */, + E45BE9770E8CC7DD009D7055 /* CoreServices.framework */, + E45BE9790E8CC7DD009D7055 /* OpenGL.framework */, + E45BE97A0E8CC7DD009D7055 /* QuickTime.framework */, + E7E077E415D3B63C0020DFD4 /* CoreVideo.framework */, + E7E077E715D3B6510020DFD4 /* QTKit.framework */, + ); + name = "system frameworks"; + sourceTree = ""; + }; + BBAB23CA13894EDB00AA2426 /* 3rd party frameworks */ = { + isa = PBXGroup; + children = ( + BBAB23BE13894E4700AA2426 /* GLUT.framework */, + ); + name = "3rd party frameworks"; + sourceTree = ""; + }; + D6F68A2D0DCDC44496E81840 /* src */ = { + isa = PBXGroup; + children = ( + A2DC940594BBC41CB933B8E6 /* ofxSpacebrew.cpp */, + 1027C25C1BA06D686A1D8762 /* ofxSpacebrew.h */, + ); + name = src; + sourceTree = ""; + }; + E4328144138ABC890047C5CB /* Products */ = { + isa = PBXGroup; + children = ( + E4328148138ABC890047C5CB /* openFrameworksDebug.a */, + ); + name = Products; + sourceTree = ""; + }; + E45BE5980E8CC70C009D7055 /* frameworks */ = { + isa = PBXGroup; + children = ( + BBAB23CA13894EDB00AA2426 /* 3rd party frameworks */, + BBAB23C913894ECA00AA2426 /* system frameworks */, + ); + name = frameworks; + sourceTree = ""; + }; + E4B69B4A0A3A1720003C02F2 = { + isa = PBXGroup; + children = ( + E4B6FCAD0C3E899E008CF71C /* openFrameworks-Info.plist */, + E4EB6923138AFD0F00A09F29 /* Project.xcconfig */, + E4B69E1C0A3A1BDC003C02F2 /* src */, + E4EEC9E9138DF44700A80321 /* openFrameworks */, + BB4B014C10F69532006C3DED /* addons */, + E45BE5980E8CC70C009D7055 /* frameworks */, + E4B69B5B0A3A1756003C02F2 /* waspmote_spacebrew_bridgeDebug.app */, + ); + sourceTree = ""; + }; + E4B69E1C0A3A1BDC003C02F2 /* src */ = { + isa = PBXGroup; + children = ( + B5F6FF2F184A6F0E0063881D /* main.cpp */, + B5F6FF30184A6F0E0063881D /* testApp.cpp */, + B5F6FF31184A6F0E0063881D /* testApp.h */, + B5F6FF32184A6F0E0063881D /* WaspFrameParser.cpp */, + B5F6FF33184A6F0E0063881D /* WaspFrameParser.h */, + ); + path = src; + sourceTree = SOURCE_ROOT; + }; + E4EEC9E9138DF44700A80321 /* openFrameworks */ = { + isa = PBXGroup; + children = ( + E4EB691F138AFCF100A09F29 /* CoreOF.xcconfig */, + E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */, + ); + name = openFrameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E4B69B5A0A3A1756003C02F2 /* waspmote_spacebrew_bridge */ = { + isa = PBXNativeTarget; + buildConfigurationList = E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "waspmote_spacebrew_bridge" */; + buildPhases = ( + E4B69B580A3A1756003C02F2 /* Sources */, + E4B69B590A3A1756003C02F2 /* Frameworks */, + E4B6FFFD0C3F9AB9008CF71C /* ShellScript */, + E4C2427710CC5ABF004149E2 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + E4EEB9AC138B136A00A80321 /* PBXTargetDependency */, + ); + name = waspmote_spacebrew_bridge; + productName = myOFApp; + productReference = E4B69B5B0A3A1756003C02F2 /* waspmote_spacebrew_bridgeDebug.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + E4B69B4C0A3A1720003C02F2 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0460; + }; + buildConfigurationList = E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "waspmote_spacebrew_bridge" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = E4B69B4A0A3A1720003C02F2; + productRefGroup = E4B69B4A0A3A1720003C02F2; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = E4328144138ABC890047C5CB /* Products */; + ProjectRef = E4328143138ABC890047C5CB /* openFrameworksLib.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + E4B69B5A0A3A1756003C02F2 /* waspmote_spacebrew_bridge */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + E4328148138ABC890047C5CB /* openFrameworksDebug.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = openFrameworksDebug.a; + remoteRef = E4328147138ABC890047C5CB /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXShellScriptBuildPhase section */ + E4B6FFFD0C3F9AB9008CF71C /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cp -f ../../../of_v0.8.0_osx_release/libs/fmodex/lib/osx/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/libfmodex.dylib\"; install_name_tool -change ./libfmodex.dylib @executable_path/libfmodex.dylib \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME\";\nmkdir -p \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/\"\ncp -f \"$ICON_FILE\" \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + E4B69B580A3A1756003C02F2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C6E1C4962CC70798B430DCBC /* jsoncpp.cpp in Sources */, + C5688FC85C0AE0B5E4E5F9CE /* Server.cpp in Sources */, + B44A2ABF3E925768864FD80A /* Reactor.cpp in Sources */, + 4E0BC6F68981D5538037B4A1 /* Protocol.cpp in Sources */, + 5AF10231860099AC511B768B /* Events.cpp in Sources */, + 738C7523616DFE0113B46841 /* Connection.cpp in Sources */, + 38AD44EF5A53275A6BCEB17D /* Client.cpp in Sources */, + 76661BF99CD97417EE5B675D /* ofxSpacebrew.cpp in Sources */, + B5F6FF34184A6F0E0063881D /* main.cpp in Sources */, + B5F6FF35184A6F0E0063881D /* testApp.cpp in Sources */, + B5F6FF36184A6F0E0063881D /* WaspFrameParser.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + E4EEB9AC138B136A00A80321 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = openFrameworks; + targetProxy = E4EEB9AB138B136A00A80321 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + E4B69B4E0A3A1720003C02F2 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; + buildSettings = { + ARCHS = "$(NATIVE_ARCH)"; + CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + GCC_AUTO_VECTORIZATION = YES; + GCC_ENABLE_SSE3_EXTENSIONS = YES; + GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; + GCC_INLINES_ARE_PRIVATE_EXTERN = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; + GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; + GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; + GCC_WARN_UNINITIALIZED_AUTOS = NO; + GCC_WARN_UNUSED_VALUE = NO; + GCC_WARN_UNUSED_VARIABLE = NO; + HEADER_SEARCH_PATHS = ( + "$(OF_CORE_HEADERS)", + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/jsoncpp, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/jsoncpp/json, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/libwebsockets/include/, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/openssl/openssl, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/include, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/include/ofxLibwebsockets, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/src, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/src, + ../../../of_v0.8.0_osx_release/addons/ofxSpacebrew/libs, + ../../../of_v0.8.0_osx_release/addons/ofxSpacebrew/src, + ); + MACOSX_DEPLOYMENT_TARGET = 10.6; + OTHER_CPLUSPLUSFLAGS = ( + "-D__MACOSX_CORE__", + "-lpthread", + "-mtune=native", + ); + OTHER_LDFLAGS = ( + "$(OF_CORE_LIBS)", + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/libwebsockets/lib/osx/libwebsockets.a, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/openssl/lib/osx/libcrypto.a, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/openssl/lib/osx/libssl.a, + ); + SDKROOT = macosx; + }; + name = Debug; + }; + E4B69B4F0A3A1720003C02F2 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E4EB6923138AFD0F00A09F29 /* Project.xcconfig */; + buildSettings = { + ARCHS = "$(NATIVE_ARCH)"; + CONFIGURATION_BUILD_DIR = "$(SRCROOT)/bin/"; + COPY_PHASE_STRIP = YES; + DEAD_CODE_STRIPPING = YES; + GCC_AUTO_VECTORIZATION = YES; + GCC_ENABLE_SSE3_EXTENSIONS = YES; + GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; + GCC_INLINES_ARE_PRIVATE_EXTERN = NO; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_UNROLL_LOOPS = YES; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; + GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO; + GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; + GCC_WARN_UNINITIALIZED_AUTOS = NO; + GCC_WARN_UNUSED_VALUE = NO; + GCC_WARN_UNUSED_VARIABLE = NO; + HEADER_SEARCH_PATHS = ( + "$(OF_CORE_HEADERS)", + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/jsoncpp, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/jsoncpp/json, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/libwebsockets/include/, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/openssl/openssl, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/include, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/include/ofxLibwebsockets, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/ofxLibwebsockets/src, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/src, + ../../../of_v0.8.0_osx_release/addons/ofxSpacebrew/libs, + ../../../of_v0.8.0_osx_release/addons/ofxSpacebrew/src, + ); + MACOSX_DEPLOYMENT_TARGET = 10.6; + OTHER_CPLUSPLUSFLAGS = ( + "-D__MACOSX_CORE__", + "-lpthread", + "-mtune=native", + ); + OTHER_LDFLAGS = ( + "$(OF_CORE_LIBS)", + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/libwebsockets/lib/osx/libwebsockets.a, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/openssl/lib/osx/libcrypto.a, + ../../../of_v0.8.0_osx_release/addons/ofxLibwebsockets/libs/openssl/lib/osx/libssl.a, + ); + SDKROOT = macosx; + }; + name = Release; + }; + E4B69B600A3A1757003C02F2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", + ); + FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../of_v0.8.0_osx_release/libs/glut/lib/osx\""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_MODEL_TUNING = NONE; + ICON = "$(ICON_NAME_DEBUG)"; + ICON_FILE = "$(ICON_FILE_PATH)$(ICON)"; + INFOPLIST_FILE = "openFrameworks-Info.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_52)", + ); + PRODUCT_NAME = "$(TARGET_NAME)Debug"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + E4B69B610A3A1757003C02F2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", + ); + FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../../of_v0.8.0_osx_release/libs/glut/lib/osx\""; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_MODEL_TUNING = NONE; + ICON = "$(ICON_NAME_RELEASE)"; + ICON_FILE = "$(ICON_FILE_PATH)$(ICON)"; + INFOPLIST_FILE = "openFrameworks-Info.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_1)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + E4B69B4D0A3A1720003C02F2 /* Build configuration list for PBXProject "waspmote_spacebrew_bridge" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E4B69B4E0A3A1720003C02F2 /* Debug */, + E4B69B4F0A3A1720003C02F2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E4B69B5F0A3A1757003C02F2 /* Build configuration list for PBXNativeTarget "waspmote_spacebrew_bridge" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E4B69B600A3A1757003C02F2 /* Debug */, + E4B69B610A3A1757003C02F2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = E4B69B4C0A3A1720003C02F2 /* Project object */; +} diff --git a/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6413ce0 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/xcshareddata/xcschemes/waspmote_spacebrew_bridge Debug.xcscheme b/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/xcshareddata/xcschemes/waspmote_spacebrew_bridge Debug.xcscheme new file mode 100644 index 0000000..7b9b002 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/xcshareddata/xcschemes/waspmote_spacebrew_bridge Debug.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/xcshareddata/xcschemes/waspmote_spacebrew_bridge Release.xcscheme b/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/xcshareddata/xcschemes/waspmote_spacebrew_bridge Release.xcscheme new file mode 100644 index 0000000..95df069 --- /dev/null +++ b/of/waspmote_spacebrew_bridge/waspmote_spacebrew_bridge.xcodeproj/xcshareddata/xcschemes/waspmote_spacebrew_bridge Release.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/waspmote/README.MD b/waspmote/README.MD new file mode 100644 index 0000000..e69de29 diff --git a/waspmote/applications/DEVELOPMENT/simple_broadcast/simple_broadcast.pde b/waspmote/applications/DEVELOPMENT/simple_broadcast/simple_broadcast.pde new file mode 100644 index 0000000..0404e2c --- /dev/null +++ b/waspmote/applications/DEVELOPMENT/simple_broadcast/simple_broadcast.pde @@ -0,0 +1,123 @@ + +#include +#include // CRITICAL INFRASTRUCTURE Frames defined in WaspFrame.h -- github --- XXXX + +/* +CRITICAL INFRASTRUCTURE {values}: +SENSOR_CI0 +SENSOR_CI1 +SENSOR_CI2 +SENSOR_CI3 +SENSOR_CI4 +*/ + +#define SENSOR_PIN ANALOG1 // PIN for the ADC reading + +// declare ADC reading variable +int delay_reading = 500; +int reading = 0; + + +// declare packet +packetXBee* packet; + +// mac address of this mote +char macHigh[10]; +char macLow[11]; + + +void setup() { + + // blink + Utils.setLED(LED0, LED_ON); + Utils.setLED(LED1, LED_ON); + delay(2000); + Utils.setLED(LED0, LED_OFF); + Utils.setLED(LED1, LED_OFF); + + // setup radio + MAC + xbee802.ON(); + delay(1000); + xbee802.flush(); + + // Get the XBee MAC address + int counter = 0; + while((xbee802.getOwnMac()!=0) && (counter<12)) + { + xbee802.getOwnMac(); + counter++; + } + + // convert mac address from array to string + Utils.hex2str(xbee802.sourceMacHigh, macHigh, 4); + Utils.hex2str(xbee802.sourceMacLow, macLow, 4); + + // DEBUG: print MAC to console + USB.ON(); + USB.print("mac address:"); + USB.print(macHigh); + USB.println(macLow); + USB.OFF(); + + //B.0 set mote id (16-Byte max) + //frame.setID("CRITICAL-0"); + +} + + +void loop() { + +// A. ADC READING + + //A.1 PWR ON SENSOR + PWR.setSensorPower(SENS_3V3,SENS_ON); + Utils.setLED(LED1, LED_ON); + + //A.2 READ VALUE + reading = analogRead(SENSOR_PIN); + + //A.3 PWR OFF SENSOR + PWR.setSensorPower(SENS_3V3,SENS_OFF); + +// B. BROADCAST PACKET + + //B.1 create ASCII frame + frame.createFrame(ASCII,"CRITICAL-0"); + + //B.1.1 add CRITICAL INFRASTRUCTURE sensor descriptors + frame.addSensor(SENSOR_MAC, macLow); // MAC + frame.addSensor(SENSOR_CI0, reading); // CI0 <------------------------- IMPORTANT! (see nomenclature in the header of this file) + frame.addSensor(SENSOR_BAT, PWR.getBatteryLevel()); // Battery level + + //DEBUG: print frame to console + frame.showFrame(); + + //B.2 create packet + packet=(packetXBee*) calloc(1,sizeof(packetXBee)); // memory allocation + packet->mode=BROADCAST; // set Broadcast mode + + //B.3 send packet + // radio ON + xbee802.ON(); + // sets Destination parameters [000000000000FFFF -> Broadcast] + xbee802.setDestinationParams(packet, "000000000000FFFF", frame.buffer, frame.length); + // send + xbee802.sendXBee(packet); + + //B.4 check status (DEBUG) + if(xbee802.error_TX == 0) { + USB.println(F("TX OK")); + } else { + USB.println(F("TX ERROR")); + } + + //B.5 free memory + free(packet); + packet = NULL; + +//C. Delay + + delay(1000); + +} + diff --git a/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger/surveyance_logger.pde b/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger/surveyance_logger.pde new file mode 100644 index 0000000..1c5172f --- /dev/null +++ b/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger/surveyance_logger.pde @@ -0,0 +1,58 @@ +#define SENSOR_PIN ANALOG1 + +int delay_reading = 500; +int reading = 0; +char reading_buff[20]; + +// define folder and file to store data +char* logfile="log.csv"; + + +void setup() { + + USB.ON(); + + SD.ON(); + //SD.mkdir(path); + + // delete file + if(SD.del(logfile)) { + USB.println(F("file deleted")); + } else { + USB.println(F("file NOT deleted")); + } + + // create file + if(SD.create(logfile)) { + USB.println(F("file created")); + } else { + USB.println(F("file NOT created")); + } + + +} + + +void loop() { + + //PWR ON SENSOR + PWR.setSensorPower(SENS_3V3,SENS_ON); + Utils.setLED(LED1, LED_ON); + + //READ VALUE + reading = analogRead(SENSOR_PIN); + delay(delay_reading / 2); + + //PWR OFF SENSOR + Utils.setLED(LED1, LED_OFF); + PWR.setSensorPower(SENS_3V3,SENS_OFF); + + //WRITE DATA TO FILE (may need some convertion here...) + Utils.long2array(reading, reading_buff); + SD.appendln(logfile, reading_buff); + + USB.println(reading_buff); + + delay(delay_reading / 2); +} + diff --git a/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger_5VADC/surveyance_logger_5VADC.pde b/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger_5VADC/surveyance_logger_5VADC.pde new file mode 100644 index 0000000..ebb1936 --- /dev/null +++ b/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger_5VADC/surveyance_logger_5VADC.pde @@ -0,0 +1,58 @@ +#include + +int delay_reading = 500; + +char reading_buff[20]; + +// define folder and file to store data +char* logfile="log.csv"; + +void setup() { + + USB.ON(); + + SD.ON(); + + // delete file + if(SD.del(logfile)) { + USB.println(F("file deleted")); + } else { + USB.println(F("file NOT deleted")); + } + + // create file + if(SD.create(logfile)) { + USB.println(F("file created")); + } else { + USB.println(F("file NOT created")); + } + + delay(100); + + // Sensor board + SensorProtov20.ON(); + // RTC + RTC.ON(); + +} + + +void loop() { + + Utils.setLED(LED1, LED_ON); + + float adc = SensorProtov20.readADC(); + + Utils.float2String(adc, reading_buff, 6); + + delay(delay_reading / 2); + + Utils.setLED(LED1, LED_OFF); + + SD.appendln(logfile, reading_buff); + + USB.println(reading_buff); + + delay(delay_reading / 2); +} + diff --git a/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger_accelerometer/surveyance_logger_accelerometer.pde b/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger_accelerometer/surveyance_logger_accelerometer.pde new file mode 100644 index 0000000..7d52bb2 --- /dev/null +++ b/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger_accelerometer/surveyance_logger_accelerometer.pde @@ -0,0 +1,53 @@ +#define SENSOR_PIN ANALOG2 + +int delay_reading = 100; +char reading_buff[20]; + +// define folder and file to store data +char* logfile="log.csv"; + + +void setup() { + + USB.ON(); + + SD.ON(); + + // delete file + if(SD.del(logfile)) { + USB.println(F("file deleted")); + } else { + USB.println(F("file NOT deleted")); + } + + // create file + if(SD.create(logfile)) { + USB.println(F("file created")); + } else { + USB.println(F("file NOT created")); + } + + // accelerometer + ACC.ON(); + +} + + +void loop() { + + Utils.setLED(LED1, LED_ON); + + sprintf(reading_buff, "%d,%d,%d", ACC.getX(), ACC.getY(), ACC.getZ()); + + delay(delay_reading / 2); + + //PWR OFF SENSOR + Utils.setLED(LED1, LED_OFF); + + SD.appendln(logfile, reading_buff); + + USB.println(reading_buff); + + delay(delay_reading / 2); +} + diff --git a/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger_temp/surveyance_logger_temp.pde b/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger_temp/surveyance_logger_temp.pde new file mode 100644 index 0000000..e0b90b0 --- /dev/null +++ b/waspmote/applications/WORKSHOPS/SURVEYANCE/surveyance_logger_temp/surveyance_logger_temp.pde @@ -0,0 +1,55 @@ +#define SENSOR_PIN ANALOG2 + +int delay_reading = 100; +char reading_buff[20]; + +// define folder and file to store data +char* logfile="log.csv"; + + +void setup() { + + USB.ON(); + + SD.ON(); + + // delete file + if(SD.del(logfile)) { + USB.println(F("file deleted")); + } else { + USB.println(F("file NOT deleted")); + } + + // create file + if(SD.create(logfile)) { + USB.println(F("file created")); + } else { + USB.println(F("file NOT created")); + } + + // RTC + RTC.ON(); + +} + + +void loop() { + + Utils.setLED(LED1, LED_ON); + + float temp = RTC.getTemperature(); + + Utils.float2String(temp, reading_buff, 3); + + delay(delay_reading / 2); + + //PWR OFF SENSOR + Utils.setLED(LED1, LED_OFF); + + SD.appendln(logfile, reading_buff); + + USB.println(reading_buff); + + delay(delay_reading / 2); +} + diff --git a/waspmote/docs/data_frame_guide.pdf b/waspmote/docs/data_frame_guide.pdf new file mode 100644 index 0000000..e4d792d Binary files /dev/null and b/waspmote/docs/data_frame_guide.pdf differ diff --git a/waspmote/libraries/Frame/WaspFrame.cpp b/waspmote/libraries/Frame/WaspFrame.cpp new file mode 100755 index 0000000..61c6a66 --- /dev/null +++ b/waspmote/libraries/Frame/WaspFrame.cpp @@ -0,0 +1,1765 @@ +/* + * Copyright (C) 2012 Libelium Comunicaciones Distribuidas S.L. + * http://www.libelium.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Version: 1.0 + * Design: David Gascón + * Implementation: Yuri Carmona, Javier Siscart, Joaquín Ruiz + */ + + +#ifndef __WPROGRAM_H__ + #include +#endif + +#include "WaspFrame.h" +#include "WaspFrameConstants.h" + + + + +/// Constructors /////////////////////////////////////////////////////////////// + +WaspFrame::WaspFrame() +{ + // store number zero to EEPROM in roder to start + // with this first frame sequence number + storeSequence(0); + + // set default maximum frame size. It might be changed using 'setFrameSize' + // function when using an XBee module + _maxSize=MAX_FRAME; +} + + + +/// Public Methods ///////////////////////////////////////////////////////////// + + +/* + * setFrameSize( size ) - set maximum frame size + * + * This function sets the class attribute to the parameter given to this + * function always it doesn't exceed the constant predefined in WaspFrame.h + * called MAX_FRAME + * + */ +void WaspFrame::setFrameSize( uint8_t size ) +{ + if( size < MAX_FRAME) + { + // set new maximum size + _maxSize=size; + } + else + { + // input parameter exceeds the predefined constant + _maxSize=MAX_FRAME; + } + + + + +} + + +/* + * setFrameSize( protocol, linkEncryption, AESEncryption) + * + * This function MUST only be used when using an XBee module. This is the unique + * module which has size restrictions depending on the protocol, addressing, link + * encryption and AES encryption use. + * + * The possible values for protocol are: + * XBEE_802_15_4 + * ZIGBEE + * DIGIMESH + * XBEE_900 + * XBEE_868 + * + * The possible values for linkEncryption are: + * ENABLED = 1 + * DISABLED = 0 + * + * The possible values for AESEncryption are: + * ENABLED = 1 + * DISABLED = 0 + * + */ +void WaspFrame::setFrameSize( uint8_t protocol, + uint8_t linkEncryption, + uint8_t AESEncryption) +{ + // call function prototype using a 64-bit addressing (the unique unicast + // possible for all XBee modules but the XBee-802.15.4) + return setFrameSize( protocol, UNICAST_64B, linkEncryption, AESEncryption); +} + +/* + * setFrameSize( protocol, addressing, linkEncryption, AESEncryption) + * + * This function MUST only be used when using an XBee module. This is the unique + * module which has size restrictions depending on the protocol, addressing, link + * encryption and AES encryption use. + * + * The possible values for protocol are: + * XBEE_802_15_4 + * ZIGBEE + * DIGIMESH + * XBEE_900 + * XBEE_868 + * + * The possible values for addressgin are: + * UNICAST_16B ---> for Unicast 16-bit addressing (only for XBee-802.15.4) + * UNICAST_64B ---> for Unicast 64-bit addressing + * BROADCAST_MODE ---> for Broadcast addressing + * + * The possible values for linkEncryption are: + * ENABLED = 1 + * DISABLED = 0 + * + * The possible values for AESEncryption are: + * ENABLED = 1 + * DISABLED = 0 + * + */ +void WaspFrame::setFrameSize( uint8_t protocol, + uint8_t addressing, + uint8_t linkEncryption, + uint8_t AESEncryption) +{ + switch (AESEncryption) + { + case DISABLED: /// AES disabled ////////////////////////////////////////////// + + switch (protocol) + { + /// XBEE_802_15_4 //////////////// + case XBEE_802_15_4: + + if( linkEncryption == DISABLED) + { + _maxSize = 100; + } + else if( linkEncryption == ENABLED) + { + if( addressing == UNICAST_16B ) + { + _maxSize = 98; + } + else if( addressing == UNICAST_64B ) + { + _maxSize = 94; + } + else if( addressing == BROADCAST_MODE ) + { + _maxSize = 95; + } + } + break; + + /// ZIGBEE ///////////////////// + case ZIGBEE: + + if( linkEncryption == DISABLED) + { + if( addressing == UNICAST_64B ) + { + _maxSize = 74; + } + else if( addressing == BROADCAST_MODE ) + { + _maxSize = 92; + } + } + else if( linkEncryption == ENABLED) + { + if( addressing == UNICAST_64B ) + { + _maxSize = 66; + } + else if( addressing == BROADCAST_MODE ) + { + _maxSize = 84; + } + } + break; + + /// DIGIMESH ///////////////////// + case DIGIMESH: + + _maxSize = 73; + break; + + /// XBEE_900 ///////////////////// + case XBEE_900: + + if( linkEncryption == DISABLED) + { + _maxSize = 100; + } + else if( linkEncryption == ENABLED) + { + _maxSize = 80; + } + + break; + + /// XBEE_868 ///////////////////// + case XBEE_868: + + _maxSize = 100; + break; + + default : + // No limit + _maxSize=MAX_FRAME; + break; + } + break; + + case ENABLED: /// AES enabled ////////////////////////////////////////////// + + switch (protocol) + { + /// XBEE_802_15_4 //////////////// + case XBEE_802_15_4: + + if( linkEncryption == DISABLED) + { + _maxSize = 93; + } + else if( linkEncryption == ENABLED) + { + if( addressing == UNICAST_16B ) + { + _maxSize = 93; + } + else if( (addressing == UNICAST_64B) || + (addressing == BROADCAST_MODE ) ) + { + _maxSize = 77; + } + } + break; + + /// ZIGBEE ///////////////////// + case ZIGBEE: + + if( addressing == UNICAST_64B ) + { + _maxSize = 61; + } + else if( addressing == BROADCAST_MODE ) + { + _maxSize = 77; + } + + break; + + /// DIGIMESH ///////////////////// + case DIGIMESH: + + _maxSize = 61; + break; + + /// XBEE_900 ///////////////////// + case XBEE_900: + + if( linkEncryption == DISABLED) + { + _maxSize = 93; + } + else if( linkEncryption == ENABLED) + { + _maxSize = 77; + } + + break; + + /// XBEE_868 ///////////////////// + case XBEE_868: + + _maxSize = 93; + break; + + default : + // No limit + _maxSize=MAX_FRAME; + break; + } + + break; + + default: // No limit + _maxSize=MAX_FRAME; + + } + +} + + + + +/* + * getFrameSize( ) - returns the maximum frame size previously set + * + * + */ +uint8_t WaspFrame::getFrameSize( void ) +{ + return _maxSize; +} + + + +/* + * createFrame (void) - Initialize frame buffer + * + * Also, frame header bytes are initiliazed with deafult values + * + */ +void WaspFrame::createFrame(void) +{ + // variable + char MID[17]; + + // get mote Identifier from EEPROM + getID(MID); + + // create default frame: ASCII mode, + createFrame(ASCII, MID); + +} + + + +/* + * createFrame () - Initialize frame buffer + * + * Also, frame header bytes are initiliazed with default values + * + */ +void WaspFrame::createFrame(uint8_t mode, const char* moteID) +{ + // local variables + uint8_t sequence; + + // store mode: ASCII or BINARY + _mode=mode; + + // init buffer + for( int i=0; i < MAX_DATA ; i++ ) + { + buffer[i]='\0'; + } + + // init counter + numFields = 0; + + // set frame delimiter + buffer[0] = '<'; + buffer[1] = '='; + buffer[2] = '>'; + + uint8_t type; + + // set type of frame depending on the frame mode + if( _mode == ASCII ) + { + /** ASCII FRAME **/ + type=B10000000; + buffer[3]= type; + + //! Queda tipo trama especial !// + + // set a "don't care" character in number of fields byte + buffer[4]='?'; + + // set the '#' separator + buffer[5]='#'; + + // set serial ID + length=6; + char str[16]; + + // _serial_id is read in main.cxx + sprintf(str,"%lu",_serial_id); + + for( int i=0 ; i> 8) &0xFF; */ + + //Check again (1 byte or 2 bytes) + uint8_t config; + config =(uint8_t)pgm_read_word(&(SENSOR_TYPE_TABLE[type])); + + if (config == TYPE_INT) + { + // check if new sensor value fits + if(!checkLength(3)) + { + return -1; + } + + // concatenate sensor name to frame string + buffer[length-3] = (char)type; + buffer[length-2] = val[0]; + buffer[length-1] = val[1]; + buffer[length] = '\0'; + } + else + { + // check if new sensor value fits + if(!checkLength(2)) + { + return -1; + } + + // concatenate sensor name to frame string + buffer[length-2] = (char)type; + buffer[length-1] = val[0]; + buffer[length] = '\0'; + } + + // increment sensor fields counter + numFields++; + // set sensor fields counter + buffer[4]=numFields; + + } + + return length; +} + + + +/* + * addSensor (type, value) - add sensor value to frame + * + * Parameters: + * type : Refers to the type of sensor data + * value : indicates the sensor value as an unsigned long + * + * Returns: + * 'length' of the composed frame when ok + * -1 when the maximum length of the frame is reached + * + */ +int8_t WaspFrame::addSensor(uint8_t type, unsigned long value) +{ + char str[20]; + + if(_mode == ASCII) + { + // get name of sensor from table + char name[10]; + strcpy_P(name, (char*)pgm_read_word(&(SENSOR_TABLE[type]))); + + // convert from integer to string + itoa( value, str, 10); + + + // check if new sensor value fits in the frame or not + // in the case the maximum length is reached, exit with error + // if not, then add the new sensor length to the total length + if(!checkLength( strlen(name) + + strlen(str) + + strlen(":") + + strlen("#") )) + { + return -1; + } + + // concatenate sensor name to frame string + strncat((char*)buffer, name, strlen(name)); + strcat((char*)buffer, ":"); + + // concatenate sensor value to frame string + strncat((char*)buffer, str, strlen(str)); + strcat((char*)buffer, "#\0"); + + // increment sensor fields counter + numFields++; + + // set sensor fields counter + buffer[4]=numFields; + } + else + { + // check if the data input type corresponds to the sensor + if(checkFields(type, TYPE_ULONG, 1) == -1 ) return -1; + + // set data bytes (in this case, double is 4...) + char val[4]; + memcpy(val,&value,4); + + /* Check correct copy + union { + unsigned long f; + char b[4]; + } u; + u.b[3] = val[3]; + u.b[2] = val[2]; + u.b[1] = val[1]; + u.b[0] = val[0]; + delay(1); + USB.println(u.f);*/ + + // check if new sensor value fits /1+4/ + if(!checkLength(5)) + { + return -1; + } + + // concatenate sensor name to frame string + + buffer[length-5] = (char)type; + buffer[length-4] = val[0]; + buffer[length-3] = val[1]; + buffer[length-2] = val[2]; + buffer[length-1] = val[3]; + buffer[length] = '\0'; + + // increment sensor fields counter + numFields++; + // set sensor fields counter + buffer[4]=numFields; + + } + + return length; +} + + + + +/* + * addSensor (type, value) - add sensor value to frame + * + * Parameters: + * type : Refers to the type of sensor data + * value : indicates the sensor value as a float + * + * Returns: + * 'length' of the composed frame when ok + * -1 when the maximum length of the frame is reached + * + */ +int8_t WaspFrame::addSensor(uint8_t type, double value) +{ + // get name of sensor from table + char numDecimals; + numDecimals =(uint8_t)pgm_read_word(&(DECIMAL_TABLE[type])); + + return addSensor(type, value, numDecimals); +} + + + +/* + * addSensor (type, value, N) - add sensor value to frame + * + * Parameters: + * type : Refers to the type of sensor data + * value : indicates the sensor value as a float + * N : number of decimals + * + * Returns: + * 'length' of the composed frame when ok + * -1 when the maximum length of the frame is reached + * + */ +int8_t WaspFrame::addSensor(uint8_t type, double value, int N) +{ + char str[20]; + + if(_mode == ASCII) + { + // convert from integer to string + Utils.float2String(value, str, N); + + // get name of sensor from table + char name[10]; + strcpy_P(name, (char*)pgm_read_word(&(SENSOR_TABLE[type]))); + + // check if new sensor value fits in the frame or not + // in the case the maximum length is reached, exit with error + // if not, then add the new sensor length to the total length + if(!checkLength( strlen(name) + + strlen(str) + + strlen(":") + + strlen("#") )) + { + return -1; + } + + // concatenate sensor name to frame string + strncat((char*)buffer, name, strlen(name)); + strcat((char*)buffer, ":"); + + // concatenate sensor value to frame string + strncat((char*)buffer, str, strlen(str)); + strcat((char*)buffer, "#\0"); + + // increment sensor fields counter + numFields++; + + // set sensor fields counter + buffer[4]=numFields; + } + else + { + // check if the data input type corresponds to the sensor + if(checkFields(type, TYPE_FLOAT, 1) == -1 ) return -1; + + // set data bytes (in this case, double is 4...) + char val[4]; + memcpy(val,&value,4); + + /* Check correct copy + union { + float f; + char b[4]; + } u; + u.b[3] = val[3]; + u.b[2] = val[2]; + u.b[1] = val[1]; + u.b[0] = val[0]; + delay(1); + USB.println(u.f);*/ + + // check if new sensor value fits /1+4/ + if(!checkLength(5)) + { + return -1; + } + + // concatenate sensor name to frame string + + buffer[length-5] = (char)type; + buffer[length-4] = val[0]; + buffer[length-3] = val[1]; + buffer[length-2] = val[2]; + buffer[length-1] = val[3]; + buffer[length] = '\0'; + + // increment sensor fields counter + numFields++; + // set sensor fields counter + buffer[4]=numFields; + + } + + return length; +} + + + +/* + * addSensor (type, value) - add sensor value to frame + * + * Parameters: + * type : Refers to the type of sensor data + * value : indicates the sensor value as a float + * + * Returns: + * 'length' of the composed frame when ok + * -1 when the maximum length of the frame is reached + * + */ +int8_t WaspFrame::addSensor(uint8_t type, char* str) +{ + if(_mode == ASCII) + { + // get name of sensor from table + char name[10]; + strcpy_P(name, (char*)pgm_read_word(&(SENSOR_TABLE[type]))); + + // check if new sensor value fits in the frame or not + // in the case the maximum length is reached, exit with error + // if not, then add the new sensor length to the total length + if(!checkLength( strlen(name) + + strlen(str) + + strlen(":") + + strlen("#") )) + { + return -1; + } + + // concatenate sensor name to frame string + strncat((char*)buffer, name, strlen(name)); + strcat((char*)buffer, ":"); + + // concatenate sensor value to frame string + strncat((char*)buffer, str, strlen(str)); + strcat((char*)buffer, "#\0"); + + // increment sensor fields counter + numFields++; + + // set sensor fields counter + buffer[4]=numFields; + } + else + { + // check if the data input type corresponds to the sensor + if(checkFields(type, TYPE_CHAR, 1) == -1 ) return -1; + + // set data bytes (in this case, string, one byte per char) & length (1 byte) + int8_t lng = strlen(str); + + // check if new sensor value fits (id + nbytes + str) + if(!checkLength(2+strlen(str))) + { + return -1; + } + + // concatenate sensor name to frame string + + int len = length-2-strlen(str); + buffer[len] = (char)type; + buffer[len+1] = lng; + for (int j=len+2;j= 0 ) + { + // if GMT is positive it is necessary to append a '+' character + strcat((char*)buffer, "+"); + } + strncat((char*)buffer, str4, strlen(str4)); + strcat((char*)buffer, "#\0"); + + // increment sensor fields counter + numFields++; + + // set sensor fields counter + buffer[4]=numFields; + } + else + { + /// BINARY + + // As SENSOR_TIME is thought to be a 3-value field. This function permits to + // add teh GMT value at the end of the time. But "checkFields" function must + // expect 3 values because it is the original composition. + if(checkFields(type, TYPE_UINT8, 3) == -1 ) return -1; + + // check if new sensor value fits 1+1+1+1 + if(!checkLength(4)) + { + return -1; + } + + // concatenate sensor name to frame string + + buffer[length-4] = (char)type; + buffer[length-3] = val1; + buffer[length-2] = val2; + buffer[length-1] = val3; + buffer[length] = '\0'; + + // increment sensor fields counter + numFields++; + // set sensor fields counter + buffer[4]=numFields; + + } + + return length; +} + + + + + +/* + * addSensor( type, val1, val2, val3) - add sensor to frame + * + * Parameters: + * type : Refers to the type of sensor data + * val1 : indicates the sensor value as an int (int16_t) + * val2 : indicates the sensor value as an int (int16_t) + * val2 : indicates the sensor value as an int (int16_t) + * + * Returns: + * 'length' of the composed frame when ok + * -1 when the maximum length of the frame is reached + * + */ +int8_t WaspFrame::addSensor(uint8_t type, int val1,int val2,int val3) +{ + char str1[10]; + char str2[10]; + char str3[10]; + + if(_mode == ASCII) + { + // get name of sensor from table + char name[10]; + strcpy_P(name, (char*)pgm_read_word(&(SENSOR_TABLE[type]))); + + // convert from integer to string + itoa( val1, str1, 10); + itoa( val2, str2, 10); + itoa( val3, str3, 10); + + // check if new sensor value fits in the frame or not + // in the case the maximum length is reached, exit with error + // if not, then add the new sensor length to the total length + if(!checkLength( strlen(name) + + strlen(":") + + strlen(str1) + + strlen(";") + + strlen(str2) + + strlen(";") + + strlen(str3) + + strlen("#") )) + { + return -1; + } + + // concatenate sensor name to frame string + strncat((char*)buffer, name, strlen(name)); + strcat((char*)buffer, ":"); + + // concatenate sensor value to frame string + strncat((char*)buffer, str1, strlen(str1)); + strcat((char*)buffer, ";"); + strncat((char*)buffer, str2, strlen(str2)); + strcat((char*)buffer, ";"); + strncat((char*)buffer, str3, strlen(str3)); + strcat((char*)buffer, "#\0"); + + // increment sensor fields counter + numFields++; + + // set sensor fields counter + buffer[4]=numFields; + } + else + { + // check if the data input type corresponds to the sensor + if( checkFields(type, TYPE_INT, 3) == -1 ) return -1; + + // set data bytes (in this case, int is two bytes) + char valC1[2]; + char valC2[2]; + char valC3[2]; + memcpy(valC1,&val1,2); + memcpy(valC2,&val2,2); + memcpy(valC3,&val3,2); + + // check if new sensor value fits 1+2+2+2 + if(!checkLength(7)) + { + return -1; + } + + // concatenate sensor name to frame string + + buffer[length-7] = (char)type; + buffer[length-6] = valC1[0]; + buffer[length-5] = valC1[1]; + buffer[length-4] = valC2[0]; + buffer[length-3] = valC2[1]; + buffer[length-2] = valC3[0]; + buffer[length-1] = valC3[1]; + buffer[length] = '\0'; + + // increment sensor fields counter + numFields++; + // set sensor fields counter + buffer[4]=numFields; + + } + + return length; +} + +/* + * + * + * + * + * + */ +int8_t WaspFrame::addSensor(uint8_t type, double val1,double val2,double val3) +{ + + char str1[20]; + char str2[20]; + char str3[20]; + + if(_mode == ASCII) + { + // get name of sensor from table + char numDecimals; + numDecimals =(uint8_t)pgm_read_word(&(DECIMAL_TABLE[type])); + + // convert from integer to string + Utils.float2String(val1, str1, numDecimals); + Utils.float2String(val2, str2, numDecimals); + Utils.float2String(val3, str3, numDecimals); + + // get name of sensor from table + char name[10]; + strcpy_P(name, (char*)pgm_read_word(&(SENSOR_TABLE[type]))); + + // check if new sensor value fits in the frame or not + // in the case the maximum length is reached, exit with error + // if not, then add the new sensor length to the total length + if(!checkLength( strlen(name) + + strlen(str1) + strlen(str2) + strlen(str3) + + strlen(";") + strlen(";") + strlen(":") + + strlen("#") )) + { + return -1; + } + + // concatenate sensor name to frame string + strncat((char*)buffer, name, strlen(name)); + strcat((char*)buffer, ":"); + + // concatenate sensor value to frame string + strncat((char*)buffer, str1, strlen(str1)); + strcat((char *)buffer, ";"); + strncat((char*)buffer, str2, strlen(str2)); + strcat((char *)buffer, ";"); + strncat((char*)buffer, str3, strlen(str3)); + strcat((char*)buffer, "#\0"); + + // increment sensor fields counter + numFields++; + + // set sensor fields counter + buffer[4]=numFields; + } + else + { + // check if the data input type corresponds to the sensor + if( checkFields(type, TYPE_FLOAT, 3) == -1 ) return -1; + + // set data bytes (in this case, double is 4...) + char valB1[4]; char valB2[4]; char valB3[4]; + memcpy(valB1,&val1,4); + memcpy(valB2,&val2,4); + memcpy(valB3,&val3,4); + /* + union { + float f; + char b[4]; + } u; + u.b[3] = val[3]; + u.b[2] = val[2]; + u.b[1] = val[1]; + u.b[0] = val[0]; + + USB.println(u.f); + */ + // check if new sensor value fits /1+4+4+4/ + if(!checkLength(13)) + { + return -1; + } + + // concatenate sensor name to frame string + + buffer[length-13] = (char)type; + buffer[length-12] = valB1[0]; + buffer[length-11] = valB1[1]; + buffer[length-10] = valB1[2]; + buffer[length-9] = valB1[3]; + buffer[length-8] = valB2[0]; + buffer[length-7] = valB2[1]; + buffer[length-6] = valB2[2]; + buffer[length-5] = valB2[3]; + buffer[length-4] = valB3[0]; + buffer[length-3] = valB3[1]; + buffer[length-2] = valB3[2]; + buffer[length-1] = valB3[3]; + buffer[length] = '\0'; + + // increment sensor fields counter + numFields++; + // set sensor fields counter + buffer[4]=numFields; + + } + + return length; +} + + + +/* + * checkFields(type, typeVal, fields ) - check type of value given by the user + * + * Parameters: + * 'type' is the index given to the sensor + * 'typeVal' is the type of variable given [0:uint8][1:int][2:double][3:char*] + * 'fields' is the number of fields the sensor must have + * All parameters given are checked by this function in order to see if the + * inputs are OK + * + */ +int8_t WaspFrame::checkFields(uint8_t type, uint8_t typeVal, uint8_t fields) +{ + uint8_t config; + uint8_t nfields; + + // *1* check sensor typeVal + + config =(uint8_t)pgm_read_word(&(SENSOR_TYPE_TABLE[type])); + + // special case (0 might be 1) + if (config ==1) + { + if ((typeVal == 0)||(typeVal == 1)) + { + //OK + } + else + { + USB.printf("ERR sensor type & value mismatch, %d vs %d \n",config, typeVal); + return -1; + } + } + else + { + if (config == typeVal) + { + //OK + } + else + { + USB.printf("ERR sensor type & value mismatch, %d vs %d \n",config, typeVal); + return -1; + } + } + + // *2* check sensor number of fields + + nfields =(uint8_t)pgm_read_word(&(SENSOR_FIELD_TABLE[type])); + if (nfields == fields) + { + //OK + } + else + { + USB.println(F("ERR sensor type & number of fields mismatch")); + return -1; + } + + return 1; +} + + + + + +/* + * setCloudCompatibility() - sends Waspmote unique ID with frame + * + * Parameters: + + * + * Returns: + * + */ +void WaspFrame::setCloudCompatibility() +{ + // At the moment, this function only sends a dummy unique ID. + // In the future will be more actions. + + + // Waspmote Unique ID = 64 bit (6 Bytes) + char uniqueID[7] = "123456"; + + // Here, unique ID should be read. + // uniqueID = Utils.readSerial(); + + + // Now add it to frame + + // TO DO + + +} + + + +/// Private Methods //////////////////////////////////////////////////////////// + +/* + * checkLength (sum) - check if maximum length is reached + * + * + * Return: + * '1' : if new sensor value fits in the frame + * '0' : if new sensor value does not fit in the frame + * + */ +uint8_t WaspFrame::checkLength(int sum) +{ + if( length + sum <= _maxSize ) + { + // if OK, add new length to total length + length = length + sum; + return 1; + } + else + { + // error + return 0; + } + +} + + + +/* + * setID (moteID) - store mote ID to EEPROM + * + * This function stores the mote Identifier in EEPROM[147-162] addresses + */ +void WaspFrame::setID(char* moteID) +{ + + // set zeros in EEPROM addresses + for( int i=0 ; i<16 ; i++ ) + { + eeprom_write_byte((unsigned char *) i+MOTEID_ADDR, 0x00); + } + + // set the mote ID from EEPROM memory + for( int i=0 ; i<16 ; i++ ) + { + eeprom_write_byte((unsigned char *) i+MOTEID_ADDR, moteID[i]); + // break if end of string + if( moteID[i] == '\0') + { + break; + } + } + +} + + +/* + * getID (moteID) - read mote ID from EEPROM + * + * This function reads the moteID previously stored in EEPROM[147-162] addresses + */ +void WaspFrame::getID(char* moteID) +{ + + // read mote ID from EEPROM memory + for(int i=0 ; i<16 ; i++ ) + { + moteID[i]=Utils.readEEPROM(i+MOTEID_ADDR); + } + moteID[16]='\0'; + +} + + +/* + * storeSequence (seqNumber) - store the sequence number to EEPROM[163] address + * + */ +void WaspFrame::storeSequence(uint8_t seqNumber) +{ + // store frame sequence number to EEPROM[163] + eeprom_write_byte((unsigned char *) SEQUENCE_ADDR, seqNumber); + + +} + + + +/* + * readSequence (void) - read the sequence number from EEPROM[163] address + * + */ +uint8_t WaspFrame::readSequence(void) +{ + // read frame sequence number from EEPROM[163] + return Utils.readEEPROM(SEQUENCE_ADDR); + +} + + + + +/// Preinstantiate Objects ///////////////////////////////////////////////////// + +WaspFrame frame = WaspFrame(); + diff --git a/waspmote/libraries/Frame/WaspFrame.h b/waspmote/libraries/Frame/WaspFrame.h new file mode 100755 index 0000000..a3f2f7c --- /dev/null +++ b/waspmote/libraries/Frame/WaspFrame.h @@ -0,0 +1,634 @@ +/*! \file WaspFrame.h + \brief Library for creating formated frames + + Copyright (C) 2012 Libelium Comunicaciones Distribuidas S.L. + http://www.libelium.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . + + Version: 1.0 + Design: David Gascón + Implementation: Yuri Carmona, Javier Siscart, Joaquín Ruiz + +*/ + + +/*! \def WaspFrame_h + */ +#ifndef WaspFrame_h +#define WaspFrame_h + + + +/****************************************************************************** + * Includes + ******************************************************************************/ + +#include +#include +#include +#include +#include + + +/****************************************************************************** + * Definitions & Declarations + ******************************************************************************/ + + + +/// Gases Board sensor measurements + +/*! \def SENSOR_CO + \brief Carbon Monoxide measurement type + */ +/*! \def SENSOR_CO2 + \brief Carbon Dioxide measurement type + */ +/*! \def SENSOR_O2 + \brief Oxygen measurement type + */ +/*! \def SENSOR_CH4 + \brief Methane measurement type + */ +/*! \def SENSOR_LPG + \brief Liquefied Pretoleum Gases measurement type + */ +/*! \def SENSOR_NH3 + \brief Ammonia measurement type + */ +/*! \def SENSOR_AP1 + \brief Air Pollutans 1 measurement type + */ +/*! \def SENSOR_AP2 + \brief Air Pollutans 2 measurement type + */ +/*! \def SENSOR_SV + \brief Solvent Vapors measurement type + */ +/*! \def SENSOR_NO2 + \brief Nitrogen Dioxide measurement type + */ +/*! \def SENSOR_O3 + \brief Ozone measurement type + */ +/*! \def SENSOR_VOC + \brief Hydrocarbons measurement type + */ +/*! \def SENSOR_TC + \brief Temperature Celsius measurement type + */ +/*! \def SENSOR_TF + \brief Temperature Fahrenheit measurement type + */ +/*! \def SENSOR_HUM + \brief Humidity measurement type + */ +/*! \def SENSOR_PA + \brief Pressure atmospheric measurement type + */ + + +/// Events Board Sensor measurements + +/*! \def SENSOR_PW + \brief Pressure/Weight measurement type + */ +/*! \def SENSOR_BEND + \brief Bend measurement type + */ +/*! \def SENSOR_VBR + \brief Vibration measurement type + */ +/*! \def SENSOR_HALL + \brief Hall Effect measurement type + */ +/*! \def SENSOR_LP + \brief Liquid Presence measurement type + */ +/*! \def SENSOR_LL + \brief Liquid Level measurement type + */ +/*! \def SENSOR_LUM + \brief Luminosity measurement type + */ +/*! \def SENSOR_PIR + \brief Presence measurement type + */ +/*! \def SENSOR_ST + \brief Stretch measurement type + */ + + +/// Smart cities sensor measurements + +/*! \def SENSOR_MCP + \brief Microphone measurement type + */ +/*! \def SENSOR_CDG + \brief Crack detection gauge measurement type + */ +/*! \def SENSOR_CPG + \brief Crack propagation gauge measurement type + */ +/*! \def SENSOR_LD + \brief Linear Displacement measurement type + */ +/*! \def SENSOR_DUST + \brief Dust measurement type + */ +/*! \def SENSOR_US + \brief Ultrasound measurement type + */ + + +/// Smart parking sensor measurements + +/*! \def SENSOR_MF + \brief Magnetic Field measurement type + */ +/*! \def SENSOR_PS + \brief Parking Spot Status measurement type + */ + +/// Agriculture sensor measurements + +/*! \def SENSOR_AIR + \brief Air Temperature / Humidity measurement type + */ +/*! \def SENSOR_SOIL + \brief Soil Temperature / Moisture measurement type + */ +/*! \def SENSOR_LW + \brief Leaf Wetness measurement type + */ +/*! \def SENSOR_PAR + \brief Solar Radiation measurement type + */ +/*! \def SENSOR_UV + \brief Ultraviolet Radiation measurement type + */ +/*! \def SENSOR_TD + \brief Trunk Diameter measurement type + */ +/*! \def SENSOR_SD + \brief Stem Diameter measurement type + */ +/*! \def SENSOR_FD + \brief Fruit Diameter measurement type + */ +/*! \def SENSOR_ANE + \brief Anemometer measurement type + */ +/*! \def SENSOR_WV + \brief Wind Vane measurement type + */ +/*! \def SENSOR_PLV + \brief Pluviometer measurement type + */ + + +/// Radiation sensor measurements + +/*! \def SENSOR_RAD + \brief Geiger tube measurement type + */ + + +/// Smart meetering sensor measurements + +/*! \def SENSOR_CU + \brief Current measurement type + */ +/*! \def SENSOR_WF + \brief Water flow measurement type + */ +/*! \def SENSOR_LC + \brief Load cell measurement type + */ +/*! \def SENSOR_DF + \brief Distance foil measurement type + */ + + +/// Additional sensor measurements + +/*! \def SENSOR_BAT + \brief Battery measurement type + */ +/*! \def SENSOR_GPS + \brief Global Positioning System measurement type + */ +/*! \def SENSOR_RSSI + \brief RSSI measurement type + */ +/*! \def SENSOR_MAC + \brief MAC Address measurement type + */ +/*! \def SENSOR_NA + \brief Network Address measurement type + */ +/*! \def SENSOR_NID + \brief Network Identifier origin measurement type + */ +/*! \def SENSOR_DATE + \brief Date measurement type + */ +/*! \def SENSOR_TIME + \brief Time measurement type + */ +/*! \def SENSOR_GMT + \brief GMT measurement type + */ +/*! \def SENSOR_RAM + \brief RAM measurement type + */ +/*! \def SENSOR_IN_TEMP + \brief Internal temperature measurement type + */ +/*! \def SENSOR_MILLIS + \brief Millis measurement type + */ + +/// Special sensor measurements + +/*! \def SENSOR_STR + \brief String type + */ + +// Gases +#define SENSOR_CO 0 +#define SENSOR_CO2 1 +#define SENSOR_O2 2 +#define SENSOR_CH4 3 +#define SENSOR_LPG 4 +#define SENSOR_NH3 5 +#define SENSOR_AP1 6 +#define SENSOR_AP2 7 +#define SENSOR_SV 8 +#define SENSOR_NO2 9 +#define SENSOR_O3 10 +#define SENSOR_VOC 11 +#define SENSOR_TCA 12 +#define SENSOR_TFA 13 +#define SENSOR_HUMA 14 +#define SENSOR_PA 15 + +// Events +#define SENSOR_PW 16 +#define SENSOR_BEND 17 +#define SENSOR_VBR 18 +#define SENSOR_HALL 19 +#define SENSOR_LP 20 +#define SENSOR_LL 21 +#define SENSOR_LUM 22 +#define SENSOR_PIR 23 +#define SENSOR_ST 24 + +// Smart Cities +#define SENSOR_MCP 25 +#define SENSOR_CDG 26 +#define SENSOR_CPG 27 +#define SENSOR_LD 28 +#define SENSOR_DUST 29 +#define SENSOR_US 30 + +// Smart parking +#define SENSOR_MF 31 +#define SENSOR_PS 32 + +// Agriculture +#define SENSOR_TCB 33 +#define SENSOR_TFB 34 +#define SENSOR_HUMB 35 +#define SENSOR_SOILT 36 +#define SENSOR_SOIL 37 +#define SENSOR_LW 38 +#define SENSOR_PAR 39 +#define SENSOR_UV 40 +#define SENSOR_TD 41 +#define SENSOR_SD 42 +#define SENSOR_FD 43 +#define SENSOR_ANE 44 +#define SENSOR_WV 45 +#define SENSOR_PLV 46 + +// Radiation +#define SENSOR_RAD 47 + +// Smart meetering +#define SENSOR_CU 48 +#define SENSOR_WF 49 +#define SENSOR_LC 50 +#define SENSOR_DF 51 + +// Additional +#define SENSOR_BAT 52 +#define SENSOR_GPS 53 +#define SENSOR_RSSI 54 +#define SENSOR_MAC 55 +#define SENSOR_NA 56 +#define SENSOR_NID 57 +#define SENSOR_DATE 58 +#define SENSOR_TIME 59 +#define SENSOR_GMT 60 +#define SENSOR_RAM 61 +#define SENSOR_IN_TEMP 62 +#define SENSOR_ACC 63 +#define SENSOR_MILLIS 64 + +// Special +#define SENSOR_STR 65 + +// Meshlium +#define SENSOR_MBT 66 +#define SENSOR_MWIFI 67 + +// RFID +#define SENSOR_UID 68 +#define SENSOR_RB 69 + +// CRITICAL INFRASTRUCTURE +#define SENSOR_CI0 70 +#define SENSOR_CI1 71 +#define SENSOR_CI2 72 +#define SENSOR_CI3 73 +#define SENSOR_CI4 74 + + + + +// define MACROS in order to manage bits inside Bytes +#define bitRead(value, bit) (((value) >> (bit)) & 0x01) +#define bitSet(value, bit) ((value) |= (1UL << (bit))) +#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) +#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) + + +/*! \def MAX_FRAME + \brief maximum size in bytes of the frame + */ +#define MAX_FRAME 150 + + + +/*! \def UNICAST_16B + \brief + */ +/*! \def UNICAST_64B + \brief + */ +/*! \def BROADCAST_MODE + \brief + */ +#define UNICAST_16B 0 +#define UNICAST_64B 1 +#define BROADCAST_MODE 2 + + + +/*! \def EXAMPLE_FRAME + \brief + */ +/*! \def TIMEOUT_FRAME + \brief + */ +/*! \def EVENT_FRAME + \brief + */ +/*! \def ALARM_FRAME + \brief + */ +/*! \def SERVICE1_FRAME + \brief + */ +/*! \def SERVICE2_FRAME + \brief + */ +#define EXAMPLE_FRAME 0 +#define TIMEOUT_FRAME 1 +#define EVENT_FRAME 2 +#define ALARM_FRAME 3 +#define SERVICE1_FRAME 4 +#define SERVICE2_FRAME 5 + + +/*! \def TYPE_UINT8 + \brief TYPE_UINT8 defines the constant for uint8_t variables types (1 Byte) + */ +/*! \def TYPE_INT + \brief TYPE_INT defines the constant for int (int16_t) variables types (2 Bytes) + */ +/*! \def TYPE_FLOAT + \brief TYPE_FLOAT defines the constant for double/float variables types (4 Bytes) + */ +/*! \def TYPE_CHAR + \brief TYPE_CHAR defines the constant for char* (strings) variables types (variable Bytes) + */ +/*! \def TYPE_ULONG + \brief TYPE_ULONG defines the constant for unsigned long int variables types (4 Bytes) + */ +#define TYPE_UINT8 0 +#define TYPE_INT 1 +#define TYPE_FLOAT 2 +#define TYPE_CHAR 3 +#define TYPE_ULONG 4 + + + +/*! \def ASCII + \brief ASCII frame mode + */ +/*! \def BINARY + \brief BINARY frame mode + */ +#define ASCII 1 +#define BINARY 0 + + +//! Variable : Waspmote serial id +/*! +*/ +extern volatile unsigned long _serial_id; + + +/****************************************************************************** + * Class + ******************************************************************************/ + + //! WaspFrame Class +/*! + WaspFrame Class defines all the variables and functions used to create the + sensor frames in Waspmote + */ +class WaspFrame +{ + +private: + + //! Function : store the sequence number in EEPROM + /*! This function stores the sequence number in the EEPROM address specified + * by the SEQUENCE_ADDR address. + */ + void storeSequence(uint8_t seqNumber); + + //! Function : read the sequence number from EEPROM + /*! This function reads the sequence number from the EEPROM address specified + * by the SEQUENCE_ADDR address. + */ + uint8_t readSequence(void); + + //! Function : check if maximum length is reached + /*! Check if maximum length is reached when introducing a new frame field + */ + uint8_t checkLength(int sum); + + //! Variable : sequence number + /*! + This is the frame sequence number in order to control if any packet is lost + */ + uint8_t sequence; + + //! Variable : number of sensor values within the frame + /*! + */ + uint8_t numFields; + + //! Variable : frame format: ASCII (0) or BINARY (1) + /*! + */ + uint8_t _mode; + + //! Variable : maximum frame size + /*! + */ + uint8_t _maxSize; + +public: + + //! class constructor + /*! + Initialize the class attributes + \param void + \return void + */ + WaspFrame(); + + //! Function : set the frame maximum size + /*! This function sets the frame maximum size + \param uint8_t size size to set as maximum size. It can't exceed the + MAX_FRAME constant + \return void + */ + void setFrameSize( uint8_t size); + + //! Function : set the frame maximum size + /*! This function sets the frame maximum size depending on the protocol, + addressing, linkEncryption mode, AESEncryption. + \param uint8_t protocol defines the procotol used + \param uint8_t linkEncryption defines if XBee encryption is enabled or not + \param uint8_t AESEncryption defines if AES encryption is used or not + \return void + */ + void setFrameSize( uint8_t protocol, + uint8_t linkEncryption, + uint8_t AESEncryption); + + //! Function : set the frame maximum size + /*! This function sets the frame maximum size depending on the protocol, + addressing, linkEncryption mode, AESEncryption. + \param uint8_t protocol defines the procotol used + \param uint8_t addressing defines the addressing used + \param uint8_t linkEncryption defines if XBee encryption is enabled or not + \param uint8_t AESEncryption defines if AES encryption is used or not + \return void + */ + void setFrameSize( uint8_t protocol, + uint8_t addressing, + uint8_t linkEncryption, + uint8_t AESEncryption); + + //! Function : get the frame maximum size + /*! This function gets the frame maximum size + \return uint8_t indicating the value of _maxSize + */ + uint8_t getFrameSize( void ); + + //! Function : creates a new frame + /*! This function creates a new ASCII frame getting the mote ID from the + * EEPROM memory. + */ + void createFrame(void); + + //! Function : creates a new frame + /*! This function creates a new frame. + \param uint8_t mode specifies the frame mode: BINARY or ASCII + \return const char* moteID defines the mote Identifier + */ + void createFrame(uint8_t mode, const char* moteID); + + //! Function : set the frame type + /*! This function sets the frame type (fourth byte of the frame header) + \param uint8_t type specifies the frame type: + EXAMPLE_FRAME + TIMEOUT_FRAME + EVENT_FRAME + ALARM_FRAME + SERVICE1_FRAME + SERVICE2_FRAME + \return void + */ + void setFrameType(uint8_t type); + + //! Function : shows the frame + /*! This function prints the actual frame + */ + void showFrame(void); + + int8_t addSensor(uint8_t type, int value); + int8_t addSensor(uint8_t type, unsigned long value); + int8_t addSensor(uint8_t type, double value); + int8_t addSensor(uint8_t type, double value, int N); + int8_t addSensor(uint8_t type, char* str); + + int8_t addSensor(uint8_t type, double val1, double val2); + int8_t addSensor(uint8_t type, uint8_t val1, uint8_t val2, uint8_t val3); + int8_t addSensor(uint8_t type, uint8_t val1, uint8_t val2, uint8_t val3, int val4); + int8_t addSensor(uint8_t type, int val1,int val2,int val3); + int8_t addSensor(uint8_t type, double val1,double val2,double val3); + + int8_t checkFields(uint8_t type, uint8_t typeVal, uint8_t fields); + + void setID(char* moteID); + void getID(char* moteID); + + // Sends Waspmote unique ID with the frame + void setCloudCompatibility(void); + + //! Variable : buffer where the frame is created in + /*! + */ + uint8_t buffer[MAX_FRAME+1]; + + //! Variable : length of the frame + /*! + */ + uint16_t length; + +}; + +extern WaspFrame frame; + +#endif + diff --git a/waspmote/libraries/Frame/WaspFrameConstants.h b/waspmote/libraries/Frame/WaspFrameConstants.h new file mode 100755 index 0000000..c17d8fa --- /dev/null +++ b/waspmote/libraries/Frame/WaspFrameConstants.h @@ -0,0 +1,574 @@ + + +#ifndef WaspFrameconstants_h +#define WaspFrameconstants_h + + +#include + + + +/// Flash defines ////////////////////////////////////////////////////////////// + + +/******************************************************************************* + * The following Flash strings, define the tags for all Waspmote sensors. + * These TAGs are used in ASCII frames in order to indicate every sensor field + * that has been included inside the frame. + * + ******************************************************************************/ + +// Gases +prog_char str_CO[] PROGMEM = "CO"; // 0 +prog_char str_CO2[] PROGMEM = "CO2"; // 1 +prog_char str_O2[] PROGMEM = "O2"; // 2 +prog_char str_CH4[] PROGMEM = "CH4"; // 3 +prog_char str_LPG[] PROGMEM = "LPG"; // 4 +prog_char str_NH3[] PROGMEM = "NH3"; // 5 +prog_char str_AP1[] PROGMEM = "AP1"; // 6 +prog_char str_AP2[] PROGMEM = "AP2"; // 7 +prog_char str_SV[] PROGMEM = "SV"; // 8 +prog_char str_NO2[] PROGMEM = "NO2"; // 9 +prog_char str_O3[] PROGMEM = "O3"; // 10 +prog_char str_VOC[] PROGMEM = "VOC"; // 11 +prog_char str_TCA[] PROGMEM = "TCA"; // 12 +prog_char str_TFA[] PROGMEM = "TFA"; // 13 +prog_char str_HUMA[] PROGMEM = "HUMA"; // 14 +prog_char str_PA[] PROGMEM = "PA"; // 15 + +// Events +prog_char str_PW[] PROGMEM = "PW"; // 16 +prog_char str_BEND[] PROGMEM = "BEND"; // 17 +prog_char str_VBR[] PROGMEM = "VBR"; // 18 +prog_char str_HALL[] PROGMEM = "HALL"; // 19 +prog_char str_LP[] PROGMEM = "LP"; // 20 +prog_char str_LL[] PROGMEM = "LL"; // 21 +prog_char str_LUM[] PROGMEM = "LUM"; // 22 +prog_char str_PIR[] PROGMEM = "PIR"; // 23 +prog_char str_ST[] PROGMEM = "ST"; // 24 + +// Smart cities +prog_char str_MCP[] PROGMEM = "MCP"; // 25 +prog_char str_CDG[] PROGMEM = "CDG"; // 26 +prog_char str_CPG[] PROGMEM = "CPG"; // 27 +prog_char str_LD[] PROGMEM = "LD"; // 28 +prog_char str_DUST[] PROGMEM = "DUST"; // 29 +prog_char str_US[] PROGMEM = "US"; // 30 + +// Smart parking +prog_char str_MF[] PROGMEM = "MF"; // 31 +prog_char str_PS[] PROGMEM = "PS"; // 32 + +// Agriculture +prog_char str_TCB[] PROGMEM = "TCB"; // 33 +prog_char str_TFB[] PROGMEM = "TFB"; // 34 +prog_char str_HUMB[] PROGMEM = "HUMB"; // 35 +prog_char str_SOILT[] PROGMEM = "SOILT"; // 36 +prog_char str_SOIL[] PROGMEM = "SOIL"; // 37 +prog_char str_LW[] PROGMEM = "LW"; // 38 +prog_char str_PAR[] PROGMEM = "PAR"; // 39 +prog_char str_UV[] PROGMEM = "UV"; // 40 +prog_char str_TD[] PROGMEM = "TD"; // 41 +prog_char str_SD[] PROGMEM = "SD"; // 42 +prog_char str_FD[] PROGMEM = "FD"; // 43 +prog_char str_ANE[] PROGMEM = "ANE"; // 44 +prog_char str_WV[] PROGMEM = "WV"; // 45 +prog_char str_PLV[] PROGMEM = "PLV"; // 46 + +// Radiation +prog_char str_RAD[] PROGMEM = "RAD"; // 47 + +// Smart meetering +prog_char str_CU[] PROGMEM = "CU"; // 48 +prog_char str_WF[] PROGMEM = "WF"; // 49 +prog_char str_LC[] PROGMEM = "LC"; // 50 +prog_char str_DF[] PROGMEM = "DF"; // 51 + +// Additional +prog_char str_BAT[] PROGMEM = "BAT"; // 52 +prog_char str_GPS[] PROGMEM = "GPS"; // 53 +prog_char str_RSSI[] PROGMEM = "RSSI"; // 54 +prog_char str_MAC[] PROGMEM = "MAC"; // 55 +prog_char str_NA[] PROGMEM = "NA"; // 56 +prog_char str_NID[] PROGMEM = "NID"; // 57 +prog_char str_DATE[] PROGMEM = "DATE"; // 58 +prog_char str_TIME[] PROGMEM = "TIME"; // 59 +prog_char str_GMT[] PROGMEM = "GMT"; // 60 +prog_char str_RAM[] PROGMEM = "RAM"; // 61 +prog_char str_IN_TEMP[] PROGMEM = "IN_TEMP"; // 62 +prog_char str_ACC[] PROGMEM = "ACC"; // 63 +prog_char str_MILLIS[] PROGMEM = "MILLIS"; // 64 + +// Special +prog_char str_STR[] PROGMEM = "STR"; // 65 + +// Meshlium +prog_char str_MBT[] PROGMEM = "MBT"; // 66 +prog_char str_MWIFI[] PROGMEM = "MWIFI"; // 67 + +// RFID +prog_char str_UID[] PROGMEM = "UID"; // 68 +prog_char str_RB[] PROGMEM = "RB"; // 69 + +// CRITICAL INFRASTRUCTURE +prog_char str_CI0[] PROGMEM = "CI0"; // 70 +prog_char str_CI1[] PROGMEM = "CI1"; // 71 +prog_char str_CI2[] PROGMEM = "CI2"; // 72 +prog_char str_CI3[] PROGMEM = "CI3"; // 73 +prog_char str_CI4[] PROGMEM = "CI4"; // 74 + + + +/******************************************************************************* + * SENSOR_TABLE - Sensor label table + * + * This table specifies the tag for each sensor. Every tag has been previously + * defined in Flash memory + ******************************************************************************/ +PROGMEM const char* SENSOR_TABLE[] = +{ + // Gases + str_CO, // 0 + str_CO2, // 1 + str_O2, // 2 + str_CH4, // 3 + str_LPG, // 4 + str_NH3, // 5 + str_AP1, // 6 + str_AP2, // 7 + str_SV, // 8 + str_NO2, // 9 + str_O3, // 10 + str_VOC, // 11 + str_TCA, // 12 + str_TFA, // 13 + str_HUMA, // 14 + str_PA, // 15 + + // Events + str_PW, // 16 + str_BEND, // 17 + str_VBR, // 18 + str_HALL, // 19 + str_LP, // 20 + str_LL, // 21 + str_LUM, // 22 + str_PIR, // 23 + str_ST, // 24 + +// Smart cities + str_MCP, // 25 + str_CDG, // 26 + str_CPG, // 27 + str_LD, // 28 + str_DUST, // 29 + str_US, // 30 + +// Smart parking + str_MF, // 31 + str_PS, // 32 + +// Agriculture + str_TCB, // 33 + str_TFB, // 34 + str_HUMB, // 35 + str_SOILT, // 36 + str_SOIL, // 37 + str_LW, // 38 + str_PAR, // 39 + str_UV, // 40 + str_TD, // 41 + str_SD, // 42 + str_FD, // 43 + str_ANE, // 44 + str_WV, // 45 + str_PLV, // 46 + + // Radiation + str_RAD, // 47 + + // Smart meetering + str_CU, // 48 + str_WF, // 49 + str_LC, // 50 + str_DF, // 51 + + // Additional + str_BAT, // 52 + str_GPS, // 53 + str_RSSI, // 54 + str_MAC, // 55 + str_NA, // 56 + str_NID, // 57 + str_DATE, // 58 + str_TIME, // 59 + str_GMT, // 60 + str_RAM, // 61 + str_IN_TEMP, // 62 + str_ACC, // 63 + str_MILLIS, // 64 + + // Special + str_STR, // 65 + + // Meshlium + str_MBT, // 66 + str_MWIFI, // 67 + + // RFID + str_UID, // 68 + str_RB, // 69 + + // CRITICAL INFRASTRUCTURE + str_CI0, // 70 + str_CI1, // 71 + str_CI2, // 72 + str_CI3, // 73 + str_CI4 // 74 + +}; + + +/******************************************************************************* + * SENSOR_TYPE_TABLE - Binary frames sensor types + * + * This table specifies the type of sensor depending on the type of value the + * user must put as input. These are the possibilities: + * + * 0: uint8_t + * 1: int (the same as int16_t) + * 2: double + * 3: char* + * 4: unsigned long + * 5: uint8_t* + ******************************************************************************/ +PROGMEM const uint8_t SENSOR_TYPE_TABLE[] = +{ + // Gases + 2, // str_CO, // 0 + 2, // str_CO2, // 1 + 2, // str_O2, // 2 + 2, // str_CH4, // 3 + 2, // str_LPG, // 4 + 2, // str_NH3, // 5 + 2, // str_AP1, // 6 + 2, // str_AP2, // 7 + 2, // str_SV, // 8 + 2, // str_NO2, // 9 + 2, // str_O3, // 10 + 2, // str_VOC, // 11 + 2, // str_TCA, // 12 + 2, // str_TFA, // 13 + 2, // str_HUMA, // 14 + 2, // str_PA, // 15 + + // Events + 2, // str_PW, // 16 + 2, // str_BEND, // 17 + 0, // str_VBR, // 18 + 0, // str_HALL, // 19 + 0, // str_LP, // 20 + 0, // str_LL, // 21 + 2, // str_LUM, // 22 + 0, // str_PIR, // 23 + 2, // str_ST, // 24 + + // Smart cities + 0, // str_MCP, // 25 + 0, // str_CDG, // 26 + 2, // str_CPG, // 27 + 2, // str_LD, // 28 + 2, // str_DUST, // 29 + 2, // str_US, // 30 + + // Smart parking + 1, //str_MF, // 31 + 0, //str_PS, // 32 + + // Agriculture + 2, // str_TCB, // 33 + 2, // str_TFB, // 34 + 2, // str_HUMB, // 35 + 2, // str_SOILT, // 36 + 2, // str_SOIL, // 37 + 0, // str_LW, // 38 + 2, // str_PAR, // 39 + 2, // str_UV, // 40 + 2, // str_TD, // 41 + 2, // str_SD, // 42 + 2, // str_FD, // 43 + 2, // str_ANE, // 44 + 0, // str_WV, // 45 + 2, // str_PLV, // 46 + + // Radiation + 2, // str_RAD, // 47 + + // Smart meetering + 2, // str_CU, // 48 + 2, // str_WF, // 49 + 2, // str_LC, // 50 + 2, // str_DF, // 51 + + // Additional + 0, // str_BAT, // 52 + 2, // str_GPS, // 53 + 1, // str_RSSI, // 54 + 3, // str_MAC, // 55 + 3, // str_NA, // 56 + 3, // str_NID, // 57 + 0, // str_DATE, // 58 + 0, // str_TIME, // 59 + 1, // str_GMT, // 60 + 1, // str_RAM, // 61 + 2, // str_IN_TEMP, // 62 + 1, // str_ACC, // 63 + 4, // str_MILLIS, // 64 + + + // Special + 3, // str_STR // 65 + + // Meshlium + 3, // str_MBT // 66 + 3, //str_MWIFI // 67 + + // RFID + 3, //str_UID // 68 + 3, //str_RB // 69 + + // CRITICAL INFRASTRUCTURE + 1, //str_CI0 //70 + 1, //str_CI1 //71 + 1, //str_CI2 //72 + 1, //str_CI3 //73 + 1 //str_CI4 //74 + +}; + + +/******************************************************************************* + * SENSOR_FIELD_TABLE - Sensor fields + * + * This table specifies the number of fields per sensor. + * + * For example, a temperature sensor indicates the temperature in a single field. + * On the other hand, the GPS module indicates the position with two fields: + * latitude and longitude + ******************************************************************************/ +PROGMEM const uint8_t SENSOR_FIELD_TABLE[] = +{ + // Gases + 1, // str_CO, // 0 + 1, // str_CO2, // 1 + 1, // str_O2, // 2 + 1, // str_CH4, // 3 + 1, // str_LPG, // 4 + 1, // str_NH3, // 5 + 1, // str_AP1, // 6 + 1, // str_AP2, // 7 + 1, // str_SV, // 8 + 1, // str_NO2, // 9 + 1, // str_O3, // 10 + 1, // str_VOC, // 11 + 1, // str_TCA, // 12 + 1, // str_TFA, // 13 + 1, // str_HUMA, // 14 + 1, // str_PA, // 15 + + // Events + 1, // str_PW, // 16 + 1, // str_BEND, // 17 + 1, // str_VBR, // 18 + 1, // str_HALL, // 19 + 1, // str_LP, // 20 + 1, // str_LL, // 21 + 1, // str_LUM, // 22 + 1, // str_PIR, // 23 + 1, // str_ST, // 24 + + // Smart cities + 1, // str_MCP, // 25 + 1, // str_CDG, // 26 + 1, // str_CPG, // 27 + 1, // str_LD, // 28 + 1, // str_DUST, // 29 + 1, // str_US, // 30 + + // Smart parking + 3, //str_MF, // 31 + 1, //str_PS, // 32 + + // Agriculture + 1, // str_TCB, // 33 + 1, // str_TFB, // 34 + 1, // str_HUMB, // 35 + 1, // str_SOILT, // 36 + 1, // str_SOIL, // 37 + 1, // str_LW, // 38 + 1, // str_PAR, // 39 + 1, // str_UV, // 40 + 1, // str_TD, // 41 + 1, // str_SD, // 42 + 1, // str_FD, // 43 + 1, // str_ANE, // 44 + 1, // str_WV, // 45 + 1, // str_PLV, // 46 + + // Radiation + 1, // str_RAD, // 47 + + // Smart meetering + 1, // str_CU, // 48 + 1, // str_WF, // 49 + 1, // str_LC, // 50 + 1, // str_DF, // 51 + + // Additional + 1, // str_BAT, // 52 + 2, // str_GPS, // 53 + 1, // str_RSSI, // 54 + 1, // str_MAC, // 55 + 1, // str_NA, // 56 + 1, // str_NID, // 57 + 3, // str_DATE, // 58 + 3, // str_TIME, // 59 + 1, // str_GMT, // 60 + 1, // str_RAM, // 61 + 1, // str_IN_TEMP, // 62 + 3, // str_ACC, // 63 + 1, // str_MILLIS, // 64 + + // Special + 1, // str_STR // 65 + + // Meshlium + 1, // str_MBT // 66 + 1, //str_MWIFI // 67 + + // RFID + 1, //str_UID // 68 + 1, //str_RB // 69 + + // CRITICAL INFRASTRUCTURE + 1, //str_CI0 //70 + 1, //str_CI1 //71 + 1, //str_CI2 //72 + 1, //str_CI3 //73 + 1 //str_CI4 //74 + +}; + + + +/******************************************************************************* + * DECIMAL_TABLE - number of default decimals for each sensor for ASCII frames + * + * This table specifies the number of decimals for each sensor for ASCII frames + ******************************************************************************/ +PROGMEM const uint8_t DECIMAL_TABLE[] = +{ + // Gases + 3, // str_CO, // 0 + 3, // str_CO2, // 1 + 3, // str_O2, // 2 + 3, // str_CH4, // 3 + 3, // str_LPG, // 4 + 3, // str_NH3, // 5 + 3, // str_AP1, // 6 + 3, // str_AP2, // 7 + 3, // str_SV, // 8 + 3, // str_NO2, // 9 + 3, // str_O3, // 10 + 3, // str_VOC, // 11 + 2, // str_TCA, // 12 + 2, // str_TFA, // 13 + 1, // str_HUMA, // 14 + 2, // str_PA, // 15 + + // Events + 3, // str_PW, // 16 + 3, // str_BEND, // 17 + 0, // str_VBR, // 18 + + 0, // str_HALL, // 19 + 0, // str_LP, // 20 + 0, // str_LL, // 21 + 3, // str_LUM, // 22 + 0, // str_PIR, // 23 + 3, // str_ST, // 24 + + // Smart cities + 0, // str_MCP, // 25 + 0, // str_CDG, // 26 + 3, // str_CPG, // 27 + 3, // str_LD, // 28 + 3, // str_DUST, // 29 + 2, // str_US, // 30 + + // Smart parking + 0, //str_MF, // 31 + 0, //str_PS, // 32 + + // Agriculture + 2, // str_TCB, // 33 + 2, // str_TFB, // 34 + 1, // str_HUMB, // 35 + 2, // str_SOILT, // 36 + 2, // str_SOIL, // 37 + 0, // str_LW, // 38 + 2, // str_PAR, // 39 + 2, // str_UV, // 40 + 3, // str_TD, // 41 + 3, // str_SD, // 42 + 3, // str_FD, // 43 + 2, // str_ANE, // 44 + 0, // str_WV, // 45 + 2, // str_PLV, // 46 + + // Radiation + 6, // str_RAD, // 47 + + // Smart meetering + 2, // str_CU, // 48 + 3, // str_WF, // 49 + 3, // str_LC, // 50 + 3, // str_DF, // 51 + + // Additional + 0, // str_BAT, // 52 + 6, // str_GPS, // 53 + 0, // str_RSSI, // 54 + 0, // str_MAC, // 55 + 0, // str_NA, // 56 + 0, // str_NID, // 57 + 0, // str_DATE, // 58 + 0, // str_TIME, // 59 + 0, // str_GMT, // 60 + 0, // str_RAM, // 61 + 2, // str_IN_TEMP, // 62 + 0, // str_ACC, // 63 + 0, // str_MILLIS, // 64 + + // Special + 0, // str_STR // 65 + + // Meshlium + 0, // str_MBT // 66 + 0, //str_MWIFI // 67 + + // RFID + 0, //str_UID // 68 + 0, //str_RB // 69 + + // CRITICAL INFRASTRUCTURE + 0, //str_CI0 //70 + 0, //str_CI1 //71 + 0, //str_CI2 //72 + 0, //str_CI3 //73 + 0 //str_CI4 //74 + + +}; + +#endif