Compare commits
No commits in common. "master" and "feature/InfluxDB-Connection-Update" have entirely different histories.
master
...
feature/In
385 changed files with 180396 additions and 3758 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -4,7 +4,3 @@ firmware/.DS_Store
|
||||||
schematics/#auto_saved_files#
|
schematics/#auto_saved_files#
|
||||||
schematics/_autosave-oko-weatherstation.sch
|
schematics/_autosave-oko-weatherstation.sch
|
||||||
firmware.ino.bin
|
firmware.ino.bin
|
||||||
firmware/extract me in arduino libraries folder.zip
|
|
||||||
doxygen/*
|
|
||||||
schematics/oko-weatherstation-backups
|
|
||||||
firmware/.vscode
|
|
||||||
|
|
406
Doxyfile
406
Doxyfile
|
@ -1,406 +0,0 @@
|
||||||
# Doxyfile 1.9.8
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Project related configuration options
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
DOXYFILE_ENCODING = UTF-8
|
|
||||||
PROJECT_NAME = "OKO Weatherstation"
|
|
||||||
PROJECT_NUMBER =
|
|
||||||
PROJECT_BRIEF =
|
|
||||||
PROJECT_LOGO =
|
|
||||||
OUTPUT_DIRECTORY = doxygen
|
|
||||||
CREATE_SUBDIRS = NO
|
|
||||||
CREATE_SUBDIRS_LEVEL = 8
|
|
||||||
ALLOW_UNICODE_NAMES = NO
|
|
||||||
OUTPUT_LANGUAGE = English
|
|
||||||
BRIEF_MEMBER_DESC = YES
|
|
||||||
REPEAT_BRIEF = YES
|
|
||||||
ABBREVIATE_BRIEF = "The $name class" \
|
|
||||||
"The $name widget" \
|
|
||||||
"The $name file" \
|
|
||||||
is \
|
|
||||||
provides \
|
|
||||||
specifies \
|
|
||||||
contains \
|
|
||||||
represents \
|
|
||||||
a \
|
|
||||||
an \
|
|
||||||
the
|
|
||||||
ALWAYS_DETAILED_SEC = NO
|
|
||||||
INLINE_INHERITED_MEMB = NO
|
|
||||||
FULL_PATH_NAMES = YES
|
|
||||||
STRIP_FROM_PATH =
|
|
||||||
STRIP_FROM_INC_PATH =
|
|
||||||
SHORT_NAMES = NO
|
|
||||||
JAVADOC_AUTOBRIEF = NO
|
|
||||||
JAVADOC_BANNER = NO
|
|
||||||
QT_AUTOBRIEF = NO
|
|
||||||
MULTILINE_CPP_IS_BRIEF = NO
|
|
||||||
PYTHON_DOCSTRING = YES
|
|
||||||
INHERIT_DOCS = YES
|
|
||||||
SEPARATE_MEMBER_PAGES = NO
|
|
||||||
TAB_SIZE = 4
|
|
||||||
ALIASES =
|
|
||||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
|
||||||
OPTIMIZE_OUTPUT_JAVA = NO
|
|
||||||
OPTIMIZE_FOR_FORTRAN = NO
|
|
||||||
OPTIMIZE_OUTPUT_VHDL = NO
|
|
||||||
OPTIMIZE_OUTPUT_SLICE = NO
|
|
||||||
EXTENSION_MAPPING = ino=C++
|
|
||||||
MARKDOWN_SUPPORT = YES
|
|
||||||
TOC_INCLUDE_HEADINGS = 5
|
|
||||||
MARKDOWN_ID_STYLE = DOXYGEN
|
|
||||||
AUTOLINK_SUPPORT = YES
|
|
||||||
BUILTIN_STL_SUPPORT = NO
|
|
||||||
CPP_CLI_SUPPORT = NO
|
|
||||||
SIP_SUPPORT = NO
|
|
||||||
IDL_PROPERTY_SUPPORT = YES
|
|
||||||
DISTRIBUTE_GROUP_DOC = NO
|
|
||||||
GROUP_NESTED_COMPOUNDS = NO
|
|
||||||
SUBGROUPING = YES
|
|
||||||
INLINE_GROUPED_CLASSES = NO
|
|
||||||
INLINE_SIMPLE_STRUCTS = NO
|
|
||||||
TYPEDEF_HIDES_STRUCT = NO
|
|
||||||
LOOKUP_CACHE_SIZE = 0
|
|
||||||
NUM_PROC_THREADS = 1
|
|
||||||
TIMESTAMP = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Build related configuration options
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
EXTRACT_ALL = YES
|
|
||||||
EXTRACT_PRIVATE = NO
|
|
||||||
EXTRACT_PRIV_VIRTUAL = NO
|
|
||||||
EXTRACT_PACKAGE = NO
|
|
||||||
EXTRACT_STATIC = NO
|
|
||||||
EXTRACT_LOCAL_CLASSES = YES
|
|
||||||
EXTRACT_LOCAL_METHODS = NO
|
|
||||||
EXTRACT_ANON_NSPACES = NO
|
|
||||||
RESOLVE_UNNAMED_PARAMS = YES
|
|
||||||
HIDE_UNDOC_MEMBERS = NO
|
|
||||||
HIDE_UNDOC_CLASSES = NO
|
|
||||||
HIDE_FRIEND_COMPOUNDS = NO
|
|
||||||
HIDE_IN_BODY_DOCS = NO
|
|
||||||
INTERNAL_DOCS = NO
|
|
||||||
CASE_SENSE_NAMES = SYSTEM
|
|
||||||
HIDE_SCOPE_NAMES = NO
|
|
||||||
HIDE_COMPOUND_REFERENCE= NO
|
|
||||||
SHOW_HEADERFILE = YES
|
|
||||||
SHOW_INCLUDE_FILES = YES
|
|
||||||
SHOW_GROUPED_MEMB_INC = NO
|
|
||||||
FORCE_LOCAL_INCLUDES = NO
|
|
||||||
INLINE_INFO = YES
|
|
||||||
SORT_MEMBER_DOCS = YES
|
|
||||||
SORT_BRIEF_DOCS = NO
|
|
||||||
SORT_MEMBERS_CTORS_1ST = NO
|
|
||||||
SORT_GROUP_NAMES = NO
|
|
||||||
SORT_BY_SCOPE_NAME = NO
|
|
||||||
STRICT_PROTO_MATCHING = NO
|
|
||||||
GENERATE_TODOLIST = YES
|
|
||||||
GENERATE_TESTLIST = YES
|
|
||||||
GENERATE_BUGLIST = YES
|
|
||||||
GENERATE_DEPRECATEDLIST= YES
|
|
||||||
ENABLED_SECTIONS =
|
|
||||||
MAX_INITIALIZER_LINES = 30
|
|
||||||
SHOW_USED_FILES = YES
|
|
||||||
SHOW_FILES = YES
|
|
||||||
SHOW_NAMESPACES = YES
|
|
||||||
FILE_VERSION_FILTER =
|
|
||||||
LAYOUT_FILE =
|
|
||||||
CITE_BIB_FILES =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to warning and progress messages
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
QUIET = NO
|
|
||||||
WARNINGS = YES
|
|
||||||
WARN_IF_UNDOCUMENTED = YES
|
|
||||||
WARN_IF_DOC_ERROR = YES
|
|
||||||
WARN_IF_INCOMPLETE_DOC = YES
|
|
||||||
WARN_NO_PARAMDOC = NO
|
|
||||||
WARN_IF_UNDOC_ENUM_VAL = NO
|
|
||||||
WARN_AS_ERROR = NO
|
|
||||||
WARN_FORMAT = "$file:$line: $text"
|
|
||||||
WARN_LINE_FORMAT = "at line $line of file $file"
|
|
||||||
WARN_LOGFILE =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the input files
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
INPUT = firmware
|
|
||||||
INPUT_ENCODING = UTF-8
|
|
||||||
INPUT_FILE_ENCODING =
|
|
||||||
FILE_PATTERNS = *.c \
|
|
||||||
*.cc \
|
|
||||||
*.cxx \
|
|
||||||
*.cxxm \
|
|
||||||
*.cpp \
|
|
||||||
*.cppm \
|
|
||||||
*.c++ \
|
|
||||||
*.c++m \
|
|
||||||
*.java \
|
|
||||||
*.ii \
|
|
||||||
*.ixx \
|
|
||||||
*.ipp \
|
|
||||||
*.ino \
|
|
||||||
*.i++ \
|
|
||||||
*.inl \
|
|
||||||
*.idl \
|
|
||||||
*.ddl \
|
|
||||||
*.odl \
|
|
||||||
*.h \
|
|
||||||
*.hh \
|
|
||||||
*.hxx \
|
|
||||||
*.hpp \
|
|
||||||
*.h++ \
|
|
||||||
*.ixx \
|
|
||||||
*.l \
|
|
||||||
*.cs \
|
|
||||||
*.d \
|
|
||||||
*.php \
|
|
||||||
*.php4 \
|
|
||||||
*.php5 \
|
|
||||||
*.phtml \
|
|
||||||
*.inc \
|
|
||||||
*.m \
|
|
||||||
*.markdown \
|
|
||||||
*.md \
|
|
||||||
*.mm \
|
|
||||||
*.dox \
|
|
||||||
*.py \
|
|
||||||
*.pyw \
|
|
||||||
*.f90 \
|
|
||||||
*.f95 \
|
|
||||||
*.f03 \
|
|
||||||
*.f08 \
|
|
||||||
*.f18 \
|
|
||||||
*.f \
|
|
||||||
*.for \
|
|
||||||
*.vhd \
|
|
||||||
*.vhdl \
|
|
||||||
*.ucf \
|
|
||||||
*.qsf \
|
|
||||||
*.ice
|
|
||||||
RECURSIVE = YES
|
|
||||||
EXCLUDE =
|
|
||||||
EXCLUDE_SYMLINKS = NO
|
|
||||||
EXCLUDE_PATTERNS =
|
|
||||||
EXCLUDE_SYMBOLS =
|
|
||||||
EXAMPLE_PATH =
|
|
||||||
EXAMPLE_PATTERNS = *
|
|
||||||
EXAMPLE_RECURSIVE = NO
|
|
||||||
IMAGE_PATH =
|
|
||||||
INPUT_FILTER =
|
|
||||||
FILTER_PATTERNS =
|
|
||||||
FILTER_SOURCE_FILES = NO
|
|
||||||
FILTER_SOURCE_PATTERNS =
|
|
||||||
USE_MDFILE_AS_MAINPAGE =
|
|
||||||
FORTRAN_COMMENT_AFTER = 72
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to source browsing
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
SOURCE_BROWSER = YES
|
|
||||||
INLINE_SOURCES = NO
|
|
||||||
STRIP_CODE_COMMENTS = YES
|
|
||||||
REFERENCED_BY_RELATION = NO
|
|
||||||
REFERENCES_RELATION = NO
|
|
||||||
REFERENCES_LINK_SOURCE = YES
|
|
||||||
SOURCE_TOOLTIPS = YES
|
|
||||||
USE_HTAGS = NO
|
|
||||||
VERBATIM_HEADERS = YES
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the alphabetical class index
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
ALPHABETICAL_INDEX = YES
|
|
||||||
IGNORE_PREFIX =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the HTML output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_HTML = YES
|
|
||||||
HTML_OUTPUT = html
|
|
||||||
HTML_FILE_EXTENSION = .html
|
|
||||||
HTML_HEADER =
|
|
||||||
HTML_FOOTER =
|
|
||||||
HTML_STYLESHEET =
|
|
||||||
HTML_EXTRA_STYLESHEET =
|
|
||||||
HTML_EXTRA_FILES =
|
|
||||||
HTML_COLORSTYLE = AUTO_LIGHT
|
|
||||||
HTML_COLORSTYLE_HUE = 220
|
|
||||||
HTML_COLORSTYLE_SAT = 100
|
|
||||||
HTML_COLORSTYLE_GAMMA = 80
|
|
||||||
HTML_DYNAMIC_MENUS = YES
|
|
||||||
HTML_DYNAMIC_SECTIONS = NO
|
|
||||||
HTML_CODE_FOLDING = YES
|
|
||||||
HTML_INDEX_NUM_ENTRIES = 100
|
|
||||||
GENERATE_DOCSET = NO
|
|
||||||
DOCSET_FEEDNAME = "Doxygen generated docs"
|
|
||||||
DOCSET_FEEDURL =
|
|
||||||
DOCSET_BUNDLE_ID = org.doxygen.Project
|
|
||||||
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
|
|
||||||
DOCSET_PUBLISHER_NAME = Publisher
|
|
||||||
GENERATE_HTMLHELP = NO
|
|
||||||
CHM_FILE =
|
|
||||||
HHC_LOCATION =
|
|
||||||
GENERATE_CHI = YES
|
|
||||||
CHM_INDEX_ENCODING =
|
|
||||||
BINARY_TOC = NO
|
|
||||||
TOC_EXPAND = NO
|
|
||||||
SITEMAP_URL =
|
|
||||||
GENERATE_QHP = NO
|
|
||||||
QCH_FILE =
|
|
||||||
QHP_NAMESPACE = org.doxygen.Project
|
|
||||||
QHP_VIRTUAL_FOLDER = doc
|
|
||||||
QHP_CUST_FILTER_NAME =
|
|
||||||
QHP_CUST_FILTER_ATTRS =
|
|
||||||
QHP_SECT_FILTER_ATTRS =
|
|
||||||
QHG_LOCATION =
|
|
||||||
GENERATE_ECLIPSEHELP = NO
|
|
||||||
ECLIPSE_DOC_ID = org.doxygen.Project
|
|
||||||
DISABLE_INDEX = NO
|
|
||||||
GENERATE_TREEVIEW = YES
|
|
||||||
FULL_SIDEBAR = YES
|
|
||||||
ENUM_VALUES_PER_LINE = 4
|
|
||||||
TREEVIEW_WIDTH = 250
|
|
||||||
EXT_LINKS_IN_WINDOW = NO
|
|
||||||
OBFUSCATE_EMAILS = YES
|
|
||||||
HTML_FORMULA_FORMAT = png
|
|
||||||
FORMULA_FONTSIZE = 10
|
|
||||||
FORMULA_MACROFILE =
|
|
||||||
USE_MATHJAX = NO
|
|
||||||
MATHJAX_VERSION = MathJax_2
|
|
||||||
MATHJAX_FORMAT = HTML-CSS
|
|
||||||
MATHJAX_RELPATH =
|
|
||||||
MATHJAX_EXTENSIONS =
|
|
||||||
MATHJAX_CODEFILE =
|
|
||||||
SEARCHENGINE = YES
|
|
||||||
SERVER_BASED_SEARCH = NO
|
|
||||||
EXTERNAL_SEARCH = NO
|
|
||||||
SEARCHENGINE_URL =
|
|
||||||
SEARCHDATA_FILE = searchdata.xml
|
|
||||||
EXTERNAL_SEARCH_ID =
|
|
||||||
EXTRA_SEARCH_MAPPINGS =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the LaTeX output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_LATEX = NO
|
|
||||||
LATEX_OUTPUT = latex
|
|
||||||
LATEX_CMD_NAME =
|
|
||||||
MAKEINDEX_CMD_NAME = makeindex
|
|
||||||
LATEX_MAKEINDEX_CMD = makeindex
|
|
||||||
COMPACT_LATEX = NO
|
|
||||||
PAPER_TYPE = a4
|
|
||||||
EXTRA_PACKAGES =
|
|
||||||
LATEX_HEADER =
|
|
||||||
LATEX_FOOTER =
|
|
||||||
LATEX_EXTRA_STYLESHEET =
|
|
||||||
LATEX_EXTRA_FILES =
|
|
||||||
PDF_HYPERLINKS = YES
|
|
||||||
USE_PDFLATEX = YES
|
|
||||||
LATEX_BATCHMODE = NO
|
|
||||||
LATEX_HIDE_INDICES = NO
|
|
||||||
LATEX_BIB_STYLE = plain
|
|
||||||
LATEX_EMOJI_DIRECTORY =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the RTF output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_RTF = NO
|
|
||||||
RTF_OUTPUT = rtf
|
|
||||||
COMPACT_RTF = NO
|
|
||||||
RTF_HYPERLINKS = NO
|
|
||||||
RTF_STYLESHEET_FILE =
|
|
||||||
RTF_EXTENSIONS_FILE =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the man page output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_MAN = NO
|
|
||||||
MAN_OUTPUT = man
|
|
||||||
MAN_EXTENSION = .3
|
|
||||||
MAN_SUBDIR =
|
|
||||||
MAN_LINKS = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the XML output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_XML = NO
|
|
||||||
XML_OUTPUT = xml
|
|
||||||
XML_PROGRAMLISTING = YES
|
|
||||||
XML_NS_MEMB_FILE_SCOPE = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the DOCBOOK output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_DOCBOOK = NO
|
|
||||||
DOCBOOK_OUTPUT = docbook
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options for the AutoGen Definitions output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_AUTOGEN_DEF = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to Sqlite3 output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_SQLITE3 = NO
|
|
||||||
SQLITE3_OUTPUT = sqlite3
|
|
||||||
SQLITE3_RECREATE_DB = YES
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the Perl module output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_PERLMOD = NO
|
|
||||||
PERLMOD_LATEX = NO
|
|
||||||
PERLMOD_PRETTY = YES
|
|
||||||
PERLMOD_MAKEVAR_PREFIX =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the preprocessor
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
ENABLE_PREPROCESSING = YES
|
|
||||||
MACRO_EXPANSION = NO
|
|
||||||
EXPAND_ONLY_PREDEF = NO
|
|
||||||
SEARCH_INCLUDES = YES
|
|
||||||
INCLUDE_PATH =
|
|
||||||
INCLUDE_FILE_PATTERNS =
|
|
||||||
PREDEFINED =
|
|
||||||
EXPAND_AS_DEFINED =
|
|
||||||
SKIP_FUNCTION_MACROS = YES
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to external references
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
TAGFILES =
|
|
||||||
GENERATE_TAGFILE =
|
|
||||||
ALLEXTERNALS = NO
|
|
||||||
EXTERNAL_GROUPS = YES
|
|
||||||
EXTERNAL_PAGES = YES
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to diagram generator tools
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
HIDE_UNDOC_RELATIONS = YES
|
|
||||||
HAVE_DOT = YES
|
|
||||||
DOT_NUM_THREADS = 2
|
|
||||||
DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
|
|
||||||
DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
|
|
||||||
DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
|
|
||||||
DOT_FONTPATH =
|
|
||||||
CLASS_GRAPH = YES
|
|
||||||
COLLABORATION_GRAPH = YES
|
|
||||||
GROUP_GRAPHS = YES
|
|
||||||
UML_LOOK = YES
|
|
||||||
UML_LIMIT_NUM_FIELDS = 10
|
|
||||||
DOT_UML_DETAILS = YES
|
|
||||||
DOT_WRAP_THRESHOLD = 17
|
|
||||||
TEMPLATE_RELATIONS = NO
|
|
||||||
INCLUDE_GRAPH = YES
|
|
||||||
INCLUDED_BY_GRAPH = YES
|
|
||||||
CALL_GRAPH = YES
|
|
||||||
CALLER_GRAPH = YES
|
|
||||||
GRAPHICAL_HIERARCHY = YES
|
|
||||||
DIRECTORY_GRAPH = YES
|
|
||||||
DIR_GRAPH_MAX_DEPTH = 1
|
|
||||||
DOT_IMAGE_FORMAT = png
|
|
||||||
INTERACTIVE_SVG = NO
|
|
||||||
DOT_PATH =
|
|
||||||
DOTFILE_DIRS =
|
|
||||||
DIA_PATH =
|
|
||||||
DIAFILE_DIRS =
|
|
||||||
PLANTUML_JAR_PATH =
|
|
||||||
PLANTUML_CFG_FILE =
|
|
||||||
PLANTUML_INCLUDE_PATH =
|
|
||||||
DOT_GRAPH_MAX_NODES = 50
|
|
||||||
MAX_DOT_GRAPH_DEPTH = 0
|
|
||||||
DOT_MULTI_TARGETS = NO
|
|
||||||
GENERATE_LEGEND = YES
|
|
||||||
DOT_CLEANUP = YES
|
|
||||||
MSCGEN_TOOL =
|
|
||||||
MSCFILE_DIRS =
|
|
20
firmware/.vscode/c_cpp_properties.json
vendored
20
firmware/.vscode/c_cpp_properties.json
vendored
|
@ -1,20 +0,0 @@
|
||||||
{
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "Mac",
|
|
||||||
"includePath": [
|
|
||||||
"${workspaceFolder}/**",
|
|
||||||
"/Users/klaute/Documents/Arduino/libraries"
|
|
||||||
],
|
|
||||||
"defines": [],
|
|
||||||
"macFrameworkPath": [
|
|
||||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
|
|
||||||
],
|
|
||||||
"compilerPath": "/usr/bin/clang",
|
|
||||||
"cStandard": "c17",
|
|
||||||
"cppStandard": "c++17",
|
|
||||||
"intelliSenseMode": "macos-clang-arm64"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"version": 4
|
|
||||||
}
|
|
|
@ -3,25 +3,18 @@
|
||||||
|
|
||||||
// config general setting and behavior of the weatherstation
|
// config general setting and behavior of the weatherstation
|
||||||
|
|
||||||
#define VERSION_STRING "1.1.5"
|
#define WIFI_AUTOCONNECT_TIMEOUT_S 120
|
||||||
|
|
||||||
#define WIFI_AUTOCONNECT_TIMEOUT_S 60
|
|
||||||
#define WIFI_CONFIG_PORTAL_TIMEOUT_S 120
|
#define WIFI_CONFIG_PORTAL_TIMEOUT_S 120
|
||||||
#define UPDATE_SENSOR_INTERVAL_S 300
|
#define UPDATE_SENSOR_INTERVAL_S 300
|
||||||
#define UPDATE_WEBSERVER_INTVERVAL_MS 500 // Values greater than 1000 will negative affect availability of the webinterface
|
#define UPDATE_WEBSERVER_INTVERVAL_S 1 // Do not change, bigger values will prevent using webupdater webinterface
|
||||||
#define DELAY_LOOP_MS 50
|
#define DELAY_LOOP_MS 50
|
||||||
#define POWERSAVING_SLEEP_S 600
|
#define POWERSAVING_SLEEP_S 600
|
||||||
#define EMERGENCY_SLEEP_S 172800 // Sleep for 2 days to recover
|
#define EMERGENCY_SLEEP_S 172800 // Sleep for 2 days to recover
|
||||||
#define RESET_ESP_TIME_INTERVAL_MS (60*60*12*1000) // reset every 12 hours
|
#define RESET_ESP_TIME_INTERVAL_MS 3600000
|
||||||
#define WIND_SENSOR_MEAS_TIME_S 15
|
#define WIND_SENSOR_MEAS_TIME_S 15
|
||||||
#define WIND_SPEED_MEAS_NO_ISR_TIME_MS 50
|
#define INITIAL_WEBSERVER_TIME 20
|
||||||
#define WATCHDOG_TIMEOUT_MS WDTO_8S // Look at Esp.h for further possible time declarations
|
|
||||||
#define WIFI_CHECK_INTERVAL_MS 120000
|
|
||||||
#define INFLUXDB_TIMEOUT_MS 1000
|
|
||||||
#define WEB_LOGGER_UPDATE_S 5
|
|
||||||
|
|
||||||
#define ENERGY_SAVING_ITERATIONS 30
|
#define ENERGY_SAVING_ITERATIONS 30
|
||||||
|
|
||||||
#define WIFI_MINIMUM_SIGNAL_QUALITY 10 // percent
|
#define WIFI_MINIMUM_SIGNAL_QUALITY 10 // percent
|
||||||
|
|
||||||
#define BAT_LOW_VOLTAGE 3.6
|
#define BAT_LOW_VOLTAGE 3.6
|
||||||
|
@ -46,10 +39,6 @@
|
||||||
#define BME_CS 10
|
#define BME_CS 10
|
||||||
#define BME_ADDRESS 0x76
|
#define BME_ADDRESS 0x76
|
||||||
|
|
||||||
#define BMP_ADDRESS 0x76
|
|
||||||
|
|
||||||
#define SERIAL_BAUD_RATE 115200
|
|
||||||
|
|
||||||
#define WEB_UPDATER_HTTP_PORT 8080
|
#define WEB_UPDATER_HTTP_PORT 8080
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Copy this file to config_user.h and adjust it to your needs.
|
// Copy this file to config_user.h and adjust it to your needs.
|
||||||
|
|
||||||
|
|
||||||
#ifndef __CONFIG_USER_H__
|
#ifndef __CONFIG_USER_H__
|
||||||
#define __CONFIG_USER_H__
|
#define __CONFIG_USER_H__
|
||||||
|
|
||||||
|
@ -11,65 +12,31 @@
|
||||||
// maybe have a TOO LONG SSID!
|
// maybe have a TOO LONG SSID!
|
||||||
String DEVICE_NAME = "weatherstation";
|
String DEVICE_NAME = "weatherstation";
|
||||||
|
|
||||||
/********************************************************************************/
|
// Enable/Disable features
|
||||||
|
//#define WEBUPDATER_FEATURE
|
||||||
// Enable/Disable general features
|
|
||||||
#define BATTERY_POWERED
|
|
||||||
|
|
||||||
// retries to connect after 5 seconds or starts the wifimanager
|
|
||||||
//#define SLEEP_IF_NO_WLAN_CONNECTION
|
|
||||||
|
|
||||||
#define INFLUXDB_FEATURE
|
#define INFLUXDB_FEATURE
|
||||||
#define INFLUXDB_VERSION 1 // 1 or 2
|
#define INFLUXDB_VERSION 1 // 1 or 2
|
||||||
//#define LOG_MILLIS_TO_INFLUXDB
|
#define SERIAL_FEATURE
|
||||||
|
//#define BATTERY_POWERED
|
||||||
//#define SERIAL_FEATURE
|
//#define SENSOR_WIND
|
||||||
|
|
||||||
#define SENSOR_WIND
|
|
||||||
//#define SENSOR_WIND_NO_ISR // enable in case that the ISR shoud not be used to measure wind speed
|
|
||||||
|
|
||||||
#define SENSOR_APDS9960
|
#define SENSOR_APDS9960
|
||||||
//#define SENSOR_APDS9930
|
//#define SENSOR_APDS9930
|
||||||
#define SENSOR_BME280
|
#define SENSOR_BME280
|
||||||
//#define SENSOR_BMP280
|
|
||||||
#define SENSOR_BATTERY
|
#define SENSOR_BATTERY
|
||||||
//#define SENSOR_USB_VOLTAGE
|
|
||||||
|
|
||||||
//#define BAT_PINS_D34
|
//#define BAT_PINS_D34
|
||||||
|
// Homebridge Webstat is only possible if webupdater is also enabled
|
||||||
/********************************************************************************/
|
|
||||||
// not available or recommended for battery mode
|
|
||||||
/********************************************************************************/
|
|
||||||
|
|
||||||
//#define DISABLE_WIFIMANAGER
|
|
||||||
// Restarts the firmware every n seconds
|
|
||||||
//#define RESET_ESP_TIME_INTERVAL
|
|
||||||
//#define ENABLE_WATCHDOG
|
|
||||||
//#define WEBUPDATER_FEATURE
|
|
||||||
// only available in case that webupdater is enabled
|
|
||||||
//#define USE_LOGGER
|
|
||||||
// only possible if webupdater is also enabled
|
|
||||||
//#define HOMEBRIDGE_WEBSTAT
|
//#define HOMEBRIDGE_WEBSTAT
|
||||||
// for debugging windspeed measurement only, trigger and results are handled by webupdater
|
// retries to connect after 5 seconds or starts the wifimanager
|
||||||
//#define DEBUG_WINDSPEED_MEASUREMENT
|
#define SLEEP_IF_NO_WLAN_CONNECTION
|
||||||
//#define HTTP_CALL_ON_WINDSPEED_EXCEED
|
// Restarts the firmware every n seconds
|
||||||
//#define HTTP_CALL_SEND_JSON_DATA
|
//#define RESET_ESP_TIMEINTERVAL // BETA STATUS
|
||||||
//#define SHOW_SENSOR_DATA_ON_WEBUPDATER_MAIN_PAGE
|
//#define HTTP_CALL_ON_WINDSPEED_EXCEED // BETA STATUS
|
||||||
//#define DEBUG_RESET_REASON
|
|
||||||
#define WEB_RESET
|
|
||||||
//#define ENABLE_PING_HOST_TEST
|
|
||||||
|
|
||||||
/********************************************************************************/
|
|
||||||
|
|
||||||
// measurement correction factors
|
|
||||||
const float HUMIDITY_FACTOR = 1.0;
|
const float HUMIDITY_FACTOR = 1.0;
|
||||||
const float LIGHT_FACTOR = 1.0;
|
const float LIGHT_FACTOR = 1.0;
|
||||||
const float TEMP_FACTOR = 1.0;
|
const float TEMP_FACTOR = 1.0;
|
||||||
|
|
||||||
/********************************************************************************/
|
// InfluxDB credentials
|
||||||
|
|
||||||
|
|
||||||
// InfluxDB1 credentials
|
|
||||||
const char *INFLUXDB_HOST = "hostname";
|
const char *INFLUXDB_HOST = "hostname";
|
||||||
const uint16_t INFLUXDB_PORT = 80;
|
const uint16_t INFLUXDB_PORT = 80;
|
||||||
const char *INFLUXDB_DB = "database";
|
const char *INFLUXDB_DB = "database";
|
||||||
|
@ -82,18 +49,14 @@ const char *INFLUXDB_URL = "http://192.168.0.123:3124";
|
||||||
const char *INFLUXDB_ORG = "home_org";
|
const char *INFLUXDB_ORG = "home_org";
|
||||||
const char *INFLUXDB_BUCKET = "mybucket";
|
const char *INFLUXDB_BUCKET = "mybucket";
|
||||||
const char *INFLUXDB_TOKEN = "your api token";
|
const char *INFLUXDB_TOKEN = "your api token";
|
||||||
|
*/
|
||||||
/********************************************************************************/
|
|
||||||
|
|
||||||
// enable HTTP_CALL_ON_WINDSPEED_EXCEED to enable this feature
|
// enable HTTP_CALL_ON_WINDSPEED_EXCEED to enable this feature
|
||||||
#define HTTP_CALL_ON_WINDSPEED_EXCEED_MPS 5.0 // 5.0 m/s == 18 km/h
|
#define HTTP_CALL_ON_WINDSPEED_EXCEED_MPS 5.0 // 5.0 m/s == 18 km/h
|
||||||
#define HTTP_CALL_ON_WINDSPEED_INTERVAL_S 60 // it's required to be bigger than WIND_SENSOR_MEAS_TIME_S
|
#define HTTP_CALL_ON_WINDSPEED_INTERVAL_S 60 // it's required to be bigger than WIND_SENSOR_MEAS_TIME_S
|
||||||
#define HTTP_CALL_ON_WINDSPEED_URL "http://192.168.178.100:3001/button-windspeedexceed?event=click"
|
#define HTTP_CALL_ON_WINDSPEED_URL "http://192.168.178.100:3001/button-windspeedexceed?event=click"
|
||||||
|
|
||||||
#define HTTP_CALL_SEND_JSON_DATA_INTERVAL_S 300
|
// anemometer settings, to use enable SENSOR_WIND
|
||||||
#define HTTP_CALL_SEND_JSON_DATA_URL "http://192.168.178.123:80/html/index.html?json_weather_data="
|
|
||||||
|
|
||||||
// anemometer settings
|
|
||||||
// thingiverse anemometer settings: https://www.thingiverse.com/thing:2559929/files
|
// thingiverse anemometer settings: https://www.thingiverse.com/thing:2559929/files
|
||||||
#define ROTOR_LENGTH_CM 8.25
|
#define ROTOR_LENGTH_CM 8.25
|
||||||
#define ROTOR_LENGTH_M (ROTOR_LENGTH_CM / 100.0)
|
#define ROTOR_LENGTH_M (ROTOR_LENGTH_CM / 100.0)
|
||||||
|
@ -109,22 +72,5 @@ const char *INFLUXDB_TOKEN = "your api token";
|
||||||
// china aliexpress anemometer settings (calculation unknown) <add link here>
|
// china aliexpress anemometer settings (calculation unknown) <add link here>
|
||||||
//#define WINDSPEED_FACTOR 2.4
|
//#define WINDSPEED_FACTOR 2.4
|
||||||
|
|
||||||
/********************************************************************************/
|
|
||||||
|
|
||||||
#define PING_HOST_IP "192.168.178.1"
|
|
||||||
|
|
||||||
#ifdef DISABLE_WIFIMANAGER
|
|
||||||
// Set your Static IP address
|
|
||||||
IPAddress local_IP(192, 168, 178, 123);
|
|
||||||
// Set your Gateway IP address
|
|
||||||
IPAddress gateway(192, 168, 178, 1);
|
|
||||||
// Set subnet mask
|
|
||||||
IPAddress subnet(255, 255, 255, 0);
|
|
||||||
|
|
||||||
#define WIFI_SSID "myWifi" // WLAN Netzwerk
|
|
||||||
#define WIFI_PASSWD "myPass" // WLAN Passwort
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/********************************************************************************/
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#define SENSOR_LIGHT 2
|
#define SENSOR_LIGHT 2
|
||||||
#define SENSOR_WINDSPEED 3
|
#define SENSOR_WINDSPEED 3
|
||||||
#define SENSOR_PRESSURE 4
|
#define SENSOR_PRESSURE 4
|
||||||
#define SENSOR_VOLTAGE 5
|
#define SENSOR_BAT_VOLTAGE 5
|
||||||
#define SENSOR_ESAVEMODE 6
|
#define SENSOR_ESAVEMODE 6
|
||||||
#define SENSOR_BATCHARGESTATE 7
|
#define SENSOR_BATCHARGESTATE 7
|
||||||
|
|
||||||
|
@ -17,28 +17,4 @@
|
||||||
#define ENERGY_SAVE_MODE_ENABLED 1.0
|
#define ENERGY_SAVE_MODE_ENABLED 1.0
|
||||||
#define ENERGY_SAVE_MODE_DISABLED 0.0
|
#define ENERGY_SAVE_MODE_DISABLED 0.0
|
||||||
|
|
||||||
#define FSM_STATE_1 0
|
|
||||||
#define FSM_STATE_2 1
|
|
||||||
#define FSM_STATE_3 2
|
|
||||||
#define FSM_STATE_4 3
|
|
||||||
#define FSM_STATE_5 4
|
|
||||||
#define FSM_STATE_6 5
|
|
||||||
#define FSM_STATE_7 6
|
|
||||||
#define FSM_STATE_8 7
|
|
||||||
#define FSM_STATE_9 8
|
|
||||||
#define FSM_STATE_10 9
|
|
||||||
#define FSM_STATE_11 10
|
|
||||||
#define FSM_STATE_12 11
|
|
||||||
|
|
||||||
const String hb_ws_msg_start = "{";
|
|
||||||
const String hb_ws_msg_temp = "\"temperature\": ";
|
|
||||||
const String hb_ws_msg_humi = "\"humidity\": ";
|
|
||||||
const String hb_ws_msg_light = "\"lightlevel\": ";
|
|
||||||
const String hb_ws_msg_windspeed = "\"windspeed\": ";
|
|
||||||
const String hb_ws_msg_pressure = "\"pressure\": ";
|
|
||||||
const String hb_ws_msg_voltage = "\"voltage\": ";
|
|
||||||
const String hb_ws_msg_timestamp = "\"timestamp\": ";
|
|
||||||
const String hb_ws_msg_valid = "\"valid\": ";
|
|
||||||
const String hb_ws_msg_end = "}";
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
|
|
||||||
#include <EEPROM.h>
|
|
||||||
|
|
||||||
#define EEPROM_SIZE 512
|
|
||||||
|
|
||||||
int eeprom_read(int addr) {
|
|
||||||
int ret = -255;
|
|
||||||
EEPROM.begin(EEPROM_SIZE);
|
|
||||||
EEPROM.get(addr, ret);
|
|
||||||
EEPROM.commit();
|
|
||||||
EEPROM.end();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void eeprom_write(int addr, int data) {
|
|
||||||
EEPROM.begin(EEPROM_SIZE);
|
|
||||||
EEPROM.put(addr, data);
|
|
||||||
EEPROM.commit();
|
|
||||||
EEPROM.end();
|
|
||||||
}
|
|
|
@ -1,34 +1,19 @@
|
||||||
// Standard ESP8266 libs from project folder
|
// Standard ESP8266 libs from project folder
|
||||||
#include <ESP8266mDNS.h>
|
#include <ESP8266mDNS.h>
|
||||||
|
#include <ESP8266HTTPUpdateServer.h>
|
||||||
#include <ESP8266WiFi.h>
|
#include <ESP8266WiFi.h>
|
||||||
#include <ESP8266WiFiType.h>
|
#include <DNSServer.h>
|
||||||
|
#include <ESP8266WebServer.h>
|
||||||
|
#include <ESP8266HTTPClient.h>
|
||||||
|
|
||||||
#include <esp.h>
|
|
||||||
#include <user_interface.h>
|
|
||||||
#include <WiFiClient.h> // WiFiClient
|
#include <WiFiClient.h> // WiFiClient
|
||||||
|
#include <WiFiManager.h> // WiFiManager from bib manager
|
||||||
|
|
||||||
// Project includes
|
// Project includes
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "config_user.h"
|
#include "config_user.h"
|
||||||
|
|
||||||
#ifdef ENABLE_PING_HOST_TEST
|
|
||||||
#include <ESP8266Ping.h> // https://github.com/dancol90/ESP8266Ping
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef DISABLE_WIFIMANAGER
|
|
||||||
#include <WiFiManager.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HTTP_CALL_ON_WINDSPEED_EXCEED
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HTTP_CALL_SEND_JSON_DATA
|
|
||||||
#include <ESP8266HTTPClient.h>
|
|
||||||
#include <UrlEncode.h> // from bib manager UrlEncode 1.0.0 by Masayuki
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//*************************************************************************//
|
//*************************************************************************//
|
||||||
// check if some settings are correct
|
// check if some settings are correct
|
||||||
|
|
||||||
|
@ -41,56 +26,30 @@
|
||||||
//*************************************************************************//
|
//*************************************************************************//
|
||||||
// constant variables
|
// constant variables
|
||||||
|
|
||||||
const uint8_t VALUES = 8; // see constants.h file - count of number of SENSOR_ defines
|
const uint8_t VALUES = 8;
|
||||||
float currentSensorData[VALUES] = { nanf("no value"), nanf("no value"), nanf("no value"),
|
float currentSensorData[VALUES] = {nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value")};
|
||||||
nanf("no value"), nanf("no value"), nanf("no value"),
|
float (*sensors[VALUES])() = {};
|
||||||
nanf("no value"), nanf("no value")
|
|
||||||
};
|
|
||||||
|
|
||||||
uint32_t update_sensor_cnt = 0;
|
uint16_t update_sensor_cnt = 0;
|
||||||
uint32_t update_webserver_cnt = 0;
|
uint16_t update_webserver_cnt = 0;
|
||||||
uint32_t update_windspeed_exceed_cnt = 0;
|
uint16_t update_windspeed_exceed_cnt = 0;
|
||||||
uint32_t wifi_check_interval_counter = 0;
|
|
||||||
uint32_t http_call_send_json_data_cnt = 0;
|
|
||||||
|
|
||||||
#ifndef DISABLE_WIFIMANAGER
|
|
||||||
const String wifiName = "oko-weather-" + DEVICE_NAME;
|
|
||||||
|
|
||||||
WiFiManager wifiManager;
|
WiFiManager wifiManager;
|
||||||
#endif
|
|
||||||
|
|
||||||
uint8_t fsm_state = FSM_STATE_1;
|
|
||||||
|
|
||||||
uint8_t sensor_cnt = 0;
|
|
||||||
|
|
||||||
boolean validData = false;
|
|
||||||
|
|
||||||
boolean do_not_read_windsensor = false;
|
|
||||||
|
|
||||||
uint32_t wifi_reconnect_cnt = 0;
|
|
||||||
|
|
||||||
//*************************************************************************//
|
//*************************************************************************//
|
||||||
|
|
||||||
void debug(String x) {
|
void debug(String x)
|
||||||
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Serial.println(x);
|
Serial.println(x);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_LOGGER
|
|
||||||
logdata(String(millis()) + ":" + x);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//*************************************************************************//
|
void setup()
|
||||||
|
{
|
||||||
|
|
||||||
void setup() {
|
#if defined(DEBUG) || defined(SERIAL_FEATURE)
|
||||||
|
Serial.begin(115200);
|
||||||
#ifdef ENABLE_WATCHDOG
|
|
||||||
//wdt_disable();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(DEBUG) || defined(SERIAL_FEATURE) || defined(DEBUG_RESET_REASON)
|
|
||||||
Serial.begin(SERIAL_BAUD_RATE);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Pin settings
|
// Pin settings
|
||||||
|
@ -100,7 +59,7 @@ void setup() {
|
||||||
pinMode(ANEMOMETER_PIN, INPUT_PULLUP);
|
pinMode(ANEMOMETER_PIN, INPUT_PULLUP);
|
||||||
pinMode(A0, INPUT);
|
pinMode(A0, INPUT);
|
||||||
|
|
||||||
digitalWrite(STATUS_LED_PIN, HIGH);
|
digitalWrite(STATUS_LED_PIN, LOW);
|
||||||
|
|
||||||
#ifndef BAT_PINS_D34
|
#ifndef BAT_PINS_D34
|
||||||
debug("D5 D6 used as battery pins");
|
debug("D5 D6 used as battery pins");
|
||||||
|
@ -112,26 +71,91 @@ void setup() {
|
||||||
criticalBatCheck();
|
criticalBatCheck();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wifiConnect();
|
// Establish WiFi connection
|
||||||
|
String wifiName = "oko-weather-" + DEVICE_NAME;
|
||||||
|
|
||||||
|
wifiManager.setMinimumSignalQuality(WIFI_MINIMUM_SIGNAL_QUALITY);
|
||||||
|
// the time in seconds to wait for the known wifi connection
|
||||||
|
wifiManager.setConnectTimeout(WIFI_AUTOCONNECT_TIMEOUT_S);
|
||||||
|
// the time in seconds to wait for the user to configure the device
|
||||||
|
wifiManager.setTimeout(WIFI_CONFIG_PORTAL_TIMEOUT_S);
|
||||||
|
|
||||||
|
while (!wifiManager.autoConnect(wifiName.c_str(), "DEADBEEF"))
|
||||||
|
{
|
||||||
|
debug("WiFi connection failed, try again in 5 seconds...");
|
||||||
|
// If autoconnect to WLAN failed and no client connected, go to deep sleep
|
||||||
|
#ifdef SLEEP_IF_NO_WLAN_CONNECTION
|
||||||
|
ESP.deepSleep(POWERSAVING_SLEEP_S * 1000000, WAKE_RF_DEFAULT);
|
||||||
|
delay(100);
|
||||||
|
#endif
|
||||||
|
#ifndef SLEEP_IF_NO_WLAN_CONNECTION
|
||||||
|
// sleep a few seconds and go on trying to connect
|
||||||
|
delay(5000);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
debug("Connected!");
|
debug("Connected!");
|
||||||
|
|
||||||
initWifiBasedSW();
|
#ifdef INFLUXDB_FEATURE
|
||||||
|
influxdb_begin();
|
||||||
|
#endif
|
||||||
|
|
||||||
initSensors();
|
// Initialize and configure the sensors
|
||||||
|
#ifdef SENSOR_APDS9930
|
||||||
|
if (sensor_apds9930_begin()) {
|
||||||
|
sensors[SENSOR_LIGHT] = &apds9930_light;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SENSOR_APDS9960
|
||||||
|
if (sensor_apds9960_begin()) {
|
||||||
|
sensors[SENSOR_LIGHT] = &apds9960_light;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SENSOR_BME280
|
||||||
|
//Temperature + pressure
|
||||||
|
if (sensor_bme280_begin(BME_ADDRESS)) {
|
||||||
|
sensors[SENSOR_TEMPERATURE] = &bme280_temperature;
|
||||||
|
sensors[SENSOR_HUMIDITY] = &bme280_humidity;
|
||||||
|
sensors[SENSOR_PRESSURE] = &bme280_pressure;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SENSOR_WIND
|
||||||
|
sensors[SENSOR_WINDSPEED] = &wind_speed;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SENSOR_BATTERY
|
||||||
|
sensors[SENSOR_BAT_VOLTAGE] = &battery_voltage;
|
||||||
|
sensors[SENSOR_BATCHARGESTATE] = &battery_charging;
|
||||||
|
sensors[SENSOR_ESAVEMODE] = &isEnergySavingMode;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WEBUPDATER_FEATURE
|
||||||
|
#ifndef BATTERY_POWERED
|
||||||
|
setupWebUpdater(DEVICE_NAME, WiFi.localIP().toString());
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
//It's magic! leave in
|
//It's magic! leave in
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
#ifdef DEBUG_RESET_REASON
|
#ifdef RESET_ESP_TIMEINTERVAL
|
||||||
debugResetReason();
|
// if millis() reached interval (1h) restart ESP
|
||||||
|
if (millis() >= RESET_ESP_TIME_INTERVAL_MS)
|
||||||
|
{
|
||||||
|
debug("Resetting firmware intentionally");
|
||||||
|
// Push reset button after flashing once or do a manual power cycle to get the functionality working.
|
||||||
|
ESP.restart();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BATTERY_POWERED
|
#ifdef BATTERY_POWERED
|
||||||
debug("battery powered");
|
debug("battery powered");
|
||||||
|
_loop();
|
||||||
|
|
||||||
_battery_mode_main();
|
digitalWrite(STATUS_LED_PIN, LOW);
|
||||||
|
|
||||||
digitalWrite(STATUS_LED_PIN, HIGH);
|
|
||||||
|
|
||||||
criticalBatCheck();
|
criticalBatCheck();
|
||||||
|
|
||||||
|
@ -140,524 +164,77 @@ void setup() {
|
||||||
|
|
||||||
debug("deep sleep");
|
debug("deep sleep");
|
||||||
|
|
||||||
// the ESP.deepSleep requires microseconds as input, after the
|
// the ESP.deepSleep requires microseconds as input, after the sleep the system will run into the setup routine
|
||||||
// sleep the system will run into the setup routine
|
|
||||||
ESP.deepSleep(POWERSAVING_SLEEP_S * 1000000, WAKE_RF_DEFAULT);
|
|
||||||
delay(100);
|
|
||||||
|
|
||||||
#else // not in battery mode
|
|
||||||
|
|
||||||
#ifdef ENABLE_WATCHDOG
|
|
||||||
wdt_disable();
|
|
||||||
wdt_reset();
|
|
||||||
// Enable the internal watchdog
|
|
||||||
wdt_enable(WATCHDOG_TIMEOUT_MS);
|
|
||||||
debug("Watchdog enabled");
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
||||||
void initWifiBasedSW() {
|
|
||||||
|
|
||||||
#ifdef INFLUXDB_FEATURE
|
|
||||||
influxdb_begin();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WEBUPDATER_FEATURE
|
|
||||||
#ifndef BATTERY_POWERED
|
|
||||||
setupWebUpdater(DEVICE_NAME, WiFi.localIP().toString());
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
||||||
void initSensors() {
|
|
||||||
// Initialize and configure the sensors
|
|
||||||
#ifdef SENSOR_APDS9930
|
|
||||||
sensor_apds9930_begin();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SENSOR_APDS9960
|
|
||||||
sensor_apds9960_begin();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SENSOR_BME280
|
|
||||||
//Temperature + pressure + humidity
|
|
||||||
sensor_bme280_begin(BME_ADDRESS);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SENSOR_BMP280
|
|
||||||
//Temperature + pressure + humidity
|
|
||||||
sensor_bmp280_begin(BMP_ADDRESS);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
||||||
float readSensors(uint8_t s) {
|
|
||||||
float ret = nan("no value");
|
|
||||||
|
|
||||||
switch (s) {
|
|
||||||
case SENSOR_LIGHT: // Initialize and configure the sensors
|
|
||||||
#ifdef SENSOR_APDS9930
|
|
||||||
ret = apds9930_light();
|
|
||||||
#endif
|
|
||||||
#ifdef SENSOR_APDS9960
|
|
||||||
ret = apds9960_light();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SENSOR_TEMPERATURE:
|
|
||||||
#ifdef SENSOR_BME280
|
|
||||||
ret = bme280_temperature();
|
|
||||||
#endif
|
|
||||||
#ifdef SENSOR_BMP280
|
|
||||||
ret = bmp280_temperature();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SENSOR_HUMIDITY:
|
|
||||||
#ifdef SENSOR_BME280
|
|
||||||
ret = bme280_humidity();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SENSOR_PRESSURE:
|
|
||||||
#ifdef SENSOR_BME280
|
|
||||||
ret = bme280_pressure();
|
|
||||||
#endif
|
|
||||||
#ifdef SENSOR_BMP280
|
|
||||||
ret = bmp280_pressure();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SENSOR_WINDSPEED:
|
|
||||||
#ifdef SENSOR_WIND
|
|
||||||
if (do_not_read_windsensor == false) {
|
|
||||||
ret = wind_speed();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SENSOR_VOLTAGE:
|
|
||||||
#ifdef SENSOR_BATTERY
|
|
||||||
ret = battery_voltage();
|
|
||||||
#endif
|
|
||||||
#ifdef SENSOR_USB_VOLTAGE
|
|
||||||
ret = usb_voltage();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SENSOR_ESAVEMODE:
|
|
||||||
#ifdef SENSOR_BATTERY
|
|
||||||
ret = battery_charging();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SENSOR_BATCHARGESTATE:
|
|
||||||
#ifdef SENSOR_BATTERY
|
|
||||||
ret = isEnergySavingMode();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
||||||
void wifiConnectionCheck() {
|
|
||||||
|
|
||||||
bool success = false;
|
|
||||||
|
|
||||||
if ((wifi_check_interval_counter + WIFI_CHECK_INTERVAL_MS) > millis()) {
|
|
||||||
// if check interval is not exceeded abort check
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wifi_check_interval_counter = millis();
|
|
||||||
|
|
||||||
/*if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
// if we are connected
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
debug("Connection problem (wlan problem), resetting ESP");
|
|
||||||
delay(1000);
|
|
||||||
ESP.reset();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef ENABLE_PING_HOST_TEST
|
|
||||||
debug("Ping " + String(PING_HOST_IP));
|
|
||||||
success = Ping.ping(PING_HOST_IP, 3);
|
|
||||||
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
debug("Ping success");
|
|
||||||
debug("Min Time: " + String(Ping.minTime()) + " ms");
|
|
||||||
debug("Average Time: " + String(Ping.averageTime()) + " ms");
|
|
||||||
debug("Max Time: " + String(Ping.maxTime()) + " ms");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
debug("Connection problem (ping failed), resetting ESP");
|
|
||||||
delay(1000);
|
|
||||||
ESP.reset();
|
|
||||||
}
|
|
||||||
#endif // ENABLE_PING_HOST_TEST
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DISABLE_WIFIMANAGER
|
|
||||||
void wifi_disconnected(WiFiEvent_t event) {
|
|
||||||
|
|
||||||
if (wifi_reconnect_cnt >= 5) {
|
|
||||||
|
|
||||||
debug("\nReboot, to much reconnects to wifi done before");
|
|
||||||
ESP.restart();
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
debug("no wifi connection, try to reconnect " + String(wifi_reconnect_cnt));
|
|
||||||
|
|
||||||
wifi_reconnect_cnt++;
|
|
||||||
wifiConnect();
|
|
||||||
|
|
||||||
#ifdef WEBUPDATER_FEATURE
|
|
||||||
setWifiReconnectCnt(wifi_reconnect_cnt);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
||||||
void wifiConnect() {
|
|
||||||
|
|
||||||
// Establish WiFi connection if not already applied
|
|
||||||
|
|
||||||
#ifndef DISABLE_WIFIMANAGER
|
|
||||||
|
|
||||||
wifiManager.setMinimumSignalQuality(WIFI_MINIMUM_SIGNAL_QUALITY);
|
|
||||||
// the time in seconds to wait for the known wifi connection
|
|
||||||
wifiManager.setConnectTimeout(WIFI_AUTOCONNECT_TIMEOUT_S);
|
|
||||||
// the time in seconds to wait for the user to configure the device
|
|
||||||
wifiManager.setTimeout(WIFI_CONFIG_PORTAL_TIMEOUT_S);
|
|
||||||
|
|
||||||
while (!wifiManager.autoConnect(wifiName.c_str(), "DEADBEEF")) {
|
|
||||||
|
|
||||||
#ifdef SLEEP_IF_NO_WLAN_CONNECTION
|
|
||||||
// If autoconnect to WLAN failed and no client connected, go to deep sleep
|
|
||||||
ESP.deepSleep(POWERSAVING_SLEEP_S * 1000000, WAKE_RF_DEFAULT);
|
ESP.deepSleep(POWERSAVING_SLEEP_S * 1000000, WAKE_RF_DEFAULT);
|
||||||
delay(100);
|
delay(100);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SLEEP_IF_NO_WLAN_CONNECTION
|
|
||||||
// sleep a few seconds and go on trying to connect
|
|
||||||
debug("WiFi connection failed, try again in 5 seconds...");
|
|
||||||
delay(5000);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#else // DISABLE_WIFIMANAGER is defined
|
|
||||||
|
|
||||||
if (!WiFi.config(local_IP, gateway, subnet)) {
|
|
||||||
debug("Failed to set IP configuration");
|
|
||||||
} else {
|
|
||||||
debug("Successful set IP configuration");
|
|
||||||
}
|
|
||||||
|
|
||||||
// bind the check function to the disconnected wifi event
|
|
||||||
WiFi.onEvent(wifi_disconnected, WIFI_EVENT_STAMODE_DISCONNECTED);
|
|
||||||
|
|
||||||
WiFi.begin(WIFI_SSID, WIFI_PASSWD);
|
|
||||||
WiFi.setAutoReconnect(true);
|
|
||||||
WiFi.setSleepMode(WIFI_NONE_SLEEP);
|
|
||||||
|
|
||||||
debug("Connecting to WLAN");
|
|
||||||
|
|
||||||
while (WiFi.status() != WL_CONNECTED) {
|
|
||||||
delay(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // DISABLE_WIFIMANAGER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//*************************************************************************//
|
//*************************************************************************//
|
||||||
|
|
||||||
#ifdef BATTERY_POWERED
|
#ifdef BATTERY_POWERED
|
||||||
void criticalBatCheck() {
|
void criticalBatCheck()
|
||||||
|
{
|
||||||
float volt = battery_voltage();
|
float volt = battery_voltage();
|
||||||
if (volt <= BAT_EMERGENCY_DEEPSLEEP_VOLTAGE) {
|
if (volt <= BAT_EMERGENCY_DEEPSLEEP_VOLTAGE) {
|
||||||
debug("Bat Voltage: " + String(volt) + " V");
|
debug("Bat Voltage: " + String(volt) + " V");
|
||||||
debug("Low battery, going into deep sleep.");
|
debug("Low battery, going into deep sleep.");
|
||||||
// Casting to an unsigned int, so it fits into the integer range
|
// Casting to an unsigned int, so it fits into the integer range
|
||||||
ESP.deepSleep(1U * EMERGENCY_SLEEP_S * 1000000u); // battery low, shutting down
|
ESP.deepSleep(1U * EMERGENCY_SLEEP_S * 1000000); // battery low, shutting down
|
||||||
delay(100);
|
delay(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//*************************************************************************//
|
void loop()
|
||||||
|
{
|
||||||
void loop() {
|
|
||||||
|
|
||||||
#ifdef BATTERY_POWERED
|
#ifdef BATTERY_POWERED
|
||||||
delay(50);
|
delay(50);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#else // not in BATTERY_POWERED mode
|
|
||||||
|
|
||||||
#ifdef ENABLE_WATCHDOG
|
|
||||||
WDT_FEED();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// call fsm loop function
|
// call sub loop function
|
||||||
_fsm_loop();
|
_loop();
|
||||||
|
|
||||||
// Needed to give WIFI time to function properly
|
//Needed to give WIFI time to function properly
|
||||||
delay(DELAY_LOOP_MS);
|
delay(DELAY_LOOP_MS);
|
||||||
|
|
||||||
|
update_sensor_cnt++;
|
||||||
|
|
||||||
|
#ifdef WEBUPDATER_FEATURE
|
||||||
|
update_webserver_cnt++;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HTTP_CALL_ON_WINDSPEED_EXCEED
|
||||||
|
update_windspeed_exceed_cnt++;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
//*************************************************************************//
|
void _loop() {
|
||||||
|
|
||||||
#ifndef BATTERY_POWERED
|
|
||||||
void _fsm_loop()
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef WEBUPDATER_FEATURE
|
#ifdef WEBUPDATER_FEATURE
|
||||||
if ((update_webserver_cnt + (UPDATE_WEBSERVER_INTVERVAL_MS)) <= millis())
|
if (UPDATE_WEBSERVER_INTVERVAL_S * 1000 / DELAY_LOOP_MS <= update_webserver_cnt)
|
||||||
{
|
{
|
||||||
//debug("web updater call");
|
update_webserver_cnt = 0;
|
||||||
update_webserver_cnt = millis();
|
|
||||||
doWebUpdater();
|
doWebUpdater();
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_WATCHDOG
|
|
||||||
WDT_FEED();
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HTTP_CALL_SEND_JSON_DATA
|
|
||||||
if ((http_call_send_json_data_cnt + (HTTP_CALL_SEND_JSON_DATA_INTERVAL_S * 1000)) <= millis() and validData == true)
|
|
||||||
{
|
|
||||||
// send the data to the server
|
|
||||||
debug("Sending weather json data to http webserver");
|
|
||||||
//debug(">>>" + String(0) + "=" + String(currentSensorData[0]));
|
|
||||||
//debug(String(SENSOR_TEMPERATURE) + "=" + String(currentSensorData[SENSOR_TEMPERATURE]));
|
|
||||||
http_call_send_json_data_cnt = millis();
|
|
||||||
http_call_send_json_data();
|
|
||||||
}
|
|
||||||
#ifdef ENABLE_WATCHDOG
|
|
||||||
WDT_FEED();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
switch (fsm_state)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_1:
|
|
||||||
//debug("wind speed exceeded check if required");
|
|
||||||
#ifdef HTTP_CALL_ON_WINDSPEED_EXCEED
|
#ifdef HTTP_CALL_ON_WINDSPEED_EXCEED
|
||||||
if ((update_windspeed_exceed_cnt + (HTTP_CALL_ON_WINDSPEED_INTERVAL_S * 1000)) <= millis()) {
|
if (HTTP_CALL_ON_WINDSPEED_INTERVAL_S * 1000 / DELAY_LOOP_MS <= update_windspeed_exceed_cnt)
|
||||||
debug("wind sensor value outdated");
|
{
|
||||||
|
debug("Reading wind sensor because of exceed call functionality");
|
||||||
// reset the wait timer to get a value every HTTP_CALL_ON_WINDSPEED_INTERVAL_S independently to the runtime of the measurement
|
if (sensors[SENSOR_WINDSPEED])
|
||||||
update_windspeed_exceed_cnt = millis();
|
{
|
||||||
|
// read from windspeed sensorSTATUS_LED_PIN
|
||||||
// start measurement of wind speed
|
digitalWrite(STATUS_LED_PIN, HIGH);
|
||||||
start_measure_wind();
|
currentSensorData[SENSOR_WINDSPEED] = sensors[SENSOR_WINDSPEED]();
|
||||||
|
|
||||||
fsm_state = FSM_STATE_11; // wait untile the wind meas time exceeded
|
|
||||||
break; // abort case here to prevent read of next sensor in list
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fsm_state = FSM_STATE_2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_2:
|
|
||||||
//debug("reset time check if required");
|
|
||||||
#ifdef RESET_ESP_TIME_INTERVAL
|
|
||||||
// if millis() reached interval restart ESP
|
|
||||||
if (RESET_ESP_TIME_INTERVAL_MS <= millis()) {
|
|
||||||
debug("resetting firmware intentionally");
|
|
||||||
// Push reset button after flashing once or do a manual power cycle to get the functionality working.
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fsm_state = FSM_STATE_3;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_3:
|
|
||||||
wifiConnectionCheck();
|
|
||||||
fsm_state = FSM_STATE_4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_4:
|
|
||||||
//debug("disable measure of wind speed if required");
|
|
||||||
#ifdef defined(BATTERY_POWERED) && defined(SENSOR_WIND)
|
|
||||||
if (energySavingMode() == 1) {
|
|
||||||
// Disable expensive tasks
|
|
||||||
//sensors[SENSOR_WINDSPEED] = 0;
|
|
||||||
//debug("read of wind sensor because of low battery disabled");
|
|
||||||
do_not_read_windsensor = true;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//sensors[SENSOR_WINDSPEED] = &wind_speed;
|
|
||||||
//debug("read of wind sensor because of high battery enabled");
|
|
||||||
do_not_read_windsensor = false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
sensor_cnt = 0;
|
|
||||||
fsm_state = FSM_STATE_5;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_5:
|
|
||||||
//debug("read sensor data check");
|
|
||||||
if ((update_sensor_cnt + (UPDATE_SENSOR_INTERVAL_S * 1000UL)) <= millis() or validData == false) {
|
|
||||||
debug("read sensor data " + String(sensor_cnt));
|
|
||||||
/*
|
|
||||||
debug(" update_sensor_cnt = " + String(update_sensor_cnt));
|
|
||||||
debug(" (UPDATE_SENSOR_INTERVAL_S * 1000UL) = " + String((UPDATE_SENSOR_INTERVAL_S * 1000UL)));
|
|
||||||
debug(" millis() = " + String(millis()));
|
|
||||||
debug(" validData = " + String(validData));
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (sensor_cnt != SENSOR_WINDSPEED) {
|
|
||||||
// read data from sensor
|
|
||||||
currentSensorData[sensor_cnt] = readSensors(sensor_cnt);
|
|
||||||
//debug(String(sensor_cnt) + "=" + String(currentSensorData[sensor_cnt]));
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
start_measure_wind(); // start measurement of wind speed
|
|
||||||
fsm_state = FSM_STATE_9; // wait untile the wind meas time exceeded
|
|
||||||
break; // abort case here to prevent read of next sensor in list
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sensor_cnt < VALUES - 1) {
|
|
||||||
sensor_cnt++;
|
|
||||||
fsm_state = FSM_STATE_5; // jump to same state again, more sensors to read
|
|
||||||
} else {
|
|
||||||
update_sensor_cnt = millis(); // reset the update interval counter
|
|
||||||
sensor_cnt = 0;
|
|
||||||
fsm_state = FSM_STATE_6; // next state
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
//debug("skip read sensor data");
|
|
||||||
fsm_state = FSM_STATE_1; // no new data, reset FSM
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_6:
|
|
||||||
//
|
|
||||||
#ifdef SERIAL_FEATURE
|
|
||||||
debug("log to serial");
|
|
||||||
logToSerial(currentSensorData);
|
|
||||||
#endif
|
|
||||||
fsm_state = FSM_STATE_7;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_7:
|
|
||||||
for (uint8_t i = 0; i < 5 and validData == false; i++) { // only check sensor data 0 to 4 -> SENSOR_TEMPERATURE, SENSOR_HUMIDITY, SENSOR_LIGHT, SENSOR_WINDSPEED, SENSOR_PRESSURE
|
|
||||||
if (currentSensorData[i] != 0 and currentSensorData[i] != nanf("no value") and (not isnan(currentSensorData[i]))) {
|
|
||||||
validData = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef INFLUXDB_FEATURE
|
|
||||||
if (validData == true) {
|
|
||||||
// send data only if valid data is available
|
|
||||||
debug("send data to influxdb");
|
|
||||||
pushToInfluxDB(DEVICE_NAME, currentSensorData);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fsm_state = FSM_STATE_8;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_8:
|
|
||||||
|
|
||||||
#ifdef WEBUPDATER_FEATURE
|
|
||||||
#ifdef SHOW_SENSOR_DATA_ON_WEBUPDATER_MAIN_PAGE
|
|
||||||
debug("set sensor data in webupdater");
|
|
||||||
setSensorData(currentSensorData);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fsm_state = FSM_STATE_1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_9:
|
|
||||||
#ifdef SENSOR_WIND
|
|
||||||
if (check_measure_wind_done() == false) {
|
|
||||||
//debug("wait for wind sensor finish");
|
|
||||||
fsm_state = FSM_STATE_9; // stay here until the wind measurement is done
|
|
||||||
} else {
|
|
||||||
//debug("wind sensor read finish");
|
|
||||||
fsm_state = FSM_STATE_10;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// in case that the wind sensor is not used skip this step
|
|
||||||
sensor_cnt++;
|
|
||||||
fsm_state = FSM_STATE_5;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_10:
|
|
||||||
#ifdef SENSOR_WIND
|
|
||||||
currentSensorData[SENSOR_WINDSPEED] = measure_wind_result();
|
|
||||||
debug("wind sensor " + String(currentSensorData[SENSOR_WINDSPEED]));
|
|
||||||
#endif
|
|
||||||
// step into read of next sensor read
|
|
||||||
sensor_cnt++;
|
|
||||||
fsm_state = FSM_STATE_5;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_11:
|
|
||||||
#ifdef SENSOR_WIND
|
|
||||||
if (check_measure_wind_done() == false) {
|
|
||||||
//debug("wait for wind sensor finish");
|
|
||||||
fsm_state = FSM_STATE_11; // stay here until the wind measurement is done
|
|
||||||
} else {
|
|
||||||
//debug("wind sensor read finish");
|
|
||||||
fsm_state = FSM_STATE_12;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// in case that the wind sensor is not used skip this step
|
|
||||||
sensor_cnt++;
|
|
||||||
fsm_state = FSM_STATE_5;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
case FSM_STATE_12:
|
|
||||||
#ifdef HTTP_CALL_ON_WINDSPEED_EXCEED
|
|
||||||
currentSensorData[SENSOR_WINDSPEED] = measure_wind_result();
|
|
||||||
debug("wind sensor value " + String(currentSensorData[SENSOR_WINDSPEED]));
|
|
||||||
|
|
||||||
if (currentSensorData[SENSOR_WINDSPEED] >= HTTP_CALL_ON_WINDSPEED_EXCEED_MPS) {
|
|
||||||
// windspeed exceeded send http call
|
|
||||||
digitalWrite(STATUS_LED_PIN, LOW);
|
digitalWrite(STATUS_LED_PIN, LOW);
|
||||||
|
|
||||||
|
if (currentSensorData[SENSOR_WINDSPEED] >= HTTP_CALL_ON_WINDSPEED_EXCEED_MPS)
|
||||||
|
{
|
||||||
|
digitalWrite(STATUS_LED_PIN, HIGH);
|
||||||
|
|
||||||
// call the url HTTP_CALL_ON_WINDSPEED_URL
|
// call the url HTTP_CALL_ON_WINDSPEED_URL
|
||||||
WiFiClient client;
|
WiFiClient client;
|
||||||
HTTPClient http;
|
HTTPClient http;
|
||||||
|
@ -666,85 +243,65 @@ void _fsm_loop()
|
||||||
// Send HTTP GET request
|
// Send HTTP GET request
|
||||||
int httpResponseCode = http.GET();
|
int httpResponseCode = http.GET();
|
||||||
|
|
||||||
#ifdef ENABLE_WATCHDOG
|
|
||||||
WDT_FEED();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (httpResponseCode > 0) {
|
if (httpResponseCode > 0) {
|
||||||
String response = http.getString();
|
String response = http.getString();
|
||||||
debug("http response code: " + String(httpResponseCode) + " = " + response);
|
#ifdef DEBUG
|
||||||
|
Serial.println("http response code: " + String(httpResponseCode) + " = " + response);
|
||||||
|
#endif
|
||||||
// TODO handle response
|
// TODO handle response
|
||||||
}
|
}
|
||||||
|
|
||||||
http.end();
|
http.end();
|
||||||
debug("Called windspeed exceed callout");
|
debug("Called windspeed exceed callout");
|
||||||
digitalWrite(STATUS_LED_PIN, HIGH);
|
digitalWrite(STATUS_LED_PIN, LOW);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
currentSensorData[SENSOR_WINDSPEED] = nan("no value");
|
||||||
|
}
|
||||||
|
update_windspeed_exceed_cnt = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WEBUPDATER_FEATURE
|
|
||||||
#ifdef SHOW_SENSOR_DATA_ON_WEBUPDATER_MAIN_PAGE
|
|
||||||
sentWindspeed(currentSensorData[SENSOR_WINDSPEED]);
|
|
||||||
#endif // SHOW_SENSOR_DATA_ON_WEBUPDATER_MAIN_PAGE
|
|
||||||
#endif // WEBUPDATER_FEATURE
|
|
||||||
#endif // HTTP_CALL_ON_WINDSPEED_EXCEED
|
|
||||||
|
|
||||||
// step into read of next fsm state
|
|
||||||
fsm_state = FSM_STATE_2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------------- */
|
|
||||||
default:
|
|
||||||
fsm_state = FSM_STATE_1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
} // close of switch
|
|
||||||
|
|
||||||
//debug("FSM state = " + String(fsm_state));
|
|
||||||
/*if (fsm_state == FSM_STATE_1)
|
|
||||||
{
|
|
||||||
debug("----------");
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//*************************************************************************//
|
#ifndef BATTERY_POWERED
|
||||||
|
if (UPDATE_SENSOR_INTERVAL_S * 1000 / DELAY_LOOP_MS > update_sensor_cnt) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void _battery_mode_main() {
|
#ifdef defined(BATTERY_POWERED) && defined(SENSOR_WIND)
|
||||||
|
|
||||||
#ifdef SENSOR_BATTERY
|
|
||||||
if (energySavingMode() == 1) {
|
if (energySavingMode() == 1) {
|
||||||
// Disable expensive tasks
|
// Disable expensive tasks
|
||||||
//debug("read of wind sensor because of low battery disabled");
|
sensors[SENSOR_WINDSPEED] = 0;
|
||||||
do_not_read_windsensor = true;
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//debug("read of wind sensor because of high battery enabled");
|
sensors[SENSOR_WINDSPEED] = &wind_speed;
|
||||||
do_not_read_windsensor = false;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
update_sensor_cnt = 0;
|
||||||
for (uint8_t i = 0; i < VALUES; i++) {
|
for (uint8_t i = 0; i < VALUES; i++) {
|
||||||
currentSensorData[i] = readSensors(i);
|
if (sensors[i]) {
|
||||||
|
currentSensorData[i] = sensors[i]();
|
||||||
|
} else {
|
||||||
|
currentSensorData[i] = nan("no value");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SERIAL_FEATURE
|
#ifdef SERIAL_FEATURE
|
||||||
logToSerial(currentSensorData);
|
logToSerial(currentSensorData);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
delay(100);
|
||||||
|
|
||||||
#ifdef INFLUXDB_FEATURE
|
#ifdef INFLUXDB_FEATURE
|
||||||
pushToInfluxDB(DEVICE_NAME, currentSensorData);
|
pushToInfluxDB(DEVICE_NAME, currentSensorData);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WEBUPDATER_FEATURE
|
#ifdef WEBUPDATER_FEATURE
|
||||||
#ifdef SHOW_SENSOR_DATA_ON_WEBUPDATER_MAIN_PAGE
|
|
||||||
setSensorData(currentSensorData);
|
setSensorData(currentSensorData);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
||||||
#ifdef SERIAL_FEATURE
|
|
||||||
void logToSerial(float sensorValues[]) {
|
void logToSerial(float sensorValues[]) {
|
||||||
Serial.println("");
|
Serial.println("");
|
||||||
Serial.println("Current readings:");
|
Serial.println("Current readings:");
|
||||||
|
@ -753,93 +310,7 @@ void logToSerial(float sensorValues[]) {
|
||||||
Serial.println("Light: " + String(sensorValues[SENSOR_LIGHT]) + " Lux");
|
Serial.println("Light: " + String(sensorValues[SENSOR_LIGHT]) + " Lux");
|
||||||
Serial.println("Windspeed: " + String(sensorValues[SENSOR_WINDSPEED]) + " km/h");
|
Serial.println("Windspeed: " + String(sensorValues[SENSOR_WINDSPEED]) + " km/h");
|
||||||
Serial.println("Pressure: " + String(sensorValues[SENSOR_PRESSURE]) + " hPa");
|
Serial.println("Pressure: " + String(sensorValues[SENSOR_PRESSURE]) + " hPa");
|
||||||
Serial.println("Bat Voltage: " + String(sensorValues[SENSOR_VOLTAGE]) + " V");
|
Serial.println("Bat Voltage: " + String(sensorValues[SENSOR_BAT_VOLTAGE]) + " V");
|
||||||
Serial.println("Bat charge state: " + String(sensorValues[SENSOR_BATCHARGESTATE]));
|
Serial.println("Bat charge state: " + String(sensorValues[SENSOR_BATCHARGESTATE]));
|
||||||
Serial.println("Energy saving: " + String(sensorValues[SENSOR_ESAVEMODE]));
|
Serial.println("Energy saving: " + String(sensorValues[SENSOR_ESAVEMODE]));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
||||||
#ifdef HTTP_CALL_SEND_JSON_DATA
|
|
||||||
|
|
||||||
String getJsonData()
|
|
||||||
{
|
|
||||||
//debug(String(SENSOR_TEMPERATURE) + "=" + String(currentSensorData[SENSOR_TEMPERATURE]));
|
|
||||||
String msg = hb_ws_msg_start +
|
|
||||||
hb_ws_msg_temp +
|
|
||||||
String(currentSensorData[SENSOR_TEMPERATURE], 2) +
|
|
||||||
", " +
|
|
||||||
hb_ws_msg_humi +
|
|
||||||
String((isnan(currentSensorData[SENSOR_HUMIDITY]) ? 0.0 : currentSensorData[SENSOR_HUMIDITY]), 2) +
|
|
||||||
", " +
|
|
||||||
hb_ws_msg_light +
|
|
||||||
String(currentSensorData[SENSOR_LIGHT], 0) + // The light level for the homebridge-http-lux2 plugin is only able to parse integer values
|
|
||||||
", " +
|
|
||||||
hb_ws_msg_windspeed +
|
|
||||||
String(currentSensorData[SENSOR_WINDSPEED], 2) +
|
|
||||||
", " +
|
|
||||||
hb_ws_msg_pressure +
|
|
||||||
String(currentSensorData[SENSOR_PRESSURE], 2) +
|
|
||||||
", " +
|
|
||||||
hb_ws_msg_voltage +
|
|
||||||
String(currentSensorData[SENSOR_VOLTAGE], 2) +
|
|
||||||
", " +
|
|
||||||
hb_ws_msg_timestamp +
|
|
||||||
String(millis()) +
|
|
||||||
", " +
|
|
||||||
hb_ws_msg_valid +
|
|
||||||
String(validData) +
|
|
||||||
hb_ws_msg_end;
|
|
||||||
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
void http_call_send_json_data()
|
|
||||||
{
|
|
||||||
//debug("http call to " + String(HTTP_CALL_SEND_JSON_DATA_URL));
|
|
||||||
//debug(String(SENSOR_TEMPERATURE) + "=" + String(currentSensorData[SENSOR_TEMPERATURE]));
|
|
||||||
// windspeed exceeded send http call
|
|
||||||
digitalWrite(STATUS_LED_PIN, LOW);
|
|
||||||
|
|
||||||
// call the url HTTP_CALL_SEND_JSON_DATA_URL
|
|
||||||
WiFiClient client;
|
|
||||||
HTTPClient http;
|
|
||||||
|
|
||||||
String tmp_str = HTTP_CALL_SEND_JSON_DATA_URL + urlEncode(getJsonData());
|
|
||||||
|
|
||||||
debug("send: " + tmp_str);
|
|
||||||
|
|
||||||
http.begin(client, String(tmp_str).c_str());
|
|
||||||
// Send HTTP GET request
|
|
||||||
int httpResponseCode = http.GET();
|
|
||||||
|
|
||||||
#ifdef ENABLE_WATCHDOG
|
|
||||||
WDT_FEED();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
String response = http.getString();
|
|
||||||
debug("http response code: " + String(httpResponseCode) + " = " + response);
|
|
||||||
|
|
||||||
http.end();
|
|
||||||
digitalWrite(STATUS_LED_PIN, HIGH);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DEBUG_RESET_REASON
|
|
||||||
void debugResetReason() {
|
|
||||||
|
|
||||||
rst_info *resetInfo;
|
|
||||||
|
|
||||||
// 1. read eeprom reset reason
|
|
||||||
//int eep_reset_reason = eeprom_read(0);
|
|
||||||
//debug("EEPROM reset reason " + String(eep_reset_reason));
|
|
||||||
|
|
||||||
// 2. read real reset reason
|
|
||||||
int reset_reason = resetInfo->reason;
|
|
||||||
|
|
||||||
debug("New reset reason " + String(reset_reason));
|
|
||||||
//eeprom_write(0, reset_reason);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,18 +1,12 @@
|
||||||
|
|
||||||
#include "config_user.h"
|
#include "config_user.h"
|
||||||
|
|
||||||
#ifdef INFLUXDB_FEATURE
|
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
||||||
#if INFLUXDB_VERSION == 1
|
#if INFLUXDB_VERSION == 1
|
||||||
|
|
||||||
#include <ESP8266Influxdb.h> // https://github.com/hwwong/ESP8266Influxdb
|
#include <ESP8266Influxdb.h> // https://github.com/hwwong/ESP8266Influxdb
|
||||||
|
|
||||||
Influxdb _influxdb(INFLUXDB_HOST, INFLUXDB_PORT);
|
Influxdb _influxdb(INFLUXDB_HOST, INFLUXDB_PORT);
|
||||||
|
|
||||||
const String msg = "weather,device=" + device + " ";
|
|
||||||
|
|
||||||
void influxdb_begin() {
|
void influxdb_begin() {
|
||||||
// Init variables to influxdb config - doesn't talk to database
|
// Init variables to influxdb config - doesn't talk to database
|
||||||
_influxdb.opendb(INFLUXDB_DB, INFLUXDB_USER, INFLUXDB_PASS);
|
_influxdb.opendb(INFLUXDB_DB, INFLUXDB_USER, INFLUXDB_PASS);
|
||||||
|
@ -22,6 +16,7 @@ void pushToInfluxDB(String device, float sensorValues[]) {
|
||||||
uint8_t tries = 0;
|
uint8_t tries = 0;
|
||||||
boolean addComma = false;
|
boolean addComma = false;
|
||||||
|
|
||||||
|
String msg = "weather,device=" + device + " ";
|
||||||
if (!(isnan(sensorValues[SENSOR_TEMPERATURE])))
|
if (!(isnan(sensorValues[SENSOR_TEMPERATURE])))
|
||||||
{
|
{
|
||||||
msg += "temperature=" + String(sensorValues[SENSOR_TEMPERATURE]);
|
msg += "temperature=" + String(sensorValues[SENSOR_TEMPERATURE]);
|
||||||
|
@ -77,12 +72,6 @@ void pushToInfluxDB(String device, float sensorValues[]) {
|
||||||
addComma = true;
|
addComma = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LOG_MILLIS_TO_INFLUXDB
|
|
||||||
if (true == addComma)
|
|
||||||
msg += ",";
|
|
||||||
msg += "timestamp=" + String(millis());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
debug(msg);
|
debug(msg);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -91,8 +80,6 @@ void pushToInfluxDB(String device, float sensorValues[]) {
|
||||||
} while (_influxdb.response() != DB_SUCCESS and tries < 5);
|
} while (_influxdb.response() != DB_SUCCESS and tries < 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
||||||
#elif INFLUXDB_VERSION == 2
|
#elif INFLUXDB_VERSION == 2
|
||||||
|
|
||||||
#include <InfluxDbClient.h> // from bib manager
|
#include <InfluxDbClient.h> // from bib manager
|
||||||
|
@ -109,12 +96,12 @@ void influxdb_begin() {
|
||||||
if (client.validateConnection()) {
|
if (client.validateConnection()) {
|
||||||
// success
|
// success
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
debug("InfluxDB connect success\n");
|
Serial.print("InfluxDB connect success\n");
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
// fail
|
// fail
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
debug("InfluxDB connect failed\n");
|
Serial.print("InfluxDB connect failed\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,10 +139,10 @@ void pushToInfluxDB(String device, float sensorValues[]) {
|
||||||
sensor.addField("pressure", sensorValues[SENSOR_PRESSURE]);
|
sensor.addField("pressure", sensorValues[SENSOR_PRESSURE]);
|
||||||
_writePoint();
|
_writePoint();
|
||||||
}
|
}
|
||||||
if (!(isnan(sensorValues[SENSOR_VOLTAGE])))
|
if (!(isnan(sensorValues[SENSOR_BAT_VOLTAGE])))
|
||||||
{
|
{
|
||||||
sensor.clearFields();
|
sensor.clearFields();
|
||||||
sensor.addField("batvoltage", sensorValues[SENSOR_VOLTAGE]);
|
sensor.addField("batvoltage", sensorValues[SENSOR_BAT_VOLTAGE]);
|
||||||
_writePoint();
|
_writePoint();
|
||||||
}
|
}
|
||||||
if (!(isnan(sensorValues[SENSOR_ESAVEMODE])))
|
if (!(isnan(sensorValues[SENSOR_ESAVEMODE])))
|
||||||
|
@ -171,66 +158,32 @@ void pushToInfluxDB(String device, float sensorValues[]) {
|
||||||
_writePoint();
|
_writePoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LOG_MILLIS_TO_INFLUXDB
|
|
||||||
sensor.clearFields();
|
|
||||||
sensor.addField("timestamp", millis());
|
|
||||||
_writePoint();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _writePoint() {
|
void _writePoint() {
|
||||||
const uint8_t maxRetries = 3; // Maximale Anzahl der Versuche
|
|
||||||
uint8_t attempt = 0;
|
|
||||||
bool success = false;
|
|
||||||
|
|
||||||
while (attempt < maxRetries) {
|
// wait unitl ready
|
||||||
attempt++;
|
do {
|
||||||
|
#ifdef DEBUG
|
||||||
|
Serial.print("InfluxDB: waiting for write ready\n");
|
||||||
|
#endif
|
||||||
|
} while (client.canSendRequest() == false);
|
||||||
|
|
||||||
// Timeout für Verbindung prüfen
|
// Write point
|
||||||
uint32_t startTime = millis();
|
if (!client.writePoint(sensor)) {
|
||||||
while (!client.validateConnection()) {
|
#ifdef DEBUG
|
||||||
if (millis() - startTime > INFLUXDB_TIMEOUT_MS) {
|
Serial.print("InfluxDB write failed: ");
|
||||||
debug("Timeout validating connection");
|
Serial.println(client.getLastErrorMessage());
|
||||||
break; // Timeout erreicht, aus Schleife ausbrechen
|
Serial.print("\nErrorcode: ");
|
||||||
}
|
Serial.println(client.getLastStatusCode());
|
||||||
}
|
Serial.print("\n");
|
||||||
|
#endif
|
||||||
if (!client.validateConnection()) {
|
|
||||||
debug("Can't write to InfluxDB, connection validation failed on attempt " + String(attempt));
|
|
||||||
continue; // Zum nächsten Versuch übergehen
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timeout für canSendRequest prüfen
|
|
||||||
startTime = millis();
|
|
||||||
while (!client.canSendRequest()) {
|
|
||||||
if (millis() - startTime > INFLUXDB_TIMEOUT_MS) {
|
|
||||||
debug("Timeout waiting for canSendRequest");
|
|
||||||
break; // Timeout erreicht, aus Schleife ausbrechen
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!client.canSendRequest()) {
|
|
||||||
debug("Can't write to InfluxDB, canSendRequest failed on attempt " + String(attempt));
|
|
||||||
continue; // Zum nächsten Versuch übergehen
|
|
||||||
}
|
|
||||||
|
|
||||||
// Datenpunkt schreiben
|
|
||||||
if (client.writePoint(sensor)) {
|
|
||||||
success = true;
|
|
||||||
break; // Schreiben erfolgreich, Schleife verlassen
|
|
||||||
} else {
|
} else {
|
||||||
debug("InfluxDB write failed on attempt " + String(attempt) + ": " + client.getLastErrorMessage() + " Err: " + String(client.getLastStatusCode()));
|
#ifdef DEBUG
|
||||||
}
|
Serial.print("InfluxDB write done\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!success) {
|
|
||||||
debug("Failed to write point to InfluxDB after " + String(maxRetries) + " attempts.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // influxdb version 2 check
|
#endif // influxdb version 2 check
|
||||||
|
|
||||||
#endif // INFLUXDB_FEATURE
|
|
||||||
|
|
||||||
//*************************************************************************//
|
|
||||||
|
|
22
firmware/libraries/APDS9930-master/.gitattributes
vendored
Executable file
22
firmware/libraries/APDS9930-master/.gitattributes
vendored
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
# Custom for Visual Studio
|
||||||
|
*.cs diff=csharp
|
||||||
|
*.sln merge=union
|
||||||
|
*.csproj merge=union
|
||||||
|
*.vbproj merge=union
|
||||||
|
*.fsproj merge=union
|
||||||
|
*.dbproj merge=union
|
||||||
|
|
||||||
|
# Standard to msysgit
|
||||||
|
*.doc diff=astextplain
|
||||||
|
*.DOC diff=astextplain
|
||||||
|
*.docx diff=astextplain
|
||||||
|
*.DOCX diff=astextplain
|
||||||
|
*.dot diff=astextplain
|
||||||
|
*.DOT diff=astextplain
|
||||||
|
*.pdf diff=astextplain
|
||||||
|
*.PDF diff=astextplain
|
||||||
|
*.rtf diff=astextplain
|
||||||
|
*.RTF diff=astextplain
|
192
firmware/libraries/APDS9930-master/.gitignore
vendored
Executable file
192
firmware/libraries/APDS9930-master/.gitignore
vendored
Executable file
|
@ -0,0 +1,192 @@
|
||||||
|
#################
|
||||||
|
## SparkFun Useful stuff
|
||||||
|
#################
|
||||||
|
|
||||||
|
## AVR Development
|
||||||
|
*.eep
|
||||||
|
*.elf
|
||||||
|
*.lst
|
||||||
|
*.lss
|
||||||
|
*.sym
|
||||||
|
*.d
|
||||||
|
*.o
|
||||||
|
*.srec
|
||||||
|
*.map
|
||||||
|
|
||||||
|
## Notepad++ backup files
|
||||||
|
*.bak
|
||||||
|
|
||||||
|
## BOM files
|
||||||
|
*bom*
|
||||||
|
|
||||||
|
#################
|
||||||
|
## Eclipse
|
||||||
|
#################
|
||||||
|
|
||||||
|
*.pydevproject
|
||||||
|
.project
|
||||||
|
.metadata
|
||||||
|
bin/
|
||||||
|
tmp/
|
||||||
|
*.tmp
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
*~.nib
|
||||||
|
local.properties
|
||||||
|
.classpath
|
||||||
|
.settings/
|
||||||
|
.loadpath
|
||||||
|
|
||||||
|
# External tool builders
|
||||||
|
.externalToolBuilders/
|
||||||
|
|
||||||
|
# Locally stored "Eclipse launch configurations"
|
||||||
|
*.launch
|
||||||
|
|
||||||
|
# CDT-specific
|
||||||
|
.cproject
|
||||||
|
|
||||||
|
# PDT-specific
|
||||||
|
.buildpath
|
||||||
|
|
||||||
|
|
||||||
|
#############
|
||||||
|
## Eagle
|
||||||
|
#############
|
||||||
|
|
||||||
|
# Ignore the board and schematic backup files
|
||||||
|
*.b#?
|
||||||
|
*.s#?
|
||||||
|
|
||||||
|
|
||||||
|
#################
|
||||||
|
## Visual Studio
|
||||||
|
#################
|
||||||
|
|
||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Rr]elease/
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.vspscc
|
||||||
|
.builds
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
## TODO: If you have NuGet Package Restore enabled, uncomment this
|
||||||
|
#packages/
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish
|
||||||
|
|
||||||
|
# Others
|
||||||
|
[Bb]in
|
||||||
|
[Oo]bj
|
||||||
|
sql
|
||||||
|
TestResults
|
||||||
|
*.Cache
|
||||||
|
ClientBin
|
||||||
|
stylecop.*
|
||||||
|
~$*
|
||||||
|
*.dbmdl
|
||||||
|
Generated_Code #added for RIA/Silverlight projects
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file to a newer
|
||||||
|
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
|
||||||
|
|
||||||
|
############
|
||||||
|
## Windows
|
||||||
|
############
|
||||||
|
|
||||||
|
# Windows image file caches
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
|
||||||
|
#############
|
||||||
|
## Python
|
||||||
|
#############
|
||||||
|
|
||||||
|
*.py[co]
|
||||||
|
|
||||||
|
# Packages
|
||||||
|
*.egg
|
||||||
|
*.egg-info
|
||||||
|
dist
|
||||||
|
build
|
||||||
|
eggs
|
||||||
|
parts
|
||||||
|
bin
|
||||||
|
var
|
||||||
|
sdist
|
||||||
|
develop-eggs
|
||||||
|
.installed.cfg
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
.coverage
|
||||||
|
.tox
|
||||||
|
|
||||||
|
#Translations
|
||||||
|
*.mo
|
||||||
|
|
||||||
|
#Mr Developer
|
||||||
|
.mr.developer.cfg
|
||||||
|
|
||||||
|
# Mac crap
|
||||||
|
.DS_Store
|
22
firmware/libraries/APDS9930-master/LICENSE
Executable file
22
firmware/libraries/APDS9930-master/LICENSE
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Davide Depau
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
92
firmware/libraries/APDS9930-master/README.md
Executable file
92
firmware/libraries/APDS9930-master/README.md
Executable file
|
@ -0,0 +1,92 @@
|
||||||
|
APDS9930 Ambient Light and Proximity sensor
|
||||||
|
===========================================
|
||||||
|
|
||||||
|
This is a fork of the [library from Sparkfun for the APDS-9960 sensor](https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor). It has been adapted to read values from this other model.
|
||||||
|
|
||||||
|
[**Quick-start guide available here**](https://web.archive.org/web/20151224052223/http://davideddu.org/blog/posts/apds-9930-arduino-quickstart/)
|
||||||
|
|
||||||
|
[**Purchase an Avago APDS-9930 Breakout Board here**](http://www.dx.com/p/384037?Utm_rid=14976370&Utm_source=affiliate)
|
||||||
|
|
||||||
|
|
||||||
|
# DO NOT EMAIL ME IF YOU HAVE AN ISSUE
|
||||||
|
It will be deleted without reading. If you have an issue, [create an issue](https://github.com/Depau/APDS9930/issues) here on GitHub.
|
||||||
|
|
||||||
|
# Unmaintained
|
||||||
|
I'm not going to maintain this library any more. I will merge pull requests, though. Contributions are welcome. Just don't expect anything from me.
|
||||||
|
|
||||||
|
![Avago APDS-9930 Breakout Board](http://img.dxcdn.com/productimages/sku_384037_1.jpg)
|
||||||
|
|
||||||
|
**Note:** even though it says APDS-9960, it's an APDS-9930. That's how I ended up getting one of those. I wanted the RGB sensor. I found this crap in my mailbox. But I decided to write a library for it anyways ;)
|
||||||
|
|
||||||
|
Getting Started
|
||||||
|
---------------
|
||||||
|
|
||||||
|
* Download the Git repository as a ZIP ("Download ZIP" button)
|
||||||
|
* Unzip
|
||||||
|
* Copy the entire library directory (APDS-9930) to
|
||||||
|
\<Arduino installation directory\>/libraries
|
||||||
|
* Open the Arduino program
|
||||||
|
* Select File -> Examples -> APDS9930 -> GestureTest
|
||||||
|
* Plug in your Arduino and APDS-9930 with the following connections
|
||||||
|
|
||||||
|
*-OR-*
|
||||||
|
|
||||||
|
* Use the library manager
|
||||||
|
|
||||||
|
| Arduino Pin | APDS-9930 Board | Function |
|
||||||
|
|---|---|---|
|
||||||
|
| 3.3V | VCC | Power |
|
||||||
|
| GND | GND | Ground |
|
||||||
|
| A4 | SDA | I²C Data |
|
||||||
|
| A5 | SCL | I²C Clock |
|
||||||
|
| 2 | INT | Interrupt |
|
||||||
|
|
||||||
|
*P.S.: you already know you can't use this purple little thing with your 5V Arduino without a level shifter, right? :) In case you don't have a level shifter, you can detach the microcontroller from an Arduino Uno, reconnect the oscillator pins, the RX and TX pins, the reset and the LED/SCK pins back to the board with some jumper wires. You can then power the microcontroller from a 3.3V source (the 3V3 output on the board should work) and connect the sensor directly to the MCU. Look up "Arduino on Breadboard".*
|
||||||
|
|
||||||
|
* Go to Tools -> Board and select your Arduino board
|
||||||
|
* Go to Tools -> Serial Port and select the COM port of your Arduino board
|
||||||
|
* Click "Upload"
|
||||||
|
* Go to Tools -> Serial Monitor
|
||||||
|
* Ensure the baud rate is set at 9600 baud
|
||||||
|
* Swipe your hand over the sensor in various directions!
|
||||||
|
|
||||||
|
Repository Contents
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
* **/examples** - Example sketches for the library (.ino). Run these from the Arduino IDE.
|
||||||
|
* **/extras** - Additional documentation for the user. These files are ignored by the IDE.
|
||||||
|
* **/src** - Source files for the library (.cpp, .h).
|
||||||
|
* **keywords.txt** - Keywords from this library that will be highlighted in the Arduino IDE.
|
||||||
|
* **library.properties** - General library properties for the Arduino package manager.
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
--------------
|
||||||
|
|
||||||
|
* **[Quickstart Guide](https://web.archive.org/web/20151224052223/http://davideddu.org/blog/posts/apds-9930-arduino-quickstart/)** - Basic hookup guide for the sensor.
|
||||||
|
* **[Product Repository](https://github.com/Davideddu/APDS9930)** - Main repository (including hardware files) for the APDS9930 ambient light and proximity sensor.
|
||||||
|
* **[Installing an Arduino Library Guide](https://learn.sparkfun.com/tutorials/installing-an-arduino-library)** - Basic information on how to install an Arduino library.
|
||||||
|
|
||||||
|
|
||||||
|
Version History
|
||||||
|
---------------
|
||||||
|
* master - Adapted for use with APDS-9930
|
||||||
|
* [V_1.4.0](https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor_Arduino_Library/tree/V_1.4.0) - Updated to new library structure
|
||||||
|
* V_1.3.0 - Implemented disableProximitySensor(). Thanks to jmg5150 for catching that!
|
||||||
|
* V_1.2.0 - Added pinMode line to GestureTest demo to fix interrupt bug with some Arduinos
|
||||||
|
* V_1.1.0 - Updated GestureTest demo to not freeze with fast swipes
|
||||||
|
* V_1.0.0: Initial release
|
||||||
|
* Ambient and RGB light sensing implemented
|
||||||
|
* Ambient light interrupts working
|
||||||
|
* Proximity sensing implemented
|
||||||
|
* Proximity interrupts working
|
||||||
|
|
||||||
|
License Information
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
This product is _**open source**_!
|
||||||
|
|
||||||
|
Please use, reuse, and modify these files as you see fit. Please maintain attribution to SparkFun Electronics and release anything derivative under the same license.
|
||||||
|
|
||||||
|
Distributed as-is; no warranty is given.
|
||||||
|
|
||||||
|
- Your friends at SparkFun. And Davide Depau :*
|
|
@ -0,0 +1,180 @@
|
||||||
|
/****************************************************************
|
||||||
|
AmbientLightInterrupt.ino
|
||||||
|
APDS-9930 RGB and Gesture Sensor
|
||||||
|
Shawn Hymel @ SparkFun Electronics
|
||||||
|
October 24, 2014
|
||||||
|
https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor
|
||||||
|
|
||||||
|
Tests the ambient light interrupt abilities of the APDS-9930.
|
||||||
|
Configures the APDS-9930 over I2C and waits for an external
|
||||||
|
interrupt based on high or low light conditions. Try covering
|
||||||
|
the sensor with your hand or bringing the sensor close to a
|
||||||
|
bright light source. You might need to adjust the LIGHT_INT_HIGH
|
||||||
|
and LIGHT_INT_LOW values to get the interrupt to work correctly.
|
||||||
|
|
||||||
|
Hardware Connections:
|
||||||
|
|
||||||
|
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||||
|
|
||||||
|
Arduino Pin APDS-9930 Board Function
|
||||||
|
|
||||||
|
3.3V VCC Power
|
||||||
|
GND GND Ground
|
||||||
|
A4 SDA I2C Data
|
||||||
|
A5 SCL I2C Clock
|
||||||
|
2 INT Interrupt
|
||||||
|
13 - LED
|
||||||
|
|
||||||
|
Resources:
|
||||||
|
Include Wire.h and APDS9930.h
|
||||||
|
|
||||||
|
Development environment specifics:
|
||||||
|
Written in Arduino 1.0.5
|
||||||
|
Tested with SparkFun Arduino Pro Mini 3.3V
|
||||||
|
|
||||||
|
This code is beerware; if you see me (or any other SparkFun
|
||||||
|
employee) at the local, and you've found our code helpful, please
|
||||||
|
buy us a round!
|
||||||
|
|
||||||
|
Distributed as-is; no warranty is given.
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#define DUMP_REGS
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <APDS9930.h>
|
||||||
|
|
||||||
|
// Pins
|
||||||
|
#define APDS9930_INT 2 // Needs to be an interrupt pin
|
||||||
|
#define LED_PIN 13 // LED for showing interrupt
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
#define LIGHT_INT_HIGH 1000 // High light level for interrupt
|
||||||
|
#define LIGHT_INT_LOW 10 // Low light level for interrupt
|
||||||
|
|
||||||
|
// Global variables
|
||||||
|
APDS9930 apds = APDS9930();
|
||||||
|
float ambient_light = 0;
|
||||||
|
uint16_t ch0 = 0;
|
||||||
|
uint16_t ch1 = 1;
|
||||||
|
volatile bool isr_flag = false;
|
||||||
|
uint16_t threshold = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
// Set LED as output
|
||||||
|
pinMode(LED_PIN, OUTPUT);
|
||||||
|
pinMode(APDS9930_INT, INPUT);
|
||||||
|
|
||||||
|
// Initialize Serial port
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println();
|
||||||
|
Serial.println(F("----------------------------"));
|
||||||
|
Serial.println(F("APDS-9930 - Light Interrupts"));
|
||||||
|
Serial.println(F("----------------------------"));
|
||||||
|
|
||||||
|
// Initialize interrupt service routine
|
||||||
|
attachInterrupt(0, interruptRoutine, FALLING);
|
||||||
|
|
||||||
|
// Initialize APDS-9930 (configure I2C and initial values)
|
||||||
|
if ( apds.init() ) {
|
||||||
|
Serial.println(F("APDS-9930 initialization complete"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set high and low interrupt thresholds
|
||||||
|
if ( !apds.setLightIntLowThreshold(LIGHT_INT_LOW) ) {
|
||||||
|
Serial.println(F("Error writing low threshold"));
|
||||||
|
}
|
||||||
|
if ( !apds.setLightIntHighThreshold(LIGHT_INT_HIGH) ) {
|
||||||
|
Serial.println(F("Error writing high threshold"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start running the APDS-9930 light sensor (no interrupts)
|
||||||
|
if ( apds.enableLightSensor(false) ) {
|
||||||
|
Serial.println(F("Light sensor is now running"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during light sensor init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read high and low interrupt thresholds
|
||||||
|
if ( !apds.getLightIntLowThreshold(threshold) ) {
|
||||||
|
Serial.println(F("Error reading low threshold"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("Low Threshold: "));
|
||||||
|
Serial.println(threshold);
|
||||||
|
}
|
||||||
|
if ( !apds.getLightIntHighThreshold(threshold) ) {
|
||||||
|
Serial.println(F("Error reading high threshold"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("High Threshold: "));
|
||||||
|
Serial.println(threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable interrupts
|
||||||
|
if ( !apds.setAmbientLightIntEnable(1) ) {
|
||||||
|
Serial.println(F("Error enabling interrupts"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DUMP_REGS
|
||||||
|
/* Register dump */
|
||||||
|
uint8_t reg;
|
||||||
|
uint8_t val;
|
||||||
|
|
||||||
|
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||||
|
if( (reg != 0x10) && \
|
||||||
|
(reg != 0x11) )
|
||||||
|
{
|
||||||
|
apds.wireReadDataByte(reg, val);
|
||||||
|
Serial.print(reg, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apds.wireReadDataByte(0x1E, val);
|
||||||
|
Serial.print(0x1E, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Wait for initialization and calibration to finish
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
// If interrupt occurs, print out the light levels
|
||||||
|
if ( isr_flag ) {
|
||||||
|
|
||||||
|
// Read the light levels (ambient, red, green, blue) and print
|
||||||
|
if ( !apds.readAmbientLightLux(ambient_light) ||
|
||||||
|
!apds.readCh0Light(ch0) ||
|
||||||
|
!apds.readCh1Light(ch1) ) {
|
||||||
|
Serial.println("Error reading light values");
|
||||||
|
} else {
|
||||||
|
Serial.print("Interrupt! Ambient: ");
|
||||||
|
Serial.print(ambient_light);
|
||||||
|
Serial.print(F(" Ch0: "));
|
||||||
|
Serial.print(ch0);
|
||||||
|
Serial.print(F(" Ch1: "));
|
||||||
|
Serial.println(ch1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Turn on LED for a half a second
|
||||||
|
digitalWrite(LED_PIN, HIGH);
|
||||||
|
delay(500);
|
||||||
|
digitalWrite(LED_PIN, LOW);
|
||||||
|
|
||||||
|
// Reset flag and clear APDS-9930 interrupt (IMPORTANT!)
|
||||||
|
isr_flag = false;
|
||||||
|
if ( !apds.clearAmbientLightInt() ) {
|
||||||
|
Serial.println("Error clearing interrupt");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void interruptRoutine() {
|
||||||
|
isr_flag = true;
|
||||||
|
}
|
113
firmware/libraries/APDS9930-master/examples/AmbientLightLED/AmbientLightLED.ino
Executable file
113
firmware/libraries/APDS9930-master/examples/AmbientLightLED/AmbientLightLED.ino
Executable file
|
@ -0,0 +1,113 @@
|
||||||
|
/****************************************************************
|
||||||
|
AmbientLightLED.ino
|
||||||
|
|
||||||
|
Tests the ambient light sensing abilities of the
|
||||||
|
APDS-9930. Configures APDS-9930 over I2C and polls the sensor for
|
||||||
|
ambient light levels, which are displayed over the
|
||||||
|
serial console.
|
||||||
|
|
||||||
|
Hardware Connections:
|
||||||
|
|
||||||
|
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||||
|
|
||||||
|
Arduino Pin APDS-9930 Board Function
|
||||||
|
|
||||||
|
3.3V VCC Power
|
||||||
|
GND GND Ground
|
||||||
|
A4 SDA I2C Data
|
||||||
|
A5 SCL I2C Clock
|
||||||
|
|
||||||
|
10 (pwm) LED anode
|
||||||
|
|
||||||
|
Distributed as-is; no warranty is given.
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#define PWM_LED_PIN 10
|
||||||
|
#define DUMP_REGS
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <APDS9930.h>
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
APDS9930 apds = APDS9930();
|
||||||
|
float ambient_light = 0; // can also be an unsigned long
|
||||||
|
uint16_t ch0 = 0;
|
||||||
|
uint16_t ch1 = 1;
|
||||||
|
float max_light = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//analogReference(EXTERNAL);
|
||||||
|
pinMode(PWM_LED_PIN, OUTPUT);
|
||||||
|
|
||||||
|
// Initialize Serial port
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println();
|
||||||
|
Serial.println(F("--------------------------------"));
|
||||||
|
Serial.println(F("APDS-9930 - Ambient light sensor"));
|
||||||
|
Serial.println(F("--------------------------------"));
|
||||||
|
|
||||||
|
// Initialize APDS-9930 (configure I2C and initial values)
|
||||||
|
if ( apds.init() ) {
|
||||||
|
Serial.println(F("APDS-9930 initialization complete"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start running the APDS-9930 light sensor (no interrupts)
|
||||||
|
if ( apds.enableLightSensor(false) ) {
|
||||||
|
Serial.println(F("Light sensor is now running"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during light sensor init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DUMP_REGS
|
||||||
|
/* Register dump */
|
||||||
|
uint8_t reg;
|
||||||
|
uint8_t val;
|
||||||
|
|
||||||
|
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||||
|
if( (reg != 0x10) && \
|
||||||
|
(reg != 0x11) )
|
||||||
|
{
|
||||||
|
apds.wireReadDataByte(reg, val);
|
||||||
|
Serial.print(reg, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apds.wireReadDataByte(0x1E, val);
|
||||||
|
Serial.print(0x1E, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Wait for initialization and calibration to finish
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
// Read the light levels (ambient, red, green, blue)
|
||||||
|
if ( !apds.readAmbientLightLux(ambient_light) ||
|
||||||
|
!apds.readCh0Light(ch0) ||
|
||||||
|
!apds.readCh1Light(ch1) ) {
|
||||||
|
Serial.println(F("Error reading light values"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("Ambient: "));
|
||||||
|
Serial.print(ambient_light);
|
||||||
|
Serial.print(F(" Ch0: "));
|
||||||
|
Serial.print(ch0);
|
||||||
|
Serial.print(F(" Ch1: "));
|
||||||
|
Serial.println(ch1);
|
||||||
|
|
||||||
|
if ( ambient_light > max_light ) {
|
||||||
|
max_light = ambient_light;
|
||||||
|
}
|
||||||
|
ambient_light = map(ambient_light, 0, max_light, 0, 1023);
|
||||||
|
analogWrite(PWM_LED_PIN, ambient_light);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait 1 second before next reading
|
||||||
|
delay(50);
|
||||||
|
}
|
|
@ -0,0 +1,120 @@
|
||||||
|
/****************************************************************
|
||||||
|
AmbientLightSensor.ino
|
||||||
|
APDS-9930 Ambient light and proximity sensor
|
||||||
|
Davide Depau
|
||||||
|
December 11, 2015
|
||||||
|
https://github.com/Davideddu/APDS9930
|
||||||
|
|
||||||
|
Shawn Hymel @ SparkFun Electronics
|
||||||
|
October 15, 2014
|
||||||
|
https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor
|
||||||
|
|
||||||
|
Tests thembient light sensing abilities of the
|
||||||
|
APDS-9930. Configures APDS-9930 over I2C and polls the sensor for
|
||||||
|
ambient light levels, which are displayed over the
|
||||||
|
serial console.
|
||||||
|
|
||||||
|
Hardware Connections:
|
||||||
|
|
||||||
|
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||||
|
|
||||||
|
Arduino Pin APDS-9930 Board Function
|
||||||
|
|
||||||
|
3.3V VCC Power
|
||||||
|
GND GND Ground
|
||||||
|
A4 SDA I2C Data
|
||||||
|
A5 SCL I2C Clock
|
||||||
|
|
||||||
|
Resources:
|
||||||
|
Include Wire.h and APDS-9930.h
|
||||||
|
|
||||||
|
Development environment specifics:
|
||||||
|
Written in Arduino 1.6.5
|
||||||
|
Tested with Arduino Uno and Mega.
|
||||||
|
|
||||||
|
This code is beerware; if you see me (or any other SparkFun
|
||||||
|
employee) at the local, and you've found our code helpful, please
|
||||||
|
buy us a round!
|
||||||
|
|
||||||
|
Distributed as-is; no warranty is given.
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#define DUMP_REGS
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <APDS9930.h>
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
APDS9930 apds = APDS9930();
|
||||||
|
float ambient_light = 0; // can also be an unsigned long
|
||||||
|
uint16_t ch0 = 0;
|
||||||
|
uint16_t ch1 = 1;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//analogReference(EXTERNAL);
|
||||||
|
|
||||||
|
// Initialize Serial port
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println();
|
||||||
|
Serial.println(F("--------------------------------"));
|
||||||
|
Serial.println(F("APDS-9930 - Ambient light sensor"));
|
||||||
|
Serial.println(F("--------------------------------"));
|
||||||
|
|
||||||
|
// Initialize APDS-9930 (configure I2C and initial values)
|
||||||
|
if ( apds.init() ) {
|
||||||
|
Serial.println(F("APDS-9930 initialization complete"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start running the APDS-9930 light sensor (no interrupts)
|
||||||
|
if ( apds.enableLightSensor(false) ) {
|
||||||
|
Serial.println(F("Light sensor is now running"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during light sensor init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DUMP_REGS
|
||||||
|
/* Register dump */
|
||||||
|
uint8_t reg;
|
||||||
|
uint8_t val;
|
||||||
|
|
||||||
|
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||||
|
if( (reg != 0x10) && \
|
||||||
|
(reg != 0x11) )
|
||||||
|
{
|
||||||
|
apds.wireReadDataByte(reg, val);
|
||||||
|
Serial.print(reg, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apds.wireReadDataByte(0x1E, val);
|
||||||
|
Serial.print(0x1E, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Wait for initialization and calibration to finish
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
// Read the light levels (ambient, red, green, blue)
|
||||||
|
if ( !apds.readAmbientLightLux(ambient_light) ||
|
||||||
|
!apds.readCh0Light(ch0) ||
|
||||||
|
!apds.readCh1Light(ch1) ) {
|
||||||
|
Serial.println(F("Error reading light values"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("Ambient: "));
|
||||||
|
Serial.print(ambient_light);
|
||||||
|
Serial.print(F(" Ch0: "));
|
||||||
|
Serial.print(ch0);
|
||||||
|
Serial.print(F(" Ch1: "));
|
||||||
|
Serial.println(ch1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait 1 second before next reading
|
||||||
|
delay(1000);
|
||||||
|
}
|
|
@ -0,0 +1,108 @@
|
||||||
|
/****************************************************************
|
||||||
|
AmbientLightToneAC.ino
|
||||||
|
|
||||||
|
Tests the ambient light sensing abilities of the
|
||||||
|
APDS-9930. Configures APDS-9930 over I2C and polls the sensor for
|
||||||
|
ambient light levels, which are displayed over the
|
||||||
|
serial console.
|
||||||
|
|
||||||
|
Hardware Connections:
|
||||||
|
|
||||||
|
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||||
|
|
||||||
|
Arduino Pin APDS-9930 Board Function
|
||||||
|
|
||||||
|
3.3V VCC Power
|
||||||
|
GND GND Ground
|
||||||
|
A4 SDA I2C Data
|
||||||
|
A5 SCL I2C Clock
|
||||||
|
|
||||||
|
Connect speakers to the correct pins. Check toneAC.h for more info.
|
||||||
|
|
||||||
|
Distributed as-is; no warranty is given.
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#define DUMP_REGS
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <APDS9930.h>
|
||||||
|
#include <toneAC.h>
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
APDS9930 apds = APDS9930();
|
||||||
|
float ambient_light = 0; // can also be an unsigned long
|
||||||
|
uint16_t ch0 = 0;
|
||||||
|
uint16_t ch1 = 1;
|
||||||
|
float max_light = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//analogReference(EXTERNAL);
|
||||||
|
|
||||||
|
// Initialize Serial port
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println();
|
||||||
|
Serial.println(F("--------------------------------"));
|
||||||
|
Serial.println(F("APDS-9930 - Ambient light sensor"));
|
||||||
|
Serial.println(F("--------------------------------"));
|
||||||
|
|
||||||
|
// Initialize APDS-9930 (configure I2C and initial values)
|
||||||
|
if ( apds.init() ) {
|
||||||
|
Serial.println(F("APDS-9930 initialization complete"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start running the APDS-9930 light sensor (no interrupts)
|
||||||
|
if ( apds.enableLightSensor(false) ) {
|
||||||
|
Serial.println(F("Light sensor is now running"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during light sensor init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DUMP_REGS
|
||||||
|
/* Register dump */
|
||||||
|
uint8_t reg;
|
||||||
|
uint8_t val;
|
||||||
|
|
||||||
|
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||||
|
if( (reg != 0x10) && \
|
||||||
|
(reg != 0x11) )
|
||||||
|
{
|
||||||
|
apds.wireReadDataByte(reg, val);
|
||||||
|
Serial.print(reg, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apds.wireReadDataByte(0x1E, val);
|
||||||
|
Serial.print(0x1E, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Wait for initialization and calibration to finish
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
// Read the light levels (ambient, red, green, blue)
|
||||||
|
if ( !apds.readAmbientLightLux(ambient_light) ||
|
||||||
|
!apds.readCh0Light(ch0) ||
|
||||||
|
!apds.readCh1Light(ch1) ) {
|
||||||
|
Serial.println(F("Error reading light values"));
|
||||||
|
} else {
|
||||||
|
Serial.print(F("Ambient: "));
|
||||||
|
Serial.print(ambient_light);
|
||||||
|
Serial.print(F(" Ch0: "));
|
||||||
|
Serial.print(ch0);
|
||||||
|
Serial.print(F(" Ch1: "));
|
||||||
|
Serial.println(ch1);
|
||||||
|
|
||||||
|
unsigned long freq = map(ch0, 0, 1024, 60, 16000);
|
||||||
|
toneAC(freq, 10, 50, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait 1 second before next reading
|
||||||
|
delay(50);
|
||||||
|
}
|
|
@ -0,0 +1,157 @@
|
||||||
|
/****************************************************************
|
||||||
|
ProximityInterrupt.ino
|
||||||
|
APDS-9930 Ambient light and proximity sensor
|
||||||
|
Davide Depau
|
||||||
|
December 11, 2015
|
||||||
|
https://github.com/Davideddu/APDS9930
|
||||||
|
|
||||||
|
Shawn Hymel @ SparkFun Electronics
|
||||||
|
October 24, 2014
|
||||||
|
https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor
|
||||||
|
|
||||||
|
Tests the proximity interrupt abilities of the APDS-9930.
|
||||||
|
Configures the APDS-9930 over I2C and waits for an external
|
||||||
|
interrupt based on high or low proximity conditions. Move your
|
||||||
|
hand near the sensor and watch the LED on pin 13.
|
||||||
|
|
||||||
|
Hardware Connections:
|
||||||
|
|
||||||
|
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||||
|
|
||||||
|
Arduino Pin APDS-9930 Board Function
|
||||||
|
|
||||||
|
3.3V VCC Power
|
||||||
|
GND GND Ground
|
||||||
|
A4 SDA I2C Data
|
||||||
|
A5 SCL I2C Clock
|
||||||
|
2 INT Interrupt
|
||||||
|
13 - LED
|
||||||
|
|
||||||
|
Resources:
|
||||||
|
Include Wire.h and APDS9930.h
|
||||||
|
|
||||||
|
Development environment specifics:
|
||||||
|
Written in Arduino 1.6.5
|
||||||
|
Tested with Arduino Uno and Mega
|
||||||
|
|
||||||
|
This code is beerware; if you see me (or any other SparkFun
|
||||||
|
employee) at the local, and you've found our code helpful, please
|
||||||
|
buy us a round!
|
||||||
|
|
||||||
|
Distributed as-is; no warranty is given.
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#define DUMP_REGS
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <APDS9930.h>
|
||||||
|
|
||||||
|
// Pins
|
||||||
|
#define APDS9930_INT 2 // Needs to be an interrupt pin
|
||||||
|
#define LED_PIN 13 // LED for showing interrupt
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
#define PROX_INT_HIGH 600 // Proximity level for interrupt
|
||||||
|
#define PROX_INT_LOW 0 // No far interrupt
|
||||||
|
|
||||||
|
// Global variables
|
||||||
|
APDS9930 apds = APDS9930();
|
||||||
|
uint16_t proximity_data = 0;
|
||||||
|
volatile bool isr_flag = false;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
// Set LED as output
|
||||||
|
pinMode(LED_PIN, OUTPUT);
|
||||||
|
pinMode(APDS9930_INT, INPUT);
|
||||||
|
|
||||||
|
// Initialize Serial port
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println();
|
||||||
|
Serial.println(F("------------------------------"));
|
||||||
|
Serial.println(F("APDS-9930 - ProximityInterrupt"));
|
||||||
|
Serial.println(F("------------------------------"));
|
||||||
|
|
||||||
|
// Initialize interrupt service routine
|
||||||
|
attachInterrupt(0, interruptRoutine, FALLING);
|
||||||
|
|
||||||
|
// Initialize APDS-9930 (configure I2C and initial values)
|
||||||
|
if ( apds.init() ) {
|
||||||
|
Serial.println(F("APDS-9930 initialization complete"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adjust the Proximity sensor gain
|
||||||
|
if ( !apds.setProximityGain(PGAIN_2X) ) {
|
||||||
|
Serial.println(F("Something went wrong trying to set PGAIN"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set proximity interrupt thresholds
|
||||||
|
if ( !apds.setProximityIntLowThreshold(PROX_INT_LOW) ) {
|
||||||
|
Serial.println(F("Error writing low threshold"));
|
||||||
|
}
|
||||||
|
if ( !apds.setProximityIntHighThreshold(PROX_INT_HIGH) ) {
|
||||||
|
Serial.println(F("Error writing high threshold"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start running the APDS-9930 proximity sensor (interrupts)
|
||||||
|
if ( apds.enableProximitySensor(true) ) {
|
||||||
|
Serial.println(F("Proximity sensor is now running"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during sensor init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DUMP_REGS
|
||||||
|
/* Register dump */
|
||||||
|
uint8_t reg;
|
||||||
|
uint8_t val;
|
||||||
|
|
||||||
|
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||||
|
if( (reg != 0x10) && \
|
||||||
|
(reg != 0x11) )
|
||||||
|
{
|
||||||
|
apds.wireReadDataByte(reg, val);
|
||||||
|
Serial.print(reg, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apds.wireReadDataByte(0x1E, val);
|
||||||
|
Serial.print(0x1E, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
// If interrupt occurs, print out the proximity level
|
||||||
|
if ( isr_flag ) {
|
||||||
|
|
||||||
|
// Read proximity level and print it out
|
||||||
|
if ( !apds.readProximity(proximity_data) ) {
|
||||||
|
Serial.println("Error reading proximity value");
|
||||||
|
} else {
|
||||||
|
Serial.print("Proximity detected! Level: ");
|
||||||
|
Serial.println(proximity_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Turn on LED for a half a second
|
||||||
|
digitalWrite(LED_PIN, HIGH);
|
||||||
|
delay(500);
|
||||||
|
digitalWrite(LED_PIN, LOW);
|
||||||
|
|
||||||
|
// Reset flag and clear APDS-9930 interrupt (IMPORTANT!)
|
||||||
|
isr_flag = false;
|
||||||
|
if ( !apds.clearProximityInt() ) {
|
||||||
|
Serial.println("Error clearing interrupt");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void interruptRoutine() {
|
||||||
|
isr_flag = true;
|
||||||
|
}
|
131
firmware/libraries/APDS9930-master/examples/ProximityLED/ProximityLED.ino
Executable file
131
firmware/libraries/APDS9930-master/examples/ProximityLED/ProximityLED.ino
Executable file
|
@ -0,0 +1,131 @@
|
||||||
|
/****************************************************************
|
||||||
|
ProximityLED.ino
|
||||||
|
Davide Depau
|
||||||
|
December 11, 2015
|
||||||
|
https://github.com/Davideddu/APDS9930
|
||||||
|
|
||||||
|
https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor
|
||||||
|
|
||||||
|
Tests the proximity sensing abilities of the APDS-9930.
|
||||||
|
Configures the APDS-9930 over I2C and polls for the distance to
|
||||||
|
the object nearest the sensor, then turns on an LED accordingly.
|
||||||
|
|
||||||
|
Hardware Connections:
|
||||||
|
|
||||||
|
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||||
|
|
||||||
|
Arduino Pin APDS-9930 Board Function
|
||||||
|
|
||||||
|
3.3V VCC Power
|
||||||
|
GND GND Ground
|
||||||
|
A4 SDA I2C Data
|
||||||
|
A5 SCL I2C Clock
|
||||||
|
|
||||||
|
10 (PWM) LED Anode
|
||||||
|
|
||||||
|
Resources:
|
||||||
|
Include Wire.h and APDS9930.h
|
||||||
|
|
||||||
|
Development environment specifics:
|
||||||
|
Written in Sublime Text + Stino + Arduino 1.7.2
|
||||||
|
Tested with Arduino Uno + level shifter
|
||||||
|
|
||||||
|
This code is chocolateware; if you see me at the grocery store,
|
||||||
|
and you've found our code helpful, please buy us me a chocolate bar! :D
|
||||||
|
|
||||||
|
Distributed as-is; no warranty is given.
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#define DUMP_REGS
|
||||||
|
#define PWM_LED_PIN 10
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <APDS9930.h>
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
APDS9930 apds = APDS9930();
|
||||||
|
uint16_t proximity_data = 0;
|
||||||
|
int proximity_max = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//analogReference(EXTERNAL);
|
||||||
|
pinMode(PWM_LED_PIN, OUTPUT);
|
||||||
|
|
||||||
|
// Initialize Serial port
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println();
|
||||||
|
Serial.println(F("------------------------"));
|
||||||
|
Serial.println(F("APDS-9930 - ProximityLED"));
|
||||||
|
Serial.println(F("------------------------"));
|
||||||
|
|
||||||
|
// Initialize APDS-9930 (configure I2C and initial values)
|
||||||
|
if ( apds.init() ) {
|
||||||
|
Serial.println(F("APDS-9930 initialization complete"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adjust the Proximity sensor gain
|
||||||
|
if ( !apds.setProximityGain(PGAIN_1X) ) {
|
||||||
|
Serial.println(F("Something went wrong trying to set PGAIN"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start running the APDS-9930 proximity sensor (no interrupts)
|
||||||
|
if ( apds.enableProximitySensor(false) ) {
|
||||||
|
Serial.println(F("Proximity sensor is now running"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during sensor init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DUMP_REGS
|
||||||
|
/* Register dump */
|
||||||
|
uint8_t reg;
|
||||||
|
uint8_t val;
|
||||||
|
|
||||||
|
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||||
|
if( (reg != 0x10) && \
|
||||||
|
(reg != 0x11) )
|
||||||
|
{
|
||||||
|
apds.wireReadDataByte(reg, val);
|
||||||
|
Serial.print(reg, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apds.wireReadDataByte(0x1E, val);
|
||||||
|
Serial.print(0x1E, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
// Read the proximity value
|
||||||
|
if ( !apds.readProximity(proximity_data) ) {
|
||||||
|
Serial.println("Error reading proximity value");
|
||||||
|
} else {
|
||||||
|
Serial.print("Proximity: ");
|
||||||
|
Serial.print(proximity_data);
|
||||||
|
|
||||||
|
// This is an ugly hack to reduce sensor noise.
|
||||||
|
// You may want to adjust POFFSET instead.
|
||||||
|
/*
|
||||||
|
proximity_data -= 200;
|
||||||
|
if (proximity_data > 50000) {
|
||||||
|
proximity_data = 0;
|
||||||
|
}
|
||||||
|
if (proximity_data > proximity_max) {
|
||||||
|
proximity_max = proximity_data;
|
||||||
|
}
|
||||||
|
proximity_data = map(proximity_data, 0, proximity_max, 0, 1023);
|
||||||
|
*/
|
||||||
|
|
||||||
|
Serial.print(F(" Remapped: "));
|
||||||
|
Serial.println(proximity_data);
|
||||||
|
analogWrite(PWM_LED_PIN, proximity_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait 250 ms before next reading
|
||||||
|
delay(10);
|
||||||
|
}
|
113
firmware/libraries/APDS9930-master/examples/ProximitySensor/ProximitySensor.ino
Executable file
113
firmware/libraries/APDS9930-master/examples/ProximitySensor/ProximitySensor.ino
Executable file
|
@ -0,0 +1,113 @@
|
||||||
|
/****************************************************************
|
||||||
|
ProximitySensor.ino
|
||||||
|
APDS-9930 ambient light and proximity sensor
|
||||||
|
Davide Depau
|
||||||
|
December 11, 2015
|
||||||
|
https://github.com/Davideddu/APDS9930
|
||||||
|
|
||||||
|
Shawn Hymel @ SparkFun Electronics
|
||||||
|
October 28, 2014
|
||||||
|
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
|
||||||
|
|
||||||
|
Tests the proximity sensing abilities of the APDS-9930.
|
||||||
|
Configures the APDS-9930 over I2C and polls for the distance to
|
||||||
|
the object nearest the sensor.
|
||||||
|
|
||||||
|
Hardware Connections:
|
||||||
|
|
||||||
|
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||||
|
|
||||||
|
Arduino Pin APDS-9930 Board Function
|
||||||
|
|
||||||
|
3.3V VCC Power
|
||||||
|
GND GND Ground
|
||||||
|
A4 SDA I2C Data
|
||||||
|
A5 SCL I2C Clock
|
||||||
|
|
||||||
|
Resources:
|
||||||
|
Include Wire.h and SparkFun_APDS-9930.h
|
||||||
|
|
||||||
|
Development environment specifics:
|
||||||
|
Written in Arduino 1.0.5
|
||||||
|
Tested with SparkFun Arduino Pro Mini 3.3V
|
||||||
|
|
||||||
|
This code is beerware; if you see me (or any other SparkFun
|
||||||
|
employee) at the local, and you've found our code helpful, please
|
||||||
|
buy us a round!
|
||||||
|
|
||||||
|
Distributed as-is; no warranty is given.
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#define DUMP_REGS
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <APDS9930.h>
|
||||||
|
|
||||||
|
// Global Variables
|
||||||
|
APDS9930 apds = APDS9930();
|
||||||
|
uint16_t proximity_data = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//analogReference(EXTERNAL);
|
||||||
|
|
||||||
|
// Initialize Serial port
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println();
|
||||||
|
Serial.println(F("---------------------------"));
|
||||||
|
Serial.println(F("APDS-9930 - ProximitySensor"));
|
||||||
|
Serial.println(F("---------------------------"));
|
||||||
|
|
||||||
|
// Initialize APDS-9930 (configure I2C and initial values)
|
||||||
|
if ( apds.init() ) {
|
||||||
|
Serial.println(F("APDS-9930 initialization complete"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// // Adjust the Proximity sensor gain
|
||||||
|
// if ( !apds.setProximityGain(PGAIN_2X) ) {
|
||||||
|
// Serial.println(F("Something went wrong trying to set PGAIN"));
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Start running the APDS-9930 proximity sensor (no interrupts)
|
||||||
|
if ( apds.enableProximitySensor(false) ) {
|
||||||
|
Serial.println(F("Proximity sensor is now running"));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Something went wrong during sensor init!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DUMP_REGS
|
||||||
|
/* Register dump */
|
||||||
|
uint8_t reg;
|
||||||
|
uint8_t val;
|
||||||
|
|
||||||
|
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||||
|
if( (reg != 0x10) && \
|
||||||
|
(reg != 0x11) )
|
||||||
|
{
|
||||||
|
apds.wireReadDataByte(reg, val);
|
||||||
|
Serial.print(reg, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apds.wireReadDataByte(0x1E, val);
|
||||||
|
Serial.print(0x1E, HEX);
|
||||||
|
Serial.print(": 0x");
|
||||||
|
Serial.println(val, HEX);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
// Read the proximity value
|
||||||
|
if ( !apds.readProximity(proximity_data) ) {
|
||||||
|
Serial.println("Error reading proximity value");
|
||||||
|
} else {
|
||||||
|
Serial.print("Proximity: ");
|
||||||
|
Serial.println(proximity_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait 250 ms before next reading
|
||||||
|
delay(250);
|
||||||
|
}
|
0
firmware/libraries/APDS9930-master/keywords.txt
Executable file
0
firmware/libraries/APDS9930-master/keywords.txt
Executable file
9
firmware/libraries/APDS9930-master/library.properties
Executable file
9
firmware/libraries/APDS9930-master/library.properties
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
name=APDS-9930 Ambient Light and Proximity Sensor
|
||||||
|
version=1.5.1
|
||||||
|
author=Davide Depau
|
||||||
|
maintainer=Davide Depau
|
||||||
|
sentence=Library for the Avago APDS-9930 sensor
|
||||||
|
paragraph=This library works with the breakout board for the Avago APDS-9930 proximity and light sensor
|
||||||
|
category=Sensors
|
||||||
|
url=https://github.com/Davideddu/APDS9930
|
||||||
|
architectures=*
|
1147
firmware/libraries/APDS9930-master/src/APDS9930.cpp
Executable file
1147
firmware/libraries/APDS9930-master/src/APDS9930.cpp
Executable file
File diff suppressed because it is too large
Load diff
231
firmware/libraries/APDS9930-master/src/APDS9930.h
Executable file
231
firmware/libraries/APDS9930-master/src/APDS9930.h
Executable file
|
@ -0,0 +1,231 @@
|
||||||
|
/**
|
||||||
|
* @file APDS-9930.h
|
||||||
|
* @brief Library for the SparkFun APDS-9930 breakout board
|
||||||
|
* @author Shawn Hymel (SparkFun Electronics)
|
||||||
|
*
|
||||||
|
* @copyright This code is public domain but you buy me a beer if you use
|
||||||
|
* this and we meet someday (Beerware license).
|
||||||
|
*
|
||||||
|
* This library interfaces the Avago APDS-9930 to Arduino over I2C. The library
|
||||||
|
* relies on the Arduino Wire (I2C) library. to use the library, instantiate an
|
||||||
|
* APDS9930 object, call init(), and call the appropriate functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef APDS9930_H
|
||||||
|
#define APDS9930_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
/* Debug */
|
||||||
|
#define DEBUG 0
|
||||||
|
|
||||||
|
/* APDS-9930 I2C address */
|
||||||
|
#define APDS9930_I2C_ADDR 0x39
|
||||||
|
|
||||||
|
/* Command register modes */
|
||||||
|
#define REPEATED_BYTE 0x80
|
||||||
|
#define AUTO_INCREMENT 0xA0
|
||||||
|
#define SPECIAL_FN 0xE0
|
||||||
|
|
||||||
|
/* Error code for returned values */
|
||||||
|
#define ERROR 0xFF
|
||||||
|
|
||||||
|
/* Acceptable device IDs */
|
||||||
|
#define APDS9930_ID_1 0x12
|
||||||
|
#define APDS9930_ID_2 0x39
|
||||||
|
|
||||||
|
/* Misc parameters */
|
||||||
|
#define FIFO_PAUSE_TIME 30 // Wait period (ms) between FIFO reads
|
||||||
|
|
||||||
|
/* APDS-9930 register addresses */
|
||||||
|
#define APDS9930_ENABLE 0x00
|
||||||
|
#define APDS9930_ATIME 0x01
|
||||||
|
#define APDS9930_PTIME 0x02
|
||||||
|
#define APDS9930_WTIME 0x03
|
||||||
|
#define APDS9930_AILTL 0x04
|
||||||
|
#define APDS9930_AILTH 0x05
|
||||||
|
#define APDS9930_AIHTL 0x06
|
||||||
|
#define APDS9930_AIHTH 0x07
|
||||||
|
#define APDS9930_PILTL 0x08
|
||||||
|
#define APDS9930_PILTH 0x09
|
||||||
|
#define APDS9930_PIHTL 0x0A
|
||||||
|
#define APDS9930_PIHTH 0x0B
|
||||||
|
#define APDS9930_PERS 0x0C
|
||||||
|
#define APDS9930_CONFIG 0x0D
|
||||||
|
#define APDS9930_PPULSE 0x0E
|
||||||
|
#define APDS9930_CONTROL 0x0F
|
||||||
|
#define APDS9930_ID 0x12
|
||||||
|
#define APDS9930_STATUS 0x13
|
||||||
|
#define APDS9930_Ch0DATAL 0x14
|
||||||
|
#define APDS9930_Ch0DATAH 0x15
|
||||||
|
#define APDS9930_Ch1DATAL 0x16
|
||||||
|
#define APDS9930_Ch1DATAH 0x17
|
||||||
|
#define APDS9930_PDATAL 0x18
|
||||||
|
#define APDS9930_PDATAH 0x19
|
||||||
|
#define APDS9930_POFFSET 0x1E
|
||||||
|
|
||||||
|
|
||||||
|
/* Bit fields */
|
||||||
|
#define APDS9930_PON 0b00000001
|
||||||
|
#define APDS9930_AEN 0b00000010
|
||||||
|
#define APDS9930_PEN 0b00000100
|
||||||
|
#define APDS9930_WEN 0b00001000
|
||||||
|
#define APSD9930_AIEN 0b00010000
|
||||||
|
#define APDS9930_PIEN 0b00100000
|
||||||
|
#define APDS9930_SAI 0b01000000
|
||||||
|
|
||||||
|
/* On/Off definitions */
|
||||||
|
#define OFF 0
|
||||||
|
#define ON 1
|
||||||
|
|
||||||
|
/* Acceptable parameters for setMode */
|
||||||
|
#define POWER 0
|
||||||
|
#define AMBIENT_LIGHT 1
|
||||||
|
#define PROXIMITY 2
|
||||||
|
#define WAIT 3
|
||||||
|
#define AMBIENT_LIGHT_INT 4
|
||||||
|
#define PROXIMITY_INT 5
|
||||||
|
#define SLEEP_AFTER_INT 6
|
||||||
|
#define ALL 7
|
||||||
|
|
||||||
|
/* LED Drive values */
|
||||||
|
#define LED_DRIVE_100MA 0
|
||||||
|
#define LED_DRIVE_50MA 1
|
||||||
|
#define LED_DRIVE_25MA 2
|
||||||
|
#define LED_DRIVE_12_5MA 3
|
||||||
|
|
||||||
|
/* Proximity Gain (PGAIN) values */
|
||||||
|
#define PGAIN_1X 0
|
||||||
|
#define PGAIN_2X 1
|
||||||
|
#define PGAIN_4X 2
|
||||||
|
#define PGAIN_8X 3
|
||||||
|
|
||||||
|
/* ALS Gain (AGAIN) values */
|
||||||
|
#define AGAIN_1X 0
|
||||||
|
#define AGAIN_8X 1
|
||||||
|
#define AGAIN_16X 2
|
||||||
|
#define AGAIN_120X 3
|
||||||
|
|
||||||
|
/* Interrupt clear values */
|
||||||
|
#define CLEAR_PROX_INT 0xE5
|
||||||
|
#define CLEAR_ALS_INT 0xE6
|
||||||
|
#define CLEAR_ALL_INTS 0xE7
|
||||||
|
|
||||||
|
/* Default values */
|
||||||
|
#define DEFAULT_ATIME 0xED
|
||||||
|
#define DEFAULT_WTIME 0xFF
|
||||||
|
#define DEFAULT_PTIME 0xFF
|
||||||
|
#define DEFAULT_PPULSE 0x08
|
||||||
|
#define DEFAULT_POFFSET 0 // 0 offset
|
||||||
|
#define DEFAULT_CONFIG 0
|
||||||
|
#define DEFAULT_PDRIVE LED_DRIVE_100MA
|
||||||
|
#define DEFAULT_PDIODE 2
|
||||||
|
#define DEFAULT_PGAIN PGAIN_8X
|
||||||
|
#define DEFAULT_AGAIN AGAIN_1X
|
||||||
|
#define DEFAULT_PILT 0 // Low proximity threshold
|
||||||
|
#define DEFAULT_PIHT 50 // High proximity threshold
|
||||||
|
#define DEFAULT_AILT 0xFFFF // Force interrupt for calibration
|
||||||
|
#define DEFAULT_AIHT 0
|
||||||
|
#define DEFAULT_PERS 0x22 // 2 consecutive prox or ALS for int.
|
||||||
|
|
||||||
|
/* ALS coefficients */
|
||||||
|
#define DF 52
|
||||||
|
#define GA 0.49
|
||||||
|
#define B 1.862
|
||||||
|
#define C 0.746
|
||||||
|
#define D 1.291
|
||||||
|
|
||||||
|
/* State definitions */
|
||||||
|
enum {
|
||||||
|
NOTAVAILABLE_STATE,
|
||||||
|
NEAR_STATE,
|
||||||
|
FAR_STATE,
|
||||||
|
ALL_STATE
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef _AVR_IO_H_
|
||||||
|
// Do not use this alias as it's deprecated
|
||||||
|
#define NA_STATE NOTAVAILABLE_STATE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* APDS9930 Class */
|
||||||
|
class APDS9930 {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/* Initialization methods */
|
||||||
|
APDS9930();
|
||||||
|
~APDS9930();
|
||||||
|
bool init();
|
||||||
|
uint8_t getMode();
|
||||||
|
bool setMode(uint8_t mode, uint8_t enable);
|
||||||
|
|
||||||
|
/* Turn the APDS-9930 on and off */
|
||||||
|
bool enablePower();
|
||||||
|
bool disablePower();
|
||||||
|
|
||||||
|
/* Enable or disable specific sensors */
|
||||||
|
bool enableLightSensor(bool interrupts = false);
|
||||||
|
bool disableLightSensor();
|
||||||
|
bool enableProximitySensor(bool interrupts = false);
|
||||||
|
bool disableProximitySensor();
|
||||||
|
|
||||||
|
/* LED drive strength control */
|
||||||
|
uint8_t getLEDDrive();
|
||||||
|
bool setLEDDrive(uint8_t drive);
|
||||||
|
// uint8_t getGestureLEDDrive();
|
||||||
|
// bool setGestureLEDDrive(uint8_t drive);
|
||||||
|
|
||||||
|
/* Gain control */
|
||||||
|
uint8_t getAmbientLightGain();
|
||||||
|
bool setAmbientLightGain(uint8_t gain);
|
||||||
|
uint8_t getProximityGain();
|
||||||
|
bool setProximityGain(uint8_t gain);
|
||||||
|
bool setProximityDiode(uint8_t drive);
|
||||||
|
uint8_t getProximityDiode();
|
||||||
|
|
||||||
|
|
||||||
|
/* Get and set light interrupt thresholds */
|
||||||
|
bool getLightIntLowThreshold(uint16_t &threshold);
|
||||||
|
bool setLightIntLowThreshold(uint16_t threshold);
|
||||||
|
bool getLightIntHighThreshold(uint16_t &threshold);
|
||||||
|
bool setLightIntHighThreshold(uint16_t threshold);
|
||||||
|
|
||||||
|
/* Get and set interrupt enables */
|
||||||
|
uint8_t getAmbientLightIntEnable();
|
||||||
|
bool setAmbientLightIntEnable(uint8_t enable);
|
||||||
|
uint8_t getProximityIntEnable();
|
||||||
|
bool setProximityIntEnable(uint8_t enable);
|
||||||
|
|
||||||
|
/* Clear interrupts */
|
||||||
|
bool clearAmbientLightInt();
|
||||||
|
bool clearProximityInt();
|
||||||
|
bool clearAllInts();
|
||||||
|
|
||||||
|
/* Proximity methods */
|
||||||
|
bool readProximity(uint16_t &val);
|
||||||
|
|
||||||
|
/* Ambient light methods */
|
||||||
|
bool readAmbientLightLux(float &val);
|
||||||
|
bool readAmbientLightLux(unsigned long &val);
|
||||||
|
float floatAmbientToLux(uint16_t Ch0, uint16_t Ch1);
|
||||||
|
unsigned long ulongAmbientToLux(uint16_t Ch0, uint16_t Ch1);
|
||||||
|
bool readCh0Light(uint16_t &val);
|
||||||
|
bool readCh1Light(uint16_t &val);
|
||||||
|
|
||||||
|
//private:
|
||||||
|
|
||||||
|
/* Proximity Interrupt Threshold */
|
||||||
|
uint16_t getProximityIntLowThreshold();
|
||||||
|
bool setProximityIntLowThreshold(uint16_t threshold);
|
||||||
|
uint16_t getProximityIntHighThreshold();
|
||||||
|
bool setProximityIntHighThreshold(uint16_t threshold);
|
||||||
|
|
||||||
|
/* Raw I2C Commands */
|
||||||
|
bool wireWriteByte(uint8_t val);
|
||||||
|
bool wireWriteDataByte(uint8_t reg, uint8_t val);
|
||||||
|
bool wireWriteDataBlock(uint8_t reg, uint8_t *val, unsigned int len);
|
||||||
|
bool wireReadDataByte(uint8_t reg, uint8_t &val);
|
||||||
|
int wireReadDataBlock(uint8_t reg, uint8_t *val, unsigned int len);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
726
firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.cpp
Executable file
726
firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.cpp
Executable file
|
@ -0,0 +1,726 @@
|
||||||
|
/*!
|
||||||
|
* @file Adafruit_APDS9960.cpp
|
||||||
|
*
|
||||||
|
* @mainpage Adafruit APDS9960 Proximity, Light, RGB, and Gesture Sensor
|
||||||
|
*
|
||||||
|
* @section author Author
|
||||||
|
*
|
||||||
|
* Ladyada, Dean Miller (Adafruit Industries)
|
||||||
|
*
|
||||||
|
* @section license License
|
||||||
|
*
|
||||||
|
* Software License Agreement (BSD License)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2017, Adafruit Industries
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the copyright holders nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __AVR
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#elif defined(ESP8266)
|
||||||
|
#include <pgmspace.h>
|
||||||
|
#endif
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "Adafruit_APDS9960.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Implements missing powf function
|
||||||
|
* @param x
|
||||||
|
* Base number
|
||||||
|
* @param y
|
||||||
|
* Exponent
|
||||||
|
* @return x raised to the power of y
|
||||||
|
*/
|
||||||
|
float powf(const float x, const float y) {
|
||||||
|
return (float)(pow((double)x, (double)y));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enables the device
|
||||||
|
* Disables the device (putting it in lower power sleep mode)
|
||||||
|
* @param en
|
||||||
|
* Enable (True/False)
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::enable(boolean en) {
|
||||||
|
_enable.PON = en;
|
||||||
|
this->write8(APDS9960_ENABLE, _enable.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes I2C and configures the sensor
|
||||||
|
* @param iTimeMS
|
||||||
|
* Integration time
|
||||||
|
* @param aGain
|
||||||
|
* Gain
|
||||||
|
* @param addr
|
||||||
|
* I2C address
|
||||||
|
* @param *theWire
|
||||||
|
* Wire object
|
||||||
|
* @return True if initialization was successful, otherwise false.
|
||||||
|
*/
|
||||||
|
boolean Adafruit_APDS9960::begin(uint16_t iTimeMS, apds9960AGain_t aGain,
|
||||||
|
uint8_t addr, TwoWire *theWire) {
|
||||||
|
_wire = theWire;
|
||||||
|
_i2c_init();
|
||||||
|
_i2caddr = addr;
|
||||||
|
|
||||||
|
/* Make sure we're actually connected */
|
||||||
|
uint8_t x = read8(APDS9960_ID);
|
||||||
|
if (x != 0xAB) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set default integration time and gain */
|
||||||
|
setADCIntegrationTime(iTimeMS);
|
||||||
|
setADCGain(aGain);
|
||||||
|
|
||||||
|
// disable everything to start
|
||||||
|
enableGesture(false);
|
||||||
|
enableProximity(false);
|
||||||
|
enableColor(false);
|
||||||
|
|
||||||
|
disableColorInterrupt();
|
||||||
|
disableProximityInterrupt();
|
||||||
|
clearInterrupt();
|
||||||
|
|
||||||
|
/* Note: by default, the device is in power down mode on bootup */
|
||||||
|
enable(false);
|
||||||
|
delay(10);
|
||||||
|
enable(true);
|
||||||
|
delay(10);
|
||||||
|
|
||||||
|
// default to all gesture dimensions
|
||||||
|
setGestureDimensions(APDS9960_DIMENSIONS_ALL);
|
||||||
|
setGestureFIFOThreshold(APDS9960_GFIFO_4);
|
||||||
|
setGestureGain(APDS9960_GGAIN_4);
|
||||||
|
setGestureProximityThreshold(50);
|
||||||
|
resetCounts();
|
||||||
|
|
||||||
|
_gpulse.GPLEN = APDS9960_GPULSE_32US;
|
||||||
|
_gpulse.GPULSE = 9; // 10 pulses
|
||||||
|
this->write8(APDS9960_GPULSE, _gpulse.get());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the integration time for the ADC of the APDS9960, in millis
|
||||||
|
* @param iTimeMS
|
||||||
|
* Integration time
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setADCIntegrationTime(uint16_t iTimeMS) {
|
||||||
|
float temp;
|
||||||
|
|
||||||
|
// convert ms into 2.78ms increments
|
||||||
|
temp = iTimeMS;
|
||||||
|
temp /= 2.78;
|
||||||
|
temp = 256 - temp;
|
||||||
|
if (temp > 255)
|
||||||
|
temp = 255;
|
||||||
|
if (temp < 0)
|
||||||
|
temp = 0;
|
||||||
|
|
||||||
|
/* Update the timing register */
|
||||||
|
write8(APDS9960_ATIME, (uint8_t)temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the integration time for the ADC of the APDS9960, in millis
|
||||||
|
* @return Integration time
|
||||||
|
*/
|
||||||
|
float Adafruit_APDS9960::getADCIntegrationTime() {
|
||||||
|
float temp;
|
||||||
|
|
||||||
|
temp = read8(APDS9960_ATIME);
|
||||||
|
|
||||||
|
// convert to units of 2.78 ms
|
||||||
|
temp = 256 - temp;
|
||||||
|
temp *= 2.78;
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Adjusts the color/ALS gain on the APDS9960 (adjusts the sensitivity
|
||||||
|
* to light)
|
||||||
|
* @param aGain
|
||||||
|
* Gain
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setADCGain(apds9960AGain_t aGain) {
|
||||||
|
_control.AGAIN = aGain;
|
||||||
|
|
||||||
|
/* Update the timing register */
|
||||||
|
write8(APDS9960_CONTROL, _control.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the ADC gain
|
||||||
|
* @return ADC gain
|
||||||
|
*/
|
||||||
|
apds9960AGain_t Adafruit_APDS9960::getADCGain() {
|
||||||
|
return (apds9960AGain_t)(read8(APDS9960_CONTROL) & 0x03);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Adjusts the Proximity gain on the APDS9960
|
||||||
|
* @param pGain
|
||||||
|
* Gain
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setProxGain(apds9960PGain_t pGain) {
|
||||||
|
_control.PGAIN = pGain;
|
||||||
|
|
||||||
|
/* Update the timing register */
|
||||||
|
write8(APDS9960_CONTROL, _control.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the Proximity gain on the APDS9960
|
||||||
|
* @return Proxmity gain
|
||||||
|
*/
|
||||||
|
apds9960PGain_t Adafruit_APDS9960::getProxGain() {
|
||||||
|
return (apds9960PGain_t)(read8(APDS9960_CONTROL) & 0x0C);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets number of proxmity pulses
|
||||||
|
* @param pLen
|
||||||
|
* Pulse Length
|
||||||
|
* @param pulses
|
||||||
|
* Number of pulses
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setProxPulse(apds9960PPulseLen_t pLen, uint8_t pulses) {
|
||||||
|
if (pulses < 1)
|
||||||
|
pulses = 1;
|
||||||
|
if (pulses > 64)
|
||||||
|
pulses = 64;
|
||||||
|
pulses--;
|
||||||
|
|
||||||
|
_ppulse.PPLEN = pLen;
|
||||||
|
_ppulse.PPULSE = pulses;
|
||||||
|
|
||||||
|
write8(APDS9960_PPULSE, _ppulse.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable proximity readings on APDS9960
|
||||||
|
* @param en
|
||||||
|
* Enable (True/False)
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::enableProximity(boolean en) {
|
||||||
|
_enable.PEN = en;
|
||||||
|
|
||||||
|
write8(APDS9960_ENABLE, _enable.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable proximity interrupts
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::enableProximityInterrupt() {
|
||||||
|
_enable.PIEN = 1;
|
||||||
|
write8(APDS9960_ENABLE, _enable.get());
|
||||||
|
clearInterrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disable proximity interrupts
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::disableProximityInterrupt() {
|
||||||
|
_enable.PIEN = 0;
|
||||||
|
write8(APDS9960_ENABLE, _enable.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Set proxmity interrupt thresholds
|
||||||
|
* @param low
|
||||||
|
* Low threshold
|
||||||
|
* @param high
|
||||||
|
* High threshold
|
||||||
|
* @param persistance
|
||||||
|
* Persistance
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setProximityInterruptThreshold(uint8_t low,
|
||||||
|
uint8_t high,
|
||||||
|
uint8_t persistance) {
|
||||||
|
write8(APDS9960_PILT, low);
|
||||||
|
write8(APDS9960_PIHT, high);
|
||||||
|
|
||||||
|
if (persistance > 7)
|
||||||
|
persistance = 7;
|
||||||
|
_pers.PPERS = persistance;
|
||||||
|
write8(APDS9960_PERS, _pers.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns proxmity interrupt status
|
||||||
|
* @return True if enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool Adafruit_APDS9960::getProximityInterrupt() {
|
||||||
|
_status.set(this->read8(APDS9960_STATUS));
|
||||||
|
return _status.PINT;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Read proximity data
|
||||||
|
* @return Proximity
|
||||||
|
*/
|
||||||
|
uint8_t Adafruit_APDS9960::readProximity() { return read8(APDS9960_PDATA); }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns validity status of a gesture
|
||||||
|
* @return Status (True/False)
|
||||||
|
*/
|
||||||
|
bool Adafruit_APDS9960::gestureValid() {
|
||||||
|
_gstatus.set(this->read8(APDS9960_GSTATUS));
|
||||||
|
return _gstatus.GVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets gesture dimensions
|
||||||
|
* @param dims
|
||||||
|
* Dimensions (APDS9960_DIMENSIONS_ALL, APDS9960_DIMENSIONS_UP_DOWM,
|
||||||
|
* APDS9960_DIMENSIONS_UP_DOWN, APGS9960_DIMENSIONS_LEFT_RIGHT)
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setGestureDimensions(uint8_t dims) {
|
||||||
|
_gconf3.GDIMS = dims;
|
||||||
|
this->write8(APDS9960_GCONF3, _gconf3.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets gesture FIFO Threshold
|
||||||
|
* @param thresh
|
||||||
|
* Threshold (APDS9960_GFIFO_1, APDS9960_GFIFO_4, APDS9960_GFIFO_8,
|
||||||
|
* APDS9960_GFIFO_16)
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setGestureFIFOThreshold(uint8_t thresh) {
|
||||||
|
_gconf1.GFIFOTH = thresh;
|
||||||
|
this->write8(APDS9960_GCONF1, _gconf1.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets gesture sensor gain
|
||||||
|
* @param gain
|
||||||
|
* Gain (APDS9960_GAIN_1, APDS9960_GAIN_2, APDS9960_GAIN_4,
|
||||||
|
* APDS9960_GAIN_8)
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setGestureGain(uint8_t gain) {
|
||||||
|
_gconf2.GGAIN = gain;
|
||||||
|
this->write8(APDS9960_GCONF2, _gconf2.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets gesture sensor threshold
|
||||||
|
* @param thresh
|
||||||
|
* Threshold
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setGestureProximityThreshold(uint8_t thresh) {
|
||||||
|
this->write8(APDS9960_GPENTH, thresh);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets gesture sensor offset
|
||||||
|
* @param offset_up
|
||||||
|
* Up offset
|
||||||
|
* @param offset_down
|
||||||
|
* Down offset
|
||||||
|
* @param offset_left
|
||||||
|
* Left offset
|
||||||
|
* @param offset_right
|
||||||
|
* Right offset
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setGestureOffset(uint8_t offset_up, uint8_t offset_down,
|
||||||
|
uint8_t offset_left,
|
||||||
|
uint8_t offset_right) {
|
||||||
|
this->write8(APDS9960_GOFFSET_U, offset_up);
|
||||||
|
this->write8(APDS9960_GOFFSET_D, offset_down);
|
||||||
|
this->write8(APDS9960_GOFFSET_L, offset_left);
|
||||||
|
this->write8(APDS9960_GOFFSET_R, offset_right);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable gesture readings on APDS9960
|
||||||
|
* @param en
|
||||||
|
* Enable (True/False)
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::enableGesture(boolean en) {
|
||||||
|
if (!en) {
|
||||||
|
_gconf4.GMODE = 0;
|
||||||
|
write8(APDS9960_GCONF4, _gconf4.get());
|
||||||
|
}
|
||||||
|
_enable.GEN = en;
|
||||||
|
write8(APDS9960_ENABLE, _enable.get());
|
||||||
|
resetCounts();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Resets gesture counts
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::resetCounts() {
|
||||||
|
gestCnt = 0;
|
||||||
|
UCount = 0;
|
||||||
|
DCount = 0;
|
||||||
|
LCount = 0;
|
||||||
|
RCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads gesture
|
||||||
|
* @return Received gesture (APDS9960_DOWN APDS9960_UP, APDS9960_LEFT
|
||||||
|
* APDS9960_RIGHT)
|
||||||
|
*/
|
||||||
|
uint8_t Adafruit_APDS9960::readGesture() {
|
||||||
|
uint8_t toRead, bytesRead;
|
||||||
|
uint8_t buf[256];
|
||||||
|
unsigned long t = 0;
|
||||||
|
uint8_t gestureReceived;
|
||||||
|
while (1) {
|
||||||
|
int up_down_diff = 0;
|
||||||
|
int left_right_diff = 0;
|
||||||
|
gestureReceived = 0;
|
||||||
|
if (!gestureValid())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
delay(30);
|
||||||
|
toRead = this->read8(APDS9960_GFLVL);
|
||||||
|
|
||||||
|
// bytesRead is unused but produces sideffects needed for readGesture to work
|
||||||
|
bytesRead = this->read(APDS9960_GFIFO_U, buf, toRead);
|
||||||
|
|
||||||
|
if (abs((int)buf[0] - (int)buf[1]) > 13)
|
||||||
|
up_down_diff += (int)buf[0] - (int)buf[1];
|
||||||
|
|
||||||
|
if (abs((int)buf[2] - (int)buf[3]) > 13)
|
||||||
|
left_right_diff += (int)buf[2] - (int)buf[3];
|
||||||
|
|
||||||
|
if (up_down_diff != 0) {
|
||||||
|
if (up_down_diff < 0) {
|
||||||
|
if (DCount > 0) {
|
||||||
|
gestureReceived = APDS9960_UP;
|
||||||
|
} else
|
||||||
|
UCount++;
|
||||||
|
} else if (up_down_diff > 0) {
|
||||||
|
if (UCount > 0) {
|
||||||
|
gestureReceived = APDS9960_DOWN;
|
||||||
|
} else
|
||||||
|
DCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (left_right_diff != 0) {
|
||||||
|
if (left_right_diff < 0) {
|
||||||
|
if (RCount > 0) {
|
||||||
|
gestureReceived = APDS9960_LEFT;
|
||||||
|
} else
|
||||||
|
LCount++;
|
||||||
|
} else if (left_right_diff > 0) {
|
||||||
|
if (LCount > 0) {
|
||||||
|
gestureReceived = APDS9960_RIGHT;
|
||||||
|
} else
|
||||||
|
RCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (up_down_diff != 0 || left_right_diff != 0)
|
||||||
|
t = millis();
|
||||||
|
|
||||||
|
if (gestureReceived || millis() - t > 300) {
|
||||||
|
resetCounts();
|
||||||
|
return gestureReceived;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Set LED brightness for proximity/gesture
|
||||||
|
* @param drive
|
||||||
|
* LED Drive
|
||||||
|
* @param boost
|
||||||
|
* LED Boost
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setLED(apds9960LedDrive_t drive,
|
||||||
|
apds9960LedBoost_t boost) {
|
||||||
|
// set BOOST
|
||||||
|
_config2.LED_BOOST = boost;
|
||||||
|
write8(APDS9960_CONFIG2, _config2.get());
|
||||||
|
|
||||||
|
_control.LDRIVE = drive;
|
||||||
|
write8(APDS9960_CONTROL, _control.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enable proximity readings on APDS9960
|
||||||
|
* @param en
|
||||||
|
* Enable (True/False)
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::enableColor(boolean en) {
|
||||||
|
_enable.AEN = en;
|
||||||
|
write8(APDS9960_ENABLE, _enable.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns status of color data
|
||||||
|
* @return True if color data ready, False otherwise
|
||||||
|
*/
|
||||||
|
bool Adafruit_APDS9960::colorDataReady() {
|
||||||
|
_status.set(this->read8(APDS9960_STATUS));
|
||||||
|
return _status.AVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads the raw red, green, blue and clear channel values
|
||||||
|
* @param *r
|
||||||
|
* Red value
|
||||||
|
* @param *g
|
||||||
|
* Green value
|
||||||
|
* @param *b
|
||||||
|
* Blue value
|
||||||
|
* @param *c
|
||||||
|
* Clear channel value
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::getColorData(uint16_t *r, uint16_t *g, uint16_t *b,
|
||||||
|
uint16_t *c) {
|
||||||
|
|
||||||
|
*c = read16R(APDS9960_CDATAL);
|
||||||
|
*r = read16R(APDS9960_RDATAL);
|
||||||
|
*g = read16R(APDS9960_GDATAL);
|
||||||
|
*b = read16R(APDS9960_BDATAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Converts the raw R/G/B values to color temperature in degrees Kelvin
|
||||||
|
* @param r
|
||||||
|
* Red value
|
||||||
|
* @param g
|
||||||
|
* Green value
|
||||||
|
* @param b
|
||||||
|
* Blue value
|
||||||
|
* @return Color temperature
|
||||||
|
*/
|
||||||
|
uint16_t Adafruit_APDS9960::calculateColorTemperature(uint16_t r, uint16_t g,
|
||||||
|
uint16_t b) {
|
||||||
|
float X, Y, Z; /* RGB to XYZ correlation */
|
||||||
|
float xc, yc; /* Chromaticity co-ordinates */
|
||||||
|
float n; /* McCamy's formula */
|
||||||
|
float cct;
|
||||||
|
|
||||||
|
/* 1. Map RGB values to their XYZ counterparts. */
|
||||||
|
/* Based on 6500K fluorescent, 3000K fluorescent */
|
||||||
|
/* and 60W incandescent values for a wide range. */
|
||||||
|
/* Note: Y = Illuminance or lux */
|
||||||
|
X = (-0.14282F * r) + (1.54924F * g) + (-0.95641F * b);
|
||||||
|
Y = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b);
|
||||||
|
Z = (-0.68202F * r) + (0.77073F * g) + (0.56332F * b);
|
||||||
|
|
||||||
|
/* 2. Calculate the chromaticity co-ordinates */
|
||||||
|
xc = (X) / (X + Y + Z);
|
||||||
|
yc = (Y) / (X + Y + Z);
|
||||||
|
|
||||||
|
/* 3. Use McCamy's formula to determine the CCT */
|
||||||
|
n = (xc - 0.3320F) / (0.1858F - yc);
|
||||||
|
|
||||||
|
/* Calculate the final CCT */
|
||||||
|
cct =
|
||||||
|
(449.0F * powf(n, 3)) + (3525.0F * powf(n, 2)) + (6823.3F * n) + 5520.33F;
|
||||||
|
|
||||||
|
/* Return the results in degrees Kelvin */
|
||||||
|
return (uint16_t)cct;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Calculate ambient light values
|
||||||
|
* @param r
|
||||||
|
* Red value
|
||||||
|
* @param g
|
||||||
|
* Green value
|
||||||
|
* @param b
|
||||||
|
* Blue value
|
||||||
|
* @return LUX value
|
||||||
|
*/
|
||||||
|
uint16_t Adafruit_APDS9960::calculateLux(uint16_t r, uint16_t g, uint16_t b) {
|
||||||
|
float illuminance;
|
||||||
|
|
||||||
|
/* This only uses RGB ... how can we integrate clear or calculate lux */
|
||||||
|
/* based exclusively on clear since this might be more reliable? */
|
||||||
|
illuminance = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b);
|
||||||
|
|
||||||
|
return (uint16_t)illuminance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enables color interrupt
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::enableColorInterrupt() {
|
||||||
|
_enable.AIEN = 1;
|
||||||
|
write8(APDS9960_ENABLE, _enable.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Disables color interrupt
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::disableColorInterrupt() {
|
||||||
|
_enable.AIEN = 0;
|
||||||
|
write8(APDS9960_ENABLE, _enable.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Clears interrupt
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::clearInterrupt() {
|
||||||
|
this->write(APDS9960_AICLEAR, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets interrupt limits
|
||||||
|
* @param low
|
||||||
|
* Low limit
|
||||||
|
* @param high
|
||||||
|
* High limit
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::setIntLimits(uint16_t low, uint16_t high) {
|
||||||
|
write8(APDS9960_AILTIL, low & 0xFF);
|
||||||
|
write8(APDS9960_AILTH, low >> 8);
|
||||||
|
write8(APDS9960_AIHTL, high & 0xFF);
|
||||||
|
write8(APDS9960_AIHTH, high >> 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Writes specified value to given register
|
||||||
|
* @param reg
|
||||||
|
* Register to write to
|
||||||
|
* @param value
|
||||||
|
* Value to write
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::write8(byte reg, byte value) {
|
||||||
|
this->write(reg, &value, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads 8 bits from specified register
|
||||||
|
* @param reg
|
||||||
|
* Register to write to
|
||||||
|
* @return Value in register
|
||||||
|
*/
|
||||||
|
uint8_t Adafruit_APDS9960::read8(byte reg) {
|
||||||
|
uint8_t ret;
|
||||||
|
this->read(reg, &ret, 1);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads 32 bits from specified register
|
||||||
|
* @param reg
|
||||||
|
* Register to write to
|
||||||
|
* @return Value in register
|
||||||
|
*/
|
||||||
|
uint32_t Adafruit_APDS9960::read32(uint8_t reg) {
|
||||||
|
uint8_t ret[4];
|
||||||
|
this->read(reg, ret, 4);
|
||||||
|
|
||||||
|
return (ret[0] << 24) | (ret[1] << 16) | (ret[2] << 8) | ret[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads 16 bites from specified register
|
||||||
|
* @param reg
|
||||||
|
* Register to write to
|
||||||
|
* @return Value in register
|
||||||
|
*/
|
||||||
|
uint16_t Adafruit_APDS9960::read16(uint8_t reg) {
|
||||||
|
uint8_t ret[2];
|
||||||
|
this->read(reg, ret, 2);
|
||||||
|
|
||||||
|
return (ret[0] << 8) | ret[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads 16 bites from specified register
|
||||||
|
* @param reg
|
||||||
|
* Register to write to
|
||||||
|
* @return Value in register
|
||||||
|
*/
|
||||||
|
uint16_t Adafruit_APDS9960::read16R(uint8_t reg) {
|
||||||
|
uint8_t ret[2];
|
||||||
|
this->read(reg, ret, 2);
|
||||||
|
|
||||||
|
return (ret[1] << 8) | ret[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Begins I2C communication
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::_i2c_init() { _wire->begin(); }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads num bytes from specified register into a given buffer
|
||||||
|
* @param reg
|
||||||
|
* Register
|
||||||
|
* @param *buf
|
||||||
|
* Buffer
|
||||||
|
* @param num
|
||||||
|
* Number of bytes
|
||||||
|
* @return Position after reading
|
||||||
|
*/
|
||||||
|
uint8_t Adafruit_APDS9960::read(uint8_t reg, uint8_t *buf, uint8_t num) {
|
||||||
|
uint8_t pos = 0;
|
||||||
|
bool eof = false;
|
||||||
|
|
||||||
|
// on arduino we need to read in 32 byte chunks
|
||||||
|
while (pos < num && !eof) {
|
||||||
|
|
||||||
|
uint8_t read_now = min(32, num - pos);
|
||||||
|
_wire->beginTransmission((uint8_t)_i2caddr);
|
||||||
|
_wire->write((uint8_t)reg + pos);
|
||||||
|
_wire->endTransmission();
|
||||||
|
|
||||||
|
_wire->requestFrom((uint8_t)_i2caddr, read_now);
|
||||||
|
|
||||||
|
for (int i = 0; i < read_now; i++) {
|
||||||
|
if (!_wire->available()) {
|
||||||
|
eof = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
buf[pos] = _wire->read();
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Writes num bytes from specified buffer into a given register
|
||||||
|
* @param reg
|
||||||
|
* Register
|
||||||
|
* @param *buf
|
||||||
|
* Buffer
|
||||||
|
* @param num
|
||||||
|
* Number of bytes
|
||||||
|
*/
|
||||||
|
void Adafruit_APDS9960::write(uint8_t reg, uint8_t *buf, uint8_t num) {
|
||||||
|
_wire->beginTransmission((uint8_t)_i2caddr);
|
||||||
|
_wire->write((uint8_t)reg);
|
||||||
|
_wire->write((uint8_t *)buf, num);
|
||||||
|
_wire->endTransmission();
|
||||||
|
}
|
531
firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.h
Executable file
531
firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.h
Executable file
|
@ -0,0 +1,531 @@
|
||||||
|
/*!
|
||||||
|
* @file Adafruit_APDS9960.h
|
||||||
|
*
|
||||||
|
* Software License Agreement (BSD License)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2017, Adafruit Industries
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the copyright holders nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef _APDS9960_H_
|
||||||
|
#define _APDS9960_H_
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
#define APDS9960_ADDRESS (0x39) /**< I2C Address */
|
||||||
|
|
||||||
|
/** I2C Registers */
|
||||||
|
enum {
|
||||||
|
APDS9960_RAM = 0x00,
|
||||||
|
APDS9960_ENABLE = 0x80,
|
||||||
|
APDS9960_ATIME = 0x81,
|
||||||
|
APDS9960_WTIME = 0x83,
|
||||||
|
APDS9960_AILTIL = 0x84,
|
||||||
|
APDS9960_AILTH = 0x85,
|
||||||
|
APDS9960_AIHTL = 0x86,
|
||||||
|
APDS9960_AIHTH = 0x87,
|
||||||
|
APDS9960_PILT = 0x89,
|
||||||
|
APDS9960_PIHT = 0x8B,
|
||||||
|
APDS9960_PERS = 0x8C,
|
||||||
|
APDS9960_CONFIG1 = 0x8D,
|
||||||
|
APDS9960_PPULSE = 0x8E,
|
||||||
|
APDS9960_CONTROL = 0x8F,
|
||||||
|
APDS9960_CONFIG2 = 0x90,
|
||||||
|
APDS9960_ID = 0x92,
|
||||||
|
APDS9960_STATUS = 0x93,
|
||||||
|
APDS9960_CDATAL = 0x94,
|
||||||
|
APDS9960_CDATAH = 0x95,
|
||||||
|
APDS9960_RDATAL = 0x96,
|
||||||
|
APDS9960_RDATAH = 0x97,
|
||||||
|
APDS9960_GDATAL = 0x98,
|
||||||
|
APDS9960_GDATAH = 0x99,
|
||||||
|
APDS9960_BDATAL = 0x9A,
|
||||||
|
APDS9960_BDATAH = 0x9B,
|
||||||
|
APDS9960_PDATA = 0x9C,
|
||||||
|
APDS9960_POFFSET_UR = 0x9D,
|
||||||
|
APDS9960_POFFSET_DL = 0x9E,
|
||||||
|
APDS9960_CONFIG3 = 0x9F,
|
||||||
|
APDS9960_GPENTH = 0xA0,
|
||||||
|
APDS9960_GEXTH = 0xA1,
|
||||||
|
APDS9960_GCONF1 = 0xA2,
|
||||||
|
APDS9960_GCONF2 = 0xA3,
|
||||||
|
APDS9960_GOFFSET_U = 0xA4,
|
||||||
|
APDS9960_GOFFSET_D = 0xA5,
|
||||||
|
APDS9960_GOFFSET_L = 0xA7,
|
||||||
|
APDS9960_GOFFSET_R = 0xA9,
|
||||||
|
APDS9960_GPULSE = 0xA6,
|
||||||
|
APDS9960_GCONF3 = 0xAA,
|
||||||
|
APDS9960_GCONF4 = 0xAB,
|
||||||
|
APDS9960_GFLVL = 0xAE,
|
||||||
|
APDS9960_GSTATUS = 0xAF,
|
||||||
|
APDS9960_IFORCE = 0xE4,
|
||||||
|
APDS9960_PICLEAR = 0xE5,
|
||||||
|
APDS9960_CICLEAR = 0xE6,
|
||||||
|
APDS9960_AICLEAR = 0xE7,
|
||||||
|
APDS9960_GFIFO_U = 0xFC,
|
||||||
|
APDS9960_GFIFO_D = 0xFD,
|
||||||
|
APDS9960_GFIFO_L = 0xFE,
|
||||||
|
APDS9960_GFIFO_R = 0xFF,
|
||||||
|
};
|
||||||
|
|
||||||
|
/** ADC gain settings */
|
||||||
|
typedef enum {
|
||||||
|
APDS9960_AGAIN_1X = 0x00, /**< No gain */
|
||||||
|
APDS9960_AGAIN_4X = 0x01, /**< 2x gain */
|
||||||
|
APDS9960_AGAIN_16X = 0x02, /**< 16x gain */
|
||||||
|
APDS9960_AGAIN_64X = 0x03 /**< 64x gain */
|
||||||
|
} apds9960AGain_t;
|
||||||
|
|
||||||
|
/** Proxmity gain settings */
|
||||||
|
typedef enum {
|
||||||
|
APDS9960_PGAIN_1X = 0x00, /**< 1x gain */
|
||||||
|
APDS9960_PGAIN_2X = 0x04, /**< 2x gain */
|
||||||
|
APDS9960_PGAIN_4X = 0x08, /**< 4x gain */
|
||||||
|
APDS9960_PGAIN_8X = 0x0C /**< 8x gain */
|
||||||
|
} apds9960PGain_t;
|
||||||
|
|
||||||
|
/** Pulse length settings */
|
||||||
|
typedef enum {
|
||||||
|
APDS9960_PPULSELEN_4US = 0x00, /**< 4uS */
|
||||||
|
APDS9960_PPULSELEN_8US = 0x40, /**< 8uS */
|
||||||
|
APDS9960_PPULSELEN_16US = 0x80, /**< 16uS */
|
||||||
|
APDS9960_PPULSELEN_32US = 0xC0 /**< 32uS */
|
||||||
|
} apds9960PPulseLen_t;
|
||||||
|
|
||||||
|
/** LED drive settings */
|
||||||
|
typedef enum {
|
||||||
|
APDS9960_LEDDRIVE_100MA = 0x00, /**< 100mA */
|
||||||
|
APDS9960_LEDDRIVE_50MA = 0x40, /**< 50mA */
|
||||||
|
APDS9960_LEDDRIVE_25MA = 0x80, /**< 25mA */
|
||||||
|
APDS9960_LEDDRIVE_12MA = 0xC0 /**< 12.5mA */
|
||||||
|
} apds9960LedDrive_t;
|
||||||
|
|
||||||
|
/** LED boost settings */
|
||||||
|
typedef enum {
|
||||||
|
APDS9960_LEDBOOST_100PCNT = 0x00, /**< 100% */
|
||||||
|
APDS9960_LEDBOOST_150PCNT = 0x10, /**< 150% */
|
||||||
|
APDS9960_LEDBOOST_200PCNT = 0x20, /**< 200% */
|
||||||
|
APDS9960_LEDBOOST_300PCNT = 0x30 /**< 300% */
|
||||||
|
} apds9960LedBoost_t;
|
||||||
|
|
||||||
|
/** Dimensions */
|
||||||
|
enum {
|
||||||
|
APDS9960_DIMENSIONS_ALL = 0x00, // All dimensions
|
||||||
|
APDS9960_DIMENSIONS_UP_DOWN = 0x01, // Up/Down dimensions
|
||||||
|
APGS9960_DIMENSIONS_LEFT_RIGHT = 0x02, // Left/Right dimensions
|
||||||
|
};
|
||||||
|
|
||||||
|
/** FIFO Interrupts */
|
||||||
|
enum {
|
||||||
|
APDS9960_GFIFO_1 = 0x00, // Generate interrupt after 1 dataset in FIFO
|
||||||
|
APDS9960_GFIFO_4 = 0x01, // Generate interrupt after 2 datasets in FIFO
|
||||||
|
APDS9960_GFIFO_8 = 0x02, // Generate interrupt after 3 datasets in FIFO
|
||||||
|
APDS9960_GFIFO_16 = 0x03, // Generate interrupt after 4 datasets in FIFO
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Gesture Gain */
|
||||||
|
enum {
|
||||||
|
APDS9960_GGAIN_1 = 0x00, // Gain 1x
|
||||||
|
APDS9960_GGAIN_2 = 0x01, // Gain 2x
|
||||||
|
APDS9960_GGAIN_4 = 0x02, // Gain 4x
|
||||||
|
APDS9960_GGAIN_8 = 0x03, // Gain 8x
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Pulse Lenghts */
|
||||||
|
enum {
|
||||||
|
APDS9960_GPULSE_4US = 0x00, // Pulse 4us
|
||||||
|
APDS9960_GPULSE_8US = 0x01, // Pulse 8us
|
||||||
|
APDS9960_GPULSE_16US = 0x02, // Pulse 16us
|
||||||
|
APDS9960_GPULSE_32US = 0x03, // Pulse 32us
|
||||||
|
};
|
||||||
|
|
||||||
|
#define APDS9960_UP 0x01 /**< Gesture Up */
|
||||||
|
#define APDS9960_DOWN 0x02 /**< Gesture Down */
|
||||||
|
#define APDS9960_LEFT 0x03 /**< Gesture Left */
|
||||||
|
#define APDS9960_RIGHT 0x04 /**< Gesture Right */
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Class that stores state and functions for interacting with
|
||||||
|
* APDS9960 Sensor
|
||||||
|
*/
|
||||||
|
class Adafruit_APDS9960 {
|
||||||
|
public:
|
||||||
|
Adafruit_APDS9960(){};
|
||||||
|
~Adafruit_APDS9960(){};
|
||||||
|
|
||||||
|
boolean begin(uint16_t iTimeMS = 10, apds9960AGain_t = APDS9960_AGAIN_4X,
|
||||||
|
uint8_t addr = APDS9960_ADDRESS, TwoWire *theWire = &Wire);
|
||||||
|
void setADCIntegrationTime(uint16_t iTimeMS);
|
||||||
|
float getADCIntegrationTime();
|
||||||
|
void setADCGain(apds9960AGain_t gain);
|
||||||
|
apds9960AGain_t getADCGain();
|
||||||
|
void setLED(apds9960LedDrive_t drive, apds9960LedBoost_t boost);
|
||||||
|
|
||||||
|
// proximity
|
||||||
|
void enableProximity(boolean en = true);
|
||||||
|
void setProxGain(apds9960PGain_t gain);
|
||||||
|
apds9960PGain_t getProxGain();
|
||||||
|
void setProxPulse(apds9960PPulseLen_t pLen, uint8_t pulses);
|
||||||
|
void enableProximityInterrupt();
|
||||||
|
void disableProximityInterrupt();
|
||||||
|
uint8_t readProximity();
|
||||||
|
void setProximityInterruptThreshold(uint8_t low, uint8_t high,
|
||||||
|
uint8_t persistance = 4);
|
||||||
|
bool getProximityInterrupt();
|
||||||
|
|
||||||
|
// gesture
|
||||||
|
void enableGesture(boolean en = true);
|
||||||
|
bool gestureValid();
|
||||||
|
void setGestureDimensions(uint8_t dims);
|
||||||
|
void setGestureFIFOThreshold(uint8_t thresh);
|
||||||
|
void setGestureGain(uint8_t gain);
|
||||||
|
void setGestureProximityThreshold(uint8_t thresh);
|
||||||
|
void setGestureOffset(uint8_t offset_up, uint8_t offset_down,
|
||||||
|
uint8_t offset_left, uint8_t offset_right);
|
||||||
|
uint8_t readGesture();
|
||||||
|
void resetCounts();
|
||||||
|
|
||||||
|
// light & color
|
||||||
|
void enableColor(boolean en = true);
|
||||||
|
bool colorDataReady();
|
||||||
|
void getColorData(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c);
|
||||||
|
uint16_t calculateColorTemperature(uint16_t r, uint16_t g, uint16_t b);
|
||||||
|
uint16_t calculateLux(uint16_t r, uint16_t g, uint16_t b);
|
||||||
|
void enableColorInterrupt();
|
||||||
|
void disableColorInterrupt();
|
||||||
|
void clearInterrupt();
|
||||||
|
void setIntLimits(uint16_t l, uint16_t h);
|
||||||
|
|
||||||
|
// turn on/off elements
|
||||||
|
void enable(boolean en = true);
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t _i2caddr;
|
||||||
|
TwoWire *_wire;
|
||||||
|
|
||||||
|
uint32_t read32(uint8_t reg);
|
||||||
|
uint16_t read16(uint8_t reg);
|
||||||
|
uint16_t read16R(uint8_t reg);
|
||||||
|
|
||||||
|
void write8(byte reg, byte value);
|
||||||
|
uint8_t read8(byte reg);
|
||||||
|
|
||||||
|
uint8_t gestCnt;
|
||||||
|
|
||||||
|
uint8_t UCount;
|
||||||
|
uint8_t DCount;
|
||||||
|
|
||||||
|
uint8_t LCount;
|
||||||
|
uint8_t RCount;
|
||||||
|
|
||||||
|
uint8_t read(uint8_t reg, uint8_t *buf, uint8_t num);
|
||||||
|
void write(uint8_t reg, uint8_t *buf, uint8_t num);
|
||||||
|
void _i2c_init();
|
||||||
|
|
||||||
|
struct enable {
|
||||||
|
|
||||||
|
// power on
|
||||||
|
uint8_t PON : 1;
|
||||||
|
|
||||||
|
// ALS enable
|
||||||
|
uint8_t AEN : 1;
|
||||||
|
|
||||||
|
// Proximity detect enable
|
||||||
|
uint8_t PEN : 1;
|
||||||
|
|
||||||
|
// wait timer enable
|
||||||
|
uint8_t WEN : 1;
|
||||||
|
|
||||||
|
// ALS interrupt enable
|
||||||
|
uint8_t AIEN : 1;
|
||||||
|
|
||||||
|
// proximity interrupt enable
|
||||||
|
uint8_t PIEN : 1;
|
||||||
|
|
||||||
|
// gesture enable
|
||||||
|
uint8_t GEN : 1;
|
||||||
|
|
||||||
|
uint8_t get() {
|
||||||
|
return (GEN << 6) | (PIEN << 5) | (AIEN << 4) | (WEN << 3) | (PEN << 2) |
|
||||||
|
(AEN << 1) | PON;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
struct enable _enable;
|
||||||
|
|
||||||
|
struct pers {
|
||||||
|
// ALS Interrupt Persistence. Controls rate of Clear channel interrupt to
|
||||||
|
// the host processor
|
||||||
|
uint8_t APERS : 4;
|
||||||
|
|
||||||
|
// proximity interrupt persistence, controls rate of prox interrupt to host
|
||||||
|
// processor
|
||||||
|
uint8_t PPERS : 4;
|
||||||
|
|
||||||
|
uint8_t get() { return (PPERS << 4) | APERS; };
|
||||||
|
};
|
||||||
|
pers _pers;
|
||||||
|
|
||||||
|
struct config1 {
|
||||||
|
uint8_t WLONG : 1;
|
||||||
|
|
||||||
|
uint8_t get() { return WLONG << 1; };
|
||||||
|
};
|
||||||
|
config1 _config1;
|
||||||
|
|
||||||
|
struct ppulse {
|
||||||
|
|
||||||
|
/*Proximity Pulse Count. Specifies the number of proximity pulses to be
|
||||||
|
generated on LDR. Number of pulses is set by PPULSE value plus 1.
|
||||||
|
*/
|
||||||
|
uint8_t PPULSE : 6;
|
||||||
|
|
||||||
|
// Proximity Pulse Length. Sets the LED-ON pulse width during a proximity
|
||||||
|
// LDR pulse.
|
||||||
|
uint8_t PPLEN : 2;
|
||||||
|
|
||||||
|
uint8_t get() { return (PPLEN << 6) | PPULSE; }
|
||||||
|
};
|
||||||
|
ppulse _ppulse;
|
||||||
|
|
||||||
|
struct control {
|
||||||
|
// ALS and Color gain control
|
||||||
|
uint8_t AGAIN : 2;
|
||||||
|
|
||||||
|
// proximity gain control
|
||||||
|
uint8_t PGAIN : 2;
|
||||||
|
|
||||||
|
// led drive strength
|
||||||
|
uint8_t LDRIVE : 2;
|
||||||
|
|
||||||
|
uint8_t get() { return (LDRIVE << 6) | (PGAIN << 2) | AGAIN; }
|
||||||
|
};
|
||||||
|
control _control;
|
||||||
|
|
||||||
|
struct config2 {
|
||||||
|
/* Additional LDR current during proximity and gesture LED pulses. Current
|
||||||
|
value, set by LDRIVE, is increased by the percentage of LED_BOOST.
|
||||||
|
*/
|
||||||
|
uint8_t LED_BOOST : 2;
|
||||||
|
|
||||||
|
// clear photodiode saturation int enable
|
||||||
|
uint8_t CPSIEN : 1;
|
||||||
|
|
||||||
|
// proximity saturation interrupt enable
|
||||||
|
uint8_t PSIEN : 1;
|
||||||
|
|
||||||
|
uint8_t get() {
|
||||||
|
return (PSIEN << 7) | (CPSIEN << 6) | (LED_BOOST << 4) | 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
config2 _config2;
|
||||||
|
|
||||||
|
struct status {
|
||||||
|
/* ALS Valid. Indicates that an ALS cycle has completed since AEN was
|
||||||
|
asserted or since a read from any of the ALS/Color data registers.
|
||||||
|
*/
|
||||||
|
uint8_t AVALID : 1;
|
||||||
|
|
||||||
|
/* Proximity Valid. Indicates that a proximity cycle has completed since PEN
|
||||||
|
was asserted or since PDATA was last read. A read of PDATA automatically
|
||||||
|
clears PVALID.
|
||||||
|
*/
|
||||||
|
uint8_t PVALID : 1;
|
||||||
|
|
||||||
|
/* Gesture Interrupt. GINT is asserted when GFVLV becomes greater than
|
||||||
|
GFIFOTH or if GVALID has become asserted when GMODE transitioned to zero.
|
||||||
|
The bit is reset when FIFO is completely emptied (read).
|
||||||
|
*/
|
||||||
|
uint8_t GINT : 1;
|
||||||
|
|
||||||
|
// ALS Interrupt. This bit triggers an interrupt if AIEN in ENABLE is set.
|
||||||
|
uint8_t AINT : 1;
|
||||||
|
|
||||||
|
// Proximity Interrupt. This bit triggers an interrupt if PIEN in ENABLE is
|
||||||
|
// set.
|
||||||
|
uint8_t PINT : 1;
|
||||||
|
|
||||||
|
/* Indicates that an analog saturation event occurred during a previous
|
||||||
|
proximity or gesture cycle. Once set, this bit remains set until cleared by
|
||||||
|
clear proximity interrupt special function command (0xE5 PICLEAR) or by
|
||||||
|
disabling Prox (PEN=0). This bit triggers an interrupt if PSIEN is set.
|
||||||
|
*/
|
||||||
|
uint8_t PGSAT : 1;
|
||||||
|
|
||||||
|
/* Clear Photodiode Saturation. When asserted, the analog sensor was at the
|
||||||
|
upper end of its dynamic range. The bit can be de-asserted by sending a
|
||||||
|
Clear channel interrupt command (0xE6 CICLEAR) or by disabling the ADC
|
||||||
|
(AEN=0). This bit triggers an interrupt if CPSIEN is set.
|
||||||
|
*/
|
||||||
|
uint8_t CPSAT : 1;
|
||||||
|
|
||||||
|
void set(uint8_t data) {
|
||||||
|
AVALID = data & 0x01;
|
||||||
|
PVALID = (data >> 1) & 0x01;
|
||||||
|
GINT = (data >> 2) & 0x01;
|
||||||
|
AINT = (data >> 4) & 0x01;
|
||||||
|
PINT = (data >> 5) & 0x01;
|
||||||
|
PGSAT = (data >> 6) & 0x01;
|
||||||
|
CPSAT = (data >> 7) & 0x01;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
status _status;
|
||||||
|
|
||||||
|
struct config3 {
|
||||||
|
// proximity mask
|
||||||
|
uint8_t PMASK_R : 1;
|
||||||
|
uint8_t PMASK_L : 1;
|
||||||
|
uint8_t PMASK_D : 1;
|
||||||
|
uint8_t PMASK_U : 1;
|
||||||
|
|
||||||
|
/* Sleep After Interrupt. When enabled, the device will automatically enter
|
||||||
|
low power mode when the INT pin is asserted and the state machine has
|
||||||
|
progressed to the SAI decision block. Normal operation is resumed when INT
|
||||||
|
pin is cleared over I2C.
|
||||||
|
*/
|
||||||
|
uint8_t SAI : 1;
|
||||||
|
|
||||||
|
/* Proximity Gain Compensation Enable. This bit provides gain compensation
|
||||||
|
when proximity photodiode signal is reduced as a result of sensor masking.
|
||||||
|
If only one diode of the diode pair is contributing, then only half of the
|
||||||
|
signal is available at the ADC; this results in a maximum ADC value of 127.
|
||||||
|
Enabling PCMP enables an additional gain of 2X, resulting in a maximum ADC
|
||||||
|
value of 255.
|
||||||
|
*/
|
||||||
|
uint8_t PCMP : 1;
|
||||||
|
|
||||||
|
uint8_t get() {
|
||||||
|
return (PCMP << 5) | (SAI << 4) | (PMASK_U << 3) | (PMASK_D << 2) |
|
||||||
|
(PMASK_L << 1) | PMASK_R;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
config3 _config3;
|
||||||
|
|
||||||
|
struct gconf1 {
|
||||||
|
/* Gesture Exit Persistence. When a number of consecutive gesture end
|
||||||
|
occurrences become equal or greater to the GEPERS value, the Gesture state
|
||||||
|
machine is exited.
|
||||||
|
*/
|
||||||
|
uint8_t GEXPERS : 2;
|
||||||
|
|
||||||
|
/* Gesture Exit Mask. Controls which of the gesture detector photodiodes
|
||||||
|
(UDLR) will be included to determine a gesture end and subsequent exit
|
||||||
|
of the gesture state machine. Unmasked UDLR data will be compared with the
|
||||||
|
value in GTHR_OUT. Field value bits correspond to UDLR detectors.
|
||||||
|
*/
|
||||||
|
uint8_t GEXMSK : 4;
|
||||||
|
|
||||||
|
/* Gesture FIFO Threshold. This value is compared with the FIFO Level (i.e.
|
||||||
|
the number of UDLR datasets) to generate an interrupt (if enabled).
|
||||||
|
*/
|
||||||
|
uint8_t GFIFOTH : 2;
|
||||||
|
|
||||||
|
uint8_t get() { return (GFIFOTH << 6) | (GEXMSK << 2) | GEXPERS; }
|
||||||
|
};
|
||||||
|
gconf1 _gconf1;
|
||||||
|
|
||||||
|
struct gconf2 {
|
||||||
|
/* Gesture Wait Time. The GWTIME controls the amount of time in a low power
|
||||||
|
mode between gesture detection cycles.
|
||||||
|
*/
|
||||||
|
uint8_t GWTIME : 3;
|
||||||
|
|
||||||
|
// Gesture LED Drive Strength. Sets LED Drive Strength in gesture mode.
|
||||||
|
uint8_t GLDRIVE : 2;
|
||||||
|
|
||||||
|
// Gesture Gain Control. Sets the gain of the proximity receiver in gesture
|
||||||
|
// mode.
|
||||||
|
uint8_t GGAIN : 2;
|
||||||
|
|
||||||
|
uint8_t get() { return (GGAIN << 5) | (GLDRIVE << 3) | GWTIME; }
|
||||||
|
};
|
||||||
|
gconf2 _gconf2;
|
||||||
|
|
||||||
|
struct gpulse {
|
||||||
|
/* Number of Gesture Pulses. Specifies the number of pulses to be generated
|
||||||
|
on LDR. Number of pulses is set by GPULSE value plus 1.
|
||||||
|
*/
|
||||||
|
uint8_t GPULSE : 6;
|
||||||
|
|
||||||
|
// Gesture Pulse Length. Sets the LED_ON pulse width during a Gesture LDR
|
||||||
|
// Pulse.
|
||||||
|
uint8_t GPLEN : 2;
|
||||||
|
|
||||||
|
uint8_t get() { return (GPLEN << 6) | GPULSE; }
|
||||||
|
};
|
||||||
|
gpulse _gpulse;
|
||||||
|
|
||||||
|
struct gconf3 {
|
||||||
|
/* Gesture Dimension Select. Selects which gesture photodiode pairs are
|
||||||
|
enabled to gather results during gesture.
|
||||||
|
*/
|
||||||
|
uint8_t GDIMS : 2;
|
||||||
|
|
||||||
|
uint8_t get() { return GDIMS; }
|
||||||
|
};
|
||||||
|
gconf3 _gconf3;
|
||||||
|
|
||||||
|
struct gconf4 {
|
||||||
|
/* Gesture Mode. Reading this bit reports if the gesture state machine is
|
||||||
|
actively running, 1 = Gesture, 0= ALS, Proximity, Color. Writing a 1 to this
|
||||||
|
bit causes immediate entry in to the gesture state machine (as if GPENTH had
|
||||||
|
been exceeded). Writing a 0 to this bit causes exit of gesture when current
|
||||||
|
analog conversion has finished (as if GEXTH had been exceeded).
|
||||||
|
*/
|
||||||
|
uint8_t GMODE : 1;
|
||||||
|
|
||||||
|
/* Gesture interrupt enable. Gesture Interrupt Enable. When asserted, all
|
||||||
|
gesture related interrupts are unmasked.
|
||||||
|
*/
|
||||||
|
uint8_t GIEN : 2;
|
||||||
|
|
||||||
|
uint8_t get() { return (GIEN << 1) | GMODE; }
|
||||||
|
void set(uint8_t data) {
|
||||||
|
GIEN = (data >> 1) & 0x01;
|
||||||
|
GMODE = data & 0x01;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
gconf4 _gconf4;
|
||||||
|
|
||||||
|
struct gstatus {
|
||||||
|
/* Gesture FIFO Data. GVALID bit is sent when GFLVL becomes greater than
|
||||||
|
GFIFOTH (i.e. FIFO has enough data to set GINT). GFIFOD is reset when GMODE
|
||||||
|
= 0 and the GFLVL=0 (i.e. All FIFO data has been read).
|
||||||
|
*/
|
||||||
|
uint8_t GVALID : 1;
|
||||||
|
|
||||||
|
/* Gesture FIFO Overflow. A setting of 1 indicates that the FIFO has filled
|
||||||
|
to capacity and that new gesture detector data has been lost.
|
||||||
|
*/
|
||||||
|
uint8_t GFOV : 1;
|
||||||
|
|
||||||
|
void set(uint8_t data) {
|
||||||
|
GFOV = (data >> 1) & 0x01;
|
||||||
|
GVALID = data & 0x01;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
gstatus _gstatus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
18
firmware/libraries/Adafruit_APDS9960_Library/README.md
Executable file
18
firmware/libraries/Adafruit_APDS9960_Library/README.md
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
# Adafruit APDS9960 Library [![Build Status](https://travis-ci.com/adafruit/Adafruit_APDS9960.svg?branch=master)](https://travis-ci.com/adafruit/Adafruit_APDS9960)
|
||||||
|
|
||||||
|
<a href="https://www.adafruit.com/product/3595"><img src="assets/board.jpg?raw=true" width="500px"></a>
|
||||||
|
|
||||||
|
This is the Adafruit APDS9960 Proximity, Light, RGB, and Gesture sensor Library
|
||||||
|
|
||||||
|
Tested and works great with the Adafruit APDS9960 Board
|
||||||
|
* http://www.adafruit.com/products/3595
|
||||||
|
|
||||||
|
This chip uses I2C to communicate, 2 pins are required to interface
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!
|
||||||
|
|
||||||
|
Written by Dean Miller, Limor Fried for Adafruit Industries.
|
||||||
|
BSD license, check license.txt for more information
|
||||||
|
All text above must be included in any redistribution
|
||||||
|
|
||||||
|
To install, use the Arduino Library Manager and search for "Adafruit APDS9960 Library" and install the library.
|
BIN
firmware/libraries/Adafruit_APDS9960_Library/assets/board.jpg
Executable file
BIN
firmware/libraries/Adafruit_APDS9960_Library/assets/board.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 285 KiB |
127
firmware/libraries/Adafruit_APDS9960_Library/code-of-conduct.md
Executable file
127
firmware/libraries/Adafruit_APDS9960_Library/code-of-conduct.md
Executable file
|
@ -0,0 +1,127 @@
|
||||||
|
# Adafruit Community Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and leaders pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level or type of
|
||||||
|
experience, education, socio-economic status, nationality, personal appearance,
|
||||||
|
race, religion, or sexual identity and orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
We are committed to providing a friendly, safe and welcoming environment for
|
||||||
|
all.
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Be kind and courteous to others
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Collaborating with other community members
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and sexual attention or advances
|
||||||
|
* The use of inappropriate images, including in a community member's avatar
|
||||||
|
* The use of inappropriate language, including in a community member's nickname
|
||||||
|
* Any spamming, flaming, baiting or other attention-stealing behavior
|
||||||
|
* Excessive or unwelcome helping; answering outside the scope of the question
|
||||||
|
asked
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate
|
||||||
|
|
||||||
|
The goal of the standards and moderation guidelines outlined here is to build
|
||||||
|
and maintain a respectful community. We ask that you don’t just aim to be
|
||||||
|
"technically unimpeachable", but rather try to be your best self.
|
||||||
|
|
||||||
|
We value many things beyond technical expertise, including collaboration and
|
||||||
|
supporting others within our community. Providing a positive experience for
|
||||||
|
other community members can have a much more significant impact than simply
|
||||||
|
providing the correct answer.
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project leaders are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project leaders have the right and responsibility to remove, edit, or
|
||||||
|
reject messages, comments, commits, code, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any community member for other behaviors that they deem
|
||||||
|
inappropriate, threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Moderation
|
||||||
|
|
||||||
|
Instances of behaviors that violate the Adafruit Community Code of Conduct
|
||||||
|
may be reported by any member of the community. Community members are
|
||||||
|
encouraged to report these situations, including situations they witness
|
||||||
|
involving other community members.
|
||||||
|
|
||||||
|
You may report in the following ways:
|
||||||
|
|
||||||
|
In any situation, you may send an email to <support@adafruit.com>.
|
||||||
|
|
||||||
|
On the Adafruit Discord, you may send an open message from any channel
|
||||||
|
to all Community Helpers by tagging @community helpers. You may also send an
|
||||||
|
open message from any channel, or a direct message to @kattni#1507,
|
||||||
|
@tannewt#4653, @Dan Halbert#1614, @cater#2442, @sommersoft#0222, or
|
||||||
|
@Andon#8175.
|
||||||
|
|
||||||
|
Email and direct message reports will be kept confidential.
|
||||||
|
|
||||||
|
In situations on Discord where the issue is particularly egregious, possibly
|
||||||
|
illegal, requires immediate action, or violates the Discord terms of service,
|
||||||
|
you should also report the message directly to Discord.
|
||||||
|
|
||||||
|
These are the steps for upholding our community’s standards of conduct.
|
||||||
|
|
||||||
|
1. Any member of the community may report any situation that violates the
|
||||||
|
Adafruit Community Code of Conduct. All reports will be reviewed and
|
||||||
|
investigated.
|
||||||
|
2. If the behavior is an egregious violation, the community member who
|
||||||
|
committed the violation may be banned immediately, without warning.
|
||||||
|
3. Otherwise, moderators will first respond to such behavior with a warning.
|
||||||
|
4. Moderators follow a soft "three strikes" policy - the community member may
|
||||||
|
be given another chance, if they are receptive to the warning and change their
|
||||||
|
behavior.
|
||||||
|
5. If the community member is unreceptive or unreasonable when warned by a
|
||||||
|
moderator, or the warning goes unheeded, they may be banned for a first or
|
||||||
|
second offense. Repeated offenses will result in the community member being
|
||||||
|
banned.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct and the enforcement policies listed above apply to all
|
||||||
|
Adafruit Community venues. This includes but is not limited to any community
|
||||||
|
spaces (both public and private), the entire Adafruit Discord server, and
|
||||||
|
Adafruit GitHub repositories. Examples of Adafruit Community spaces include
|
||||||
|
but are not limited to meet-ups, audio chats on the Adafruit Discord, or
|
||||||
|
interaction at a conference.
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. As a community
|
||||||
|
member, you are representing our community, and are expected to behave
|
||||||
|
accordingly.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 1.4, available at
|
||||||
|
<https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>,
|
||||||
|
and the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html).
|
||||||
|
|
||||||
|
For other projects adopting the Adafruit Community Code of
|
||||||
|
Conduct, please contact the maintainers of those projects for enforcement.
|
||||||
|
If you wish to use this code of conduct for your own project, consider
|
||||||
|
explicitly mentioning your moderation policy or making a copy with your
|
||||||
|
own moderation policy so as to avoid confusion.
|
|
@ -0,0 +1,59 @@
|
||||||
|
/***************************************************************************
|
||||||
|
This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor
|
||||||
|
|
||||||
|
This sketch puts the sensor in color mode and reads the RGB and clear values.
|
||||||
|
|
||||||
|
Designed specifically to work with the Adafruit APDS9960 breakout
|
||||||
|
----> http://www.adafruit.com/products/3595
|
||||||
|
|
||||||
|
These sensors use I2C to communicate. The device's I2C address is 0x39
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code,
|
||||||
|
please support Adafruit andopen-source hardware by purchasing products
|
||||||
|
from Adafruit!
|
||||||
|
|
||||||
|
Written by Dean Miller for Adafruit Industries.
|
||||||
|
BSD license, all text above must be included in any redistribution
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "Adafruit_APDS9960.h"
|
||||||
|
Adafruit_APDS9960 apds;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
if(!apds.begin()){
|
||||||
|
Serial.println("failed to initialize device! Please check your wiring.");
|
||||||
|
}
|
||||||
|
else Serial.println("Device initialized!");
|
||||||
|
|
||||||
|
//enable color sensign mode
|
||||||
|
apds.enableColor(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
//create some variables to store the color data in
|
||||||
|
uint16_t r, g, b, c;
|
||||||
|
|
||||||
|
//wait for color data to be ready
|
||||||
|
while(!apds.colorDataReady()){
|
||||||
|
delay(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
//get the data and print the different channels
|
||||||
|
apds.getColorData(&r, &g, &b, &c);
|
||||||
|
Serial.print("red: ");
|
||||||
|
Serial.print(r);
|
||||||
|
|
||||||
|
Serial.print(" green: ");
|
||||||
|
Serial.print(g);
|
||||||
|
|
||||||
|
Serial.print(" blue: ");
|
||||||
|
Serial.print(b);
|
||||||
|
|
||||||
|
Serial.print(" clear: ");
|
||||||
|
Serial.println(c);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
delay(500);
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/***************************************************************************
|
||||||
|
This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor
|
||||||
|
|
||||||
|
This sketch puts the sensor in gesture mode and decodes gestures.
|
||||||
|
To use this, first put your hand close to the sensor to enable gesture mode.
|
||||||
|
Then move your hand about 6" from the sensor in the up -> down, down -> up,
|
||||||
|
left -> right, or right -> left direction.
|
||||||
|
|
||||||
|
Designed specifically to work with the Adafruit APDS9960 breakout
|
||||||
|
----> http://www.adafruit.com/products/3595
|
||||||
|
|
||||||
|
These sensors use I2C to communicate. The device's I2C address is 0x39
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code,
|
||||||
|
please support Adafruit andopen-source hardware by purchasing products
|
||||||
|
from Adafruit!
|
||||||
|
|
||||||
|
Written by Dean Miller for Adafruit Industries.
|
||||||
|
BSD license, all text above must be included in any redistribution
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "Adafruit_APDS9960.h"
|
||||||
|
Adafruit_APDS9960 apds;
|
||||||
|
|
||||||
|
// the setup function runs once when you press reset or power the board
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
if(!apds.begin()){
|
||||||
|
Serial.println("failed to initialize device! Please check your wiring.");
|
||||||
|
}
|
||||||
|
else Serial.println("Device initialized!");
|
||||||
|
|
||||||
|
//gesture mode will be entered once proximity mode senses something close
|
||||||
|
apds.enableProximity(true);
|
||||||
|
apds.enableGesture(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// the loop function runs over and over again forever
|
||||||
|
void loop() {
|
||||||
|
//read a gesture from the device
|
||||||
|
uint8_t gesture = apds.readGesture();
|
||||||
|
if(gesture == APDS9960_DOWN) Serial.println("v");
|
||||||
|
if(gesture == APDS9960_UP) Serial.println("^");
|
||||||
|
if(gesture == APDS9960_LEFT) Serial.println("<");
|
||||||
|
if(gesture == APDS9960_RIGHT) Serial.println(">");
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/***************************************************************************
|
||||||
|
This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor
|
||||||
|
|
||||||
|
This sketch puts the sensor in proximity mode and enables the interrupt
|
||||||
|
to fire when proximity goes over a set value
|
||||||
|
|
||||||
|
Designed specifically to work with the Adafruit APDS9960 breakout
|
||||||
|
----> http://www.adafruit.com/products/3595
|
||||||
|
|
||||||
|
These sensors use I2C to communicate. The device's I2C address is 0x39
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code,
|
||||||
|
please support Adafruit andopen-source hardware by purchasing products
|
||||||
|
from Adafruit!
|
||||||
|
|
||||||
|
Written by Dean Miller for Adafruit Industries.
|
||||||
|
BSD license, all text above must be included in any redistribution
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "Adafruit_APDS9960.h"
|
||||||
|
|
||||||
|
//the pin that the interrupt is attached to
|
||||||
|
#define INT_PIN 3
|
||||||
|
|
||||||
|
//create the APDS9960 object
|
||||||
|
Adafruit_APDS9960 apds;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
pinMode(INT_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
|
if(!apds.begin()){
|
||||||
|
Serial.println("failed to initialize device! Please check your wiring.");
|
||||||
|
}
|
||||||
|
else Serial.println("Device initialized!");
|
||||||
|
|
||||||
|
//enable proximity mode
|
||||||
|
apds.enableProximity(true);
|
||||||
|
|
||||||
|
//set the interrupt threshold to fire when proximity reading goes above 175
|
||||||
|
apds.setProximityInterruptThreshold(0, 175);
|
||||||
|
|
||||||
|
//enable the proximity interrupt
|
||||||
|
apds.enableProximityInterrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
//print the proximity reading when the interrupt pin goes low
|
||||||
|
if(!digitalRead(INT_PIN)){
|
||||||
|
Serial.println(apds.readProximity());
|
||||||
|
|
||||||
|
//clear the interrupt
|
||||||
|
apds.clearInterrupt();
|
||||||
|
}
|
||||||
|
}
|
9
firmware/libraries/Adafruit_APDS9960_Library/library.properties
Executable file
9
firmware/libraries/Adafruit_APDS9960_Library/library.properties
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
name=Adafruit APDS9960 Library
|
||||||
|
version=1.1.1
|
||||||
|
author=Adafruit
|
||||||
|
maintainer=Adafruit <info@adafruit.com>
|
||||||
|
sentence=This is a library for the Adafruit APDS9960 gesture/proximity/color/light sensor.
|
||||||
|
paragraph=This is a library for the Adafruit APDS9960 gesture/proximity/color/light sensor.
|
||||||
|
category=Sensors
|
||||||
|
url=https://github.com/adafruit/Adafruit_APDS9960
|
||||||
|
architectures=*
|
26
firmware/libraries/Adafruit_APDS9960_Library/license.txt
Executable file
26
firmware/libraries/Adafruit_APDS9960_Library/license.txt
Executable file
|
@ -0,0 +1,26 @@
|
||||||
|
Software License Agreement (BSD License)
|
||||||
|
|
||||||
|
Copyright (c) 2012, Adafruit Industries
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. Neither the name of the copyright holders nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
|
||||||
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
560
firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.cpp
Executable file
560
firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.cpp
Executable file
|
@ -0,0 +1,560 @@
|
||||||
|
/*!
|
||||||
|
* @file Adafruit_BME280.cpp
|
||||||
|
*
|
||||||
|
* @mainpage Adafruit BME280 humidity, temperature & pressure sensor
|
||||||
|
*
|
||||||
|
* @section intro_sec Introduction
|
||||||
|
*
|
||||||
|
* Driver for the BME280 humidity, temperature & pressure sensor
|
||||||
|
*
|
||||||
|
* These sensors use I2C or SPI to communicate, 2 or 4 pins are required
|
||||||
|
* to interface.
|
||||||
|
*
|
||||||
|
* Designed specifically to work with the Adafruit BME280 Breakout
|
||||||
|
* ----> http://www.adafruit.com/products/2652
|
||||||
|
*
|
||||||
|
* Adafruit invests time and resources providing this open source code,
|
||||||
|
* please support Adafruit and open-source hardware by purchasing
|
||||||
|
* products from Adafruit!
|
||||||
|
*
|
||||||
|
* @section author Author
|
||||||
|
*
|
||||||
|
* Written by Kevin "KTOWN" Townsend for Adafruit Industries.
|
||||||
|
*
|
||||||
|
* @section license License
|
||||||
|
*
|
||||||
|
* BSD license, all text here must be included in any redistribution.
|
||||||
|
* See the LICENSE file for details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Adafruit_BME280.h"
|
||||||
|
#include "Arduino.h"
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief class constructor
|
||||||
|
*/
|
||||||
|
Adafruit_BME280::Adafruit_BME280() : _cs(-1), _mosi(-1), _miso(-1), _sck(-1) {}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief class constructor if using hardware SPI
|
||||||
|
* @param cspin the chip select pin to use
|
||||||
|
* @param *theSPI
|
||||||
|
* optional SPI object
|
||||||
|
*/
|
||||||
|
Adafruit_BME280::Adafruit_BME280(int8_t cspin, SPIClass *theSPI) {
|
||||||
|
_cs = cspin;
|
||||||
|
_mosi = _miso = _sck = -1;
|
||||||
|
_spi = theSPI;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief class constructor if using software SPI
|
||||||
|
* @param cspin the chip select pin to use
|
||||||
|
* @param mosipin the MOSI pin to use
|
||||||
|
* @param misopin the MISO pin to use
|
||||||
|
* @param sckpin the SCK pin to use
|
||||||
|
*/
|
||||||
|
Adafruit_BME280::Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin,
|
||||||
|
int8_t sckpin)
|
||||||
|
: _cs(cspin), _mosi(mosipin), _miso(misopin), _sck(sckpin) {}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initialise sensor with given parameters / settings
|
||||||
|
* @param theWire the I2C object to use
|
||||||
|
* @returns true on success, false otherwise
|
||||||
|
*/
|
||||||
|
bool Adafruit_BME280::begin(TwoWire *theWire) {
|
||||||
|
_wire = theWire;
|
||||||
|
_i2caddr = BME280_ADDRESS;
|
||||||
|
return init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initialise sensor with given parameters / settings
|
||||||
|
* @param addr the I2C address the device can be found on
|
||||||
|
* @returns true on success, false otherwise
|
||||||
|
*/
|
||||||
|
bool Adafruit_BME280::begin(uint8_t addr) {
|
||||||
|
_i2caddr = addr;
|
||||||
|
_wire = &Wire;
|
||||||
|
return init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initialise sensor with given parameters / settings
|
||||||
|
* @param addr the I2C address the device can be found on
|
||||||
|
* @param theWire the I2C object to use
|
||||||
|
* @returns true on success, false otherwise
|
||||||
|
*/
|
||||||
|
bool Adafruit_BME280::begin(uint8_t addr, TwoWire *theWire) {
|
||||||
|
_i2caddr = addr;
|
||||||
|
_wire = theWire;
|
||||||
|
return init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initialise sensor with given parameters / settings
|
||||||
|
* @returns true on success, false otherwise
|
||||||
|
*/
|
||||||
|
bool Adafruit_BME280::begin(void) {
|
||||||
|
bool status = false;
|
||||||
|
_i2caddr = BME280_ADDRESS;
|
||||||
|
_wire = &Wire;
|
||||||
|
status = init();
|
||||||
|
if (!status) {
|
||||||
|
_i2caddr = BME280_ADDRESS_ALTERNATE;
|
||||||
|
status = init();
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initialise sensor with given parameters / settings
|
||||||
|
* @returns true on success, false otherwise
|
||||||
|
*/
|
||||||
|
bool Adafruit_BME280::init() {
|
||||||
|
// init I2C or SPI sensor interface
|
||||||
|
if (_cs == -1) {
|
||||||
|
// I2C
|
||||||
|
_wire->begin();
|
||||||
|
} else {
|
||||||
|
digitalWrite(_cs, HIGH);
|
||||||
|
pinMode(_cs, OUTPUT);
|
||||||
|
if (_sck == -1) {
|
||||||
|
// hardware SPI
|
||||||
|
_spi->begin();
|
||||||
|
} else {
|
||||||
|
// software SPI
|
||||||
|
pinMode(_sck, OUTPUT);
|
||||||
|
pinMode(_mosi, OUTPUT);
|
||||||
|
pinMode(_miso, INPUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if sensor, i.e. the chip ID is correct
|
||||||
|
_sensorID = read8(BME280_REGISTER_CHIPID);
|
||||||
|
if (_sensorID != 0x60)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// reset the device using soft-reset
|
||||||
|
// this makes sure the IIR is off, etc.
|
||||||
|
write8(BME280_REGISTER_SOFTRESET, 0xB6);
|
||||||
|
|
||||||
|
// wait for chip to wake up.
|
||||||
|
delay(300);
|
||||||
|
|
||||||
|
// if chip is still reading calibration, delay
|
||||||
|
while (isReadingCalibration())
|
||||||
|
delay(100);
|
||||||
|
|
||||||
|
readCoefficients(); // read trimming parameters, see DS 4.2.2
|
||||||
|
|
||||||
|
setSampling(); // use defaults
|
||||||
|
|
||||||
|
delay(100);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief setup sensor with given parameters / settings
|
||||||
|
*
|
||||||
|
* This is simply a overload to the normal begin()-function, so SPI users
|
||||||
|
* don't get confused about the library requiring an address.
|
||||||
|
* @param mode the power mode to use for the sensor
|
||||||
|
* @param tempSampling the temp samping rate to use
|
||||||
|
* @param pressSampling the pressure sampling rate to use
|
||||||
|
* @param humSampling the humidity sampling rate to use
|
||||||
|
* @param filter the filter mode to use
|
||||||
|
* @param duration the standby duration to use
|
||||||
|
*/
|
||||||
|
void Adafruit_BME280::setSampling(sensor_mode mode,
|
||||||
|
sensor_sampling tempSampling,
|
||||||
|
sensor_sampling pressSampling,
|
||||||
|
sensor_sampling humSampling,
|
||||||
|
sensor_filter filter,
|
||||||
|
standby_duration duration) {
|
||||||
|
_measReg.mode = mode;
|
||||||
|
_measReg.osrs_t = tempSampling;
|
||||||
|
_measReg.osrs_p = pressSampling;
|
||||||
|
|
||||||
|
_humReg.osrs_h = humSampling;
|
||||||
|
_configReg.filter = filter;
|
||||||
|
_configReg.t_sb = duration;
|
||||||
|
|
||||||
|
// you must make sure to also set REGISTER_CONTROL after setting the
|
||||||
|
// CONTROLHUMID register, otherwise the values won't be applied (see
|
||||||
|
// DS 5.4.3)
|
||||||
|
write8(BME280_REGISTER_CONTROLHUMID, _humReg.get());
|
||||||
|
write8(BME280_REGISTER_CONFIG, _configReg.get());
|
||||||
|
write8(BME280_REGISTER_CONTROL, _measReg.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Encapsulate hardware and software SPI transfer into one
|
||||||
|
* function
|
||||||
|
* @param x the data byte to transfer
|
||||||
|
* @returns the data byte read from the device
|
||||||
|
*/
|
||||||
|
uint8_t Adafruit_BME280::spixfer(uint8_t x) {
|
||||||
|
// hardware SPI
|
||||||
|
if (_sck == -1)
|
||||||
|
return _spi->transfer(x);
|
||||||
|
|
||||||
|
// software SPI
|
||||||
|
uint8_t reply = 0;
|
||||||
|
for (int i = 7; i >= 0; i--) {
|
||||||
|
reply <<= 1;
|
||||||
|
digitalWrite(_sck, LOW);
|
||||||
|
digitalWrite(_mosi, x & (1 << i));
|
||||||
|
digitalWrite(_sck, HIGH);
|
||||||
|
if (digitalRead(_miso))
|
||||||
|
reply |= 1;
|
||||||
|
}
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Writes an 8 bit value over I2C or SPI
|
||||||
|
* @param reg the register address to write to
|
||||||
|
* @param value the value to write to the register
|
||||||
|
*/
|
||||||
|
void Adafruit_BME280::write8(byte reg, byte value) {
|
||||||
|
if (_cs == -1) {
|
||||||
|
_wire->beginTransmission((uint8_t)_i2caddr);
|
||||||
|
_wire->write((uint8_t)reg);
|
||||||
|
_wire->write((uint8_t)value);
|
||||||
|
_wire->endTransmission();
|
||||||
|
} else {
|
||||||
|
if (_sck == -1)
|
||||||
|
_spi->beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
|
||||||
|
digitalWrite(_cs, LOW);
|
||||||
|
spixfer(reg & ~0x80); // write, bit 7 low
|
||||||
|
spixfer(value);
|
||||||
|
digitalWrite(_cs, HIGH);
|
||||||
|
if (_sck == -1)
|
||||||
|
_spi->endTransaction(); // release the SPI bus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads an 8 bit value over I2C or SPI
|
||||||
|
* @param reg the register address to read from
|
||||||
|
* @returns the data byte read from the device
|
||||||
|
*/
|
||||||
|
uint8_t Adafruit_BME280::read8(byte reg) {
|
||||||
|
uint8_t value;
|
||||||
|
|
||||||
|
if (_cs == -1) {
|
||||||
|
_wire->beginTransmission((uint8_t)_i2caddr);
|
||||||
|
_wire->write((uint8_t)reg);
|
||||||
|
_wire->endTransmission();
|
||||||
|
_wire->requestFrom((uint8_t)_i2caddr, (byte)1);
|
||||||
|
value = _wire->read();
|
||||||
|
} else {
|
||||||
|
if (_sck == -1)
|
||||||
|
_spi->beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
|
||||||
|
digitalWrite(_cs, LOW);
|
||||||
|
spixfer(reg | 0x80); // read, bit 7 high
|
||||||
|
value = spixfer(0);
|
||||||
|
digitalWrite(_cs, HIGH);
|
||||||
|
if (_sck == -1)
|
||||||
|
_spi->endTransaction(); // release the SPI bus
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads a 16 bit value over I2C or SPI
|
||||||
|
* @param reg the register address to read from
|
||||||
|
* @returns the 16 bit data value read from the device
|
||||||
|
*/
|
||||||
|
uint16_t Adafruit_BME280::read16(byte reg) {
|
||||||
|
uint16_t value;
|
||||||
|
|
||||||
|
if (_cs == -1) {
|
||||||
|
_wire->beginTransmission((uint8_t)_i2caddr);
|
||||||
|
_wire->write((uint8_t)reg);
|
||||||
|
_wire->endTransmission();
|
||||||
|
_wire->requestFrom((uint8_t)_i2caddr, (byte)2);
|
||||||
|
value = (_wire->read() << 8) | _wire->read();
|
||||||
|
} else {
|
||||||
|
if (_sck == -1)
|
||||||
|
_spi->beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
|
||||||
|
digitalWrite(_cs, LOW);
|
||||||
|
spixfer(reg | 0x80); // read, bit 7 high
|
||||||
|
value = (spixfer(0) << 8) | spixfer(0);
|
||||||
|
digitalWrite(_cs, HIGH);
|
||||||
|
if (_sck == -1)
|
||||||
|
_spi->endTransaction(); // release the SPI bus
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads a signed 16 bit little endian value over I2C or SPI
|
||||||
|
* @param reg the register address to read from
|
||||||
|
* @returns the 16 bit data value read from the device
|
||||||
|
*/
|
||||||
|
uint16_t Adafruit_BME280::read16_LE(byte reg) {
|
||||||
|
uint16_t temp = read16(reg);
|
||||||
|
return (temp >> 8) | (temp << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads a signed 16 bit value over I2C or SPI
|
||||||
|
* @param reg the register address to read from
|
||||||
|
* @returns the 16 bit data value read from the device
|
||||||
|
*/
|
||||||
|
int16_t Adafruit_BME280::readS16(byte reg) { return (int16_t)read16(reg); }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads a signed little endian 16 bit value over I2C or SPI
|
||||||
|
* @param reg the register address to read from
|
||||||
|
* @returns the 16 bit data value read from the device
|
||||||
|
*/
|
||||||
|
int16_t Adafruit_BME280::readS16_LE(byte reg) {
|
||||||
|
return (int16_t)read16_LE(reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads a 24 bit value over I2C
|
||||||
|
* @param reg the register address to read from
|
||||||
|
* @returns the 24 bit data value read from the device
|
||||||
|
*/
|
||||||
|
uint32_t Adafruit_BME280::read24(byte reg) {
|
||||||
|
uint32_t value;
|
||||||
|
|
||||||
|
if (_cs == -1) {
|
||||||
|
_wire->beginTransmission((uint8_t)_i2caddr);
|
||||||
|
_wire->write((uint8_t)reg);
|
||||||
|
_wire->endTransmission();
|
||||||
|
_wire->requestFrom((uint8_t)_i2caddr, (byte)3);
|
||||||
|
|
||||||
|
value = _wire->read();
|
||||||
|
value <<= 8;
|
||||||
|
value |= _wire->read();
|
||||||
|
value <<= 8;
|
||||||
|
value |= _wire->read();
|
||||||
|
} else {
|
||||||
|
if (_sck == -1)
|
||||||
|
_spi->beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
|
||||||
|
digitalWrite(_cs, LOW);
|
||||||
|
spixfer(reg | 0x80); // read, bit 7 high
|
||||||
|
|
||||||
|
value = spixfer(0);
|
||||||
|
value <<= 8;
|
||||||
|
value |= spixfer(0);
|
||||||
|
value <<= 8;
|
||||||
|
value |= spixfer(0);
|
||||||
|
|
||||||
|
digitalWrite(_cs, HIGH);
|
||||||
|
if (_sck == -1)
|
||||||
|
_spi->endTransaction(); // release the SPI bus
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Take a new measurement (only possible in forced mode)
|
||||||
|
*/
|
||||||
|
void Adafruit_BME280::takeForcedMeasurement() {
|
||||||
|
// If we are in forced mode, the BME sensor goes back to sleep after each
|
||||||
|
// measurement and we need to set it to forced mode once at this point, so
|
||||||
|
// it will take the next measurement and then return to sleep again.
|
||||||
|
// In normal mode simply does new measurements periodically.
|
||||||
|
if (_measReg.mode == MODE_FORCED) {
|
||||||
|
// set to forced mode, i.e. "take next measurement"
|
||||||
|
write8(BME280_REGISTER_CONTROL, _measReg.get());
|
||||||
|
// wait until measurement has been completed, otherwise we would read
|
||||||
|
// the values from the last measurement
|
||||||
|
while (read8(BME280_REGISTER_STATUS) & 0x08)
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads the factory-set coefficients
|
||||||
|
*/
|
||||||
|
void Adafruit_BME280::readCoefficients(void) {
|
||||||
|
_bme280_calib.dig_T1 = read16_LE(BME280_REGISTER_DIG_T1);
|
||||||
|
_bme280_calib.dig_T2 = readS16_LE(BME280_REGISTER_DIG_T2);
|
||||||
|
_bme280_calib.dig_T3 = readS16_LE(BME280_REGISTER_DIG_T3);
|
||||||
|
|
||||||
|
_bme280_calib.dig_P1 = read16_LE(BME280_REGISTER_DIG_P1);
|
||||||
|
_bme280_calib.dig_P2 = readS16_LE(BME280_REGISTER_DIG_P2);
|
||||||
|
_bme280_calib.dig_P3 = readS16_LE(BME280_REGISTER_DIG_P3);
|
||||||
|
_bme280_calib.dig_P4 = readS16_LE(BME280_REGISTER_DIG_P4);
|
||||||
|
_bme280_calib.dig_P5 = readS16_LE(BME280_REGISTER_DIG_P5);
|
||||||
|
_bme280_calib.dig_P6 = readS16_LE(BME280_REGISTER_DIG_P6);
|
||||||
|
_bme280_calib.dig_P7 = readS16_LE(BME280_REGISTER_DIG_P7);
|
||||||
|
_bme280_calib.dig_P8 = readS16_LE(BME280_REGISTER_DIG_P8);
|
||||||
|
_bme280_calib.dig_P9 = readS16_LE(BME280_REGISTER_DIG_P9);
|
||||||
|
|
||||||
|
_bme280_calib.dig_H1 = read8(BME280_REGISTER_DIG_H1);
|
||||||
|
_bme280_calib.dig_H2 = readS16_LE(BME280_REGISTER_DIG_H2);
|
||||||
|
_bme280_calib.dig_H3 = read8(BME280_REGISTER_DIG_H3);
|
||||||
|
_bme280_calib.dig_H4 = (read8(BME280_REGISTER_DIG_H4) << 4) |
|
||||||
|
(read8(BME280_REGISTER_DIG_H4 + 1) & 0xF);
|
||||||
|
_bme280_calib.dig_H5 = (read8(BME280_REGISTER_DIG_H5 + 1) << 4) |
|
||||||
|
(read8(BME280_REGISTER_DIG_H5) >> 4);
|
||||||
|
_bme280_calib.dig_H6 = (int8_t)read8(BME280_REGISTER_DIG_H6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief return true if chip is busy reading cal data
|
||||||
|
* @returns true if reading calibration, false otherwise
|
||||||
|
*/
|
||||||
|
bool Adafruit_BME280::isReadingCalibration(void) {
|
||||||
|
uint8_t const rStatus = read8(BME280_REGISTER_STATUS);
|
||||||
|
|
||||||
|
return (rStatus & (1 << 0)) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the temperature from the sensor
|
||||||
|
* @returns the temperature read from the device
|
||||||
|
*/
|
||||||
|
float Adafruit_BME280::readTemperature(void) {
|
||||||
|
int32_t var1, var2;
|
||||||
|
|
||||||
|
int32_t adc_T = read24(BME280_REGISTER_TEMPDATA);
|
||||||
|
if (adc_T == 0x800000) // value in case temp measurement was disabled
|
||||||
|
return NAN;
|
||||||
|
adc_T >>= 4;
|
||||||
|
|
||||||
|
var1 = ((((adc_T >> 3) - ((int32_t)_bme280_calib.dig_T1 << 1))) *
|
||||||
|
((int32_t)_bme280_calib.dig_T2)) >>
|
||||||
|
11;
|
||||||
|
|
||||||
|
var2 = (((((adc_T >> 4) - ((int32_t)_bme280_calib.dig_T1)) *
|
||||||
|
((adc_T >> 4) - ((int32_t)_bme280_calib.dig_T1))) >>
|
||||||
|
12) *
|
||||||
|
((int32_t)_bme280_calib.dig_T3)) >>
|
||||||
|
14;
|
||||||
|
|
||||||
|
t_fine = var1 + var2;
|
||||||
|
|
||||||
|
float T = (t_fine * 5 + 128) >> 8;
|
||||||
|
return T / 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the pressure from the sensor
|
||||||
|
* @returns the pressure value (in Pascal) read from the device
|
||||||
|
*/
|
||||||
|
float Adafruit_BME280::readPressure(void) {
|
||||||
|
int64_t var1, var2, p;
|
||||||
|
|
||||||
|
readTemperature(); // must be done first to get t_fine
|
||||||
|
|
||||||
|
int32_t adc_P = read24(BME280_REGISTER_PRESSUREDATA);
|
||||||
|
if (adc_P == 0x800000) // value in case pressure measurement was disabled
|
||||||
|
return NAN;
|
||||||
|
adc_P >>= 4;
|
||||||
|
|
||||||
|
var1 = ((int64_t)t_fine) - 128000;
|
||||||
|
var2 = var1 * var1 * (int64_t)_bme280_calib.dig_P6;
|
||||||
|
var2 = var2 + ((var1 * (int64_t)_bme280_calib.dig_P5) << 17);
|
||||||
|
var2 = var2 + (((int64_t)_bme280_calib.dig_P4) << 35);
|
||||||
|
var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3) >> 8) +
|
||||||
|
((var1 * (int64_t)_bme280_calib.dig_P2) << 12);
|
||||||
|
var1 =
|
||||||
|
(((((int64_t)1) << 47) + var1)) * ((int64_t)_bme280_calib.dig_P1) >> 33;
|
||||||
|
|
||||||
|
if (var1 == 0) {
|
||||||
|
return 0; // avoid exception caused by division by zero
|
||||||
|
}
|
||||||
|
p = 1048576 - adc_P;
|
||||||
|
p = (((p << 31) - var2) * 3125) / var1;
|
||||||
|
var1 = (((int64_t)_bme280_calib.dig_P9) * (p >> 13) * (p >> 13)) >> 25;
|
||||||
|
var2 = (((int64_t)_bme280_calib.dig_P8) * p) >> 19;
|
||||||
|
|
||||||
|
p = ((p + var1 + var2) >> 8) + (((int64_t)_bme280_calib.dig_P7) << 4);
|
||||||
|
return (float)p / 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the humidity from the sensor
|
||||||
|
* @returns the humidity value read from the device
|
||||||
|
*/
|
||||||
|
float Adafruit_BME280::readHumidity(void) {
|
||||||
|
readTemperature(); // must be done first to get t_fine
|
||||||
|
|
||||||
|
int32_t adc_H = read16(BME280_REGISTER_HUMIDDATA);
|
||||||
|
if (adc_H == 0x8000) // value in case humidity measurement was disabled
|
||||||
|
return NAN;
|
||||||
|
|
||||||
|
int32_t v_x1_u32r;
|
||||||
|
|
||||||
|
v_x1_u32r = (t_fine - ((int32_t)76800));
|
||||||
|
|
||||||
|
v_x1_u32r = (((((adc_H << 14) - (((int32_t)_bme280_calib.dig_H4) << 20) -
|
||||||
|
(((int32_t)_bme280_calib.dig_H5) * v_x1_u32r)) +
|
||||||
|
((int32_t)16384)) >>
|
||||||
|
15) *
|
||||||
|
(((((((v_x1_u32r * ((int32_t)_bme280_calib.dig_H6)) >> 10) *
|
||||||
|
(((v_x1_u32r * ((int32_t)_bme280_calib.dig_H3)) >> 11) +
|
||||||
|
((int32_t)32768))) >>
|
||||||
|
10) +
|
||||||
|
((int32_t)2097152)) *
|
||||||
|
((int32_t)_bme280_calib.dig_H2) +
|
||||||
|
8192) >>
|
||||||
|
14));
|
||||||
|
|
||||||
|
v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) *
|
||||||
|
((int32_t)_bme280_calib.dig_H1)) >>
|
||||||
|
4));
|
||||||
|
|
||||||
|
v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r;
|
||||||
|
v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r;
|
||||||
|
float h = (v_x1_u32r >> 12);
|
||||||
|
return h / 1024.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Calculates the altitude (in meters) from the specified atmospheric
|
||||||
|
* pressure (in hPa), and sea-level pressure (in hPa).
|
||||||
|
* @param seaLevel Sea-level pressure in hPa
|
||||||
|
* @returns the altitude value read from the device
|
||||||
|
*/
|
||||||
|
float Adafruit_BME280::readAltitude(float seaLevel) {
|
||||||
|
// Equation taken from BMP180 datasheet (page 16):
|
||||||
|
// http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf
|
||||||
|
|
||||||
|
// Note that using the equation from wikipedia can give bad results
|
||||||
|
// at high altitude. See this thread for more information:
|
||||||
|
// http://forums.adafruit.com/viewtopic.php?f=22&t=58064
|
||||||
|
|
||||||
|
float atmospheric = readPressure() / 100.0F;
|
||||||
|
return 44330.0 * (1.0 - pow(atmospheric / seaLevel, 0.1903));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Calculates the pressure at sea level (in hPa) from the specified
|
||||||
|
* altitude (in meters), and atmospheric pressure (in hPa).
|
||||||
|
* @param altitude Altitude in meters
|
||||||
|
* @param atmospheric Atmospheric pressure in hPa
|
||||||
|
* @returns the pressure at sea level (in hPa) from the specified altitude
|
||||||
|
*/
|
||||||
|
float Adafruit_BME280::seaLevelForAltitude(float altitude, float atmospheric) {
|
||||||
|
// Equation taken from BMP180 datasheet (page 17):
|
||||||
|
// http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf
|
||||||
|
|
||||||
|
// Note that using the equation from wikipedia can give bad results
|
||||||
|
// at high altitude. See this thread for more information:
|
||||||
|
// http://forums.adafruit.com/viewtopic.php?f=22&t=58064
|
||||||
|
|
||||||
|
return atmospheric / pow(1.0 - (altitude / 44330.0), 5.255);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns Sensor ID found by init() for diagnostics
|
||||||
|
* @returns Sensor ID 0x60 for BME280, 0x56, 0x57, 0x58 BMP280
|
||||||
|
*/
|
||||||
|
uint32_t Adafruit_BME280::sensorID(void) { return _sensorID; }
|
339
firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.h
Executable file
339
firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.h
Executable file
|
@ -0,0 +1,339 @@
|
||||||
|
/*!
|
||||||
|
* @file Adafruit_BME280.h
|
||||||
|
*
|
||||||
|
* Designed specifically to work with the Adafruit BME280 Breakout
|
||||||
|
* ----> http://www.adafruit.com/products/2650
|
||||||
|
*
|
||||||
|
* These sensors use I2C or SPI to communicate, 2 or 4 pins are required
|
||||||
|
* to interface.
|
||||||
|
*
|
||||||
|
* Adafruit invests time and resources providing this open source code,
|
||||||
|
* please support Adafruit and open-source hardware by purchasing
|
||||||
|
* products from Adafruit!
|
||||||
|
*
|
||||||
|
* Written by Kevin "KTOWN" Townsend for Adafruit Industries.
|
||||||
|
*
|
||||||
|
* BSD license, all text here must be included in any redistribution.
|
||||||
|
* See the LICENSE file for details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __BME280_H__
|
||||||
|
#define __BME280_H__
|
||||||
|
|
||||||
|
#include "Arduino.h"
|
||||||
|
|
||||||
|
#include <Adafruit_Sensor.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief default I2C address
|
||||||
|
*/
|
||||||
|
#define BME280_ADDRESS (0x77) // Primary I2C Address
|
||||||
|
/*!
|
||||||
|
* @brief alternate I2C address
|
||||||
|
*/
|
||||||
|
#define BME280_ADDRESS_ALTERNATE (0x76) // Alternate Address
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Register addresses
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
BME280_REGISTER_DIG_T1 = 0x88,
|
||||||
|
BME280_REGISTER_DIG_T2 = 0x8A,
|
||||||
|
BME280_REGISTER_DIG_T3 = 0x8C,
|
||||||
|
|
||||||
|
BME280_REGISTER_DIG_P1 = 0x8E,
|
||||||
|
BME280_REGISTER_DIG_P2 = 0x90,
|
||||||
|
BME280_REGISTER_DIG_P3 = 0x92,
|
||||||
|
BME280_REGISTER_DIG_P4 = 0x94,
|
||||||
|
BME280_REGISTER_DIG_P5 = 0x96,
|
||||||
|
BME280_REGISTER_DIG_P6 = 0x98,
|
||||||
|
BME280_REGISTER_DIG_P7 = 0x9A,
|
||||||
|
BME280_REGISTER_DIG_P8 = 0x9C,
|
||||||
|
BME280_REGISTER_DIG_P9 = 0x9E,
|
||||||
|
|
||||||
|
BME280_REGISTER_DIG_H1 = 0xA1,
|
||||||
|
BME280_REGISTER_DIG_H2 = 0xE1,
|
||||||
|
BME280_REGISTER_DIG_H3 = 0xE3,
|
||||||
|
BME280_REGISTER_DIG_H4 = 0xE4,
|
||||||
|
BME280_REGISTER_DIG_H5 = 0xE5,
|
||||||
|
BME280_REGISTER_DIG_H6 = 0xE7,
|
||||||
|
|
||||||
|
BME280_REGISTER_CHIPID = 0xD0,
|
||||||
|
BME280_REGISTER_VERSION = 0xD1,
|
||||||
|
BME280_REGISTER_SOFTRESET = 0xE0,
|
||||||
|
|
||||||
|
BME280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0
|
||||||
|
|
||||||
|
BME280_REGISTER_CONTROLHUMID = 0xF2,
|
||||||
|
BME280_REGISTER_STATUS = 0XF3,
|
||||||
|
BME280_REGISTER_CONTROL = 0xF4,
|
||||||
|
BME280_REGISTER_CONFIG = 0xF5,
|
||||||
|
BME280_REGISTER_PRESSUREDATA = 0xF7,
|
||||||
|
BME280_REGISTER_TEMPDATA = 0xFA,
|
||||||
|
BME280_REGISTER_HUMIDDATA = 0xFD
|
||||||
|
};
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief calibration data
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
typedef struct {
|
||||||
|
uint16_t dig_T1; ///< temperature compensation value
|
||||||
|
int16_t dig_T2; ///< temperature compensation value
|
||||||
|
int16_t dig_T3; ///< temperature compensation value
|
||||||
|
|
||||||
|
uint16_t dig_P1; ///< pressure compensation value
|
||||||
|
int16_t dig_P2; ///< pressure compensation value
|
||||||
|
int16_t dig_P3; ///< pressure compensation value
|
||||||
|
int16_t dig_P4; ///< pressure compensation value
|
||||||
|
int16_t dig_P5; ///< pressure compensation value
|
||||||
|
int16_t dig_P6; ///< pressure compensation value
|
||||||
|
int16_t dig_P7; ///< pressure compensation value
|
||||||
|
int16_t dig_P8; ///< pressure compensation value
|
||||||
|
int16_t dig_P9; ///< pressure compensation value
|
||||||
|
|
||||||
|
uint8_t dig_H1; ///< humidity compensation value
|
||||||
|
int16_t dig_H2; ///< humidity compensation value
|
||||||
|
uint8_t dig_H3; ///< humidity compensation value
|
||||||
|
int16_t dig_H4; ///< humidity compensation value
|
||||||
|
int16_t dig_H5; ///< humidity compensation value
|
||||||
|
int8_t dig_H6; ///< humidity compensation value
|
||||||
|
} bme280_calib_data;
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
class Adafruit_BME280_Unified : public Adafruit_Sensor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Adafruit_BME280_Unified(int32_t sensorID = -1);
|
||||||
|
|
||||||
|
bool begin(uint8_t addr = BME280_ADDRESS);
|
||||||
|
void getTemperature(float *temp);
|
||||||
|
void getPressure(float *pressure);
|
||||||
|
float pressureToAltitude(float seaLevel, float atmospheric, float temp);
|
||||||
|
float seaLevelForAltitude(float altitude, float atmospheric, float temp);
|
||||||
|
void getEvent(sensors_event_t*);
|
||||||
|
void getSensor(sensor_t*);
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t _i2c_addr;
|
||||||
|
int32_t _sensorID;
|
||||||
|
};
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief Class that stores state and functions for interacting with BME280 IC
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
class Adafruit_BME280 {
|
||||||
|
public:
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief sampling rates
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
enum sensor_sampling {
|
||||||
|
SAMPLING_NONE = 0b000,
|
||||||
|
SAMPLING_X1 = 0b001,
|
||||||
|
SAMPLING_X2 = 0b010,
|
||||||
|
SAMPLING_X4 = 0b011,
|
||||||
|
SAMPLING_X8 = 0b100,
|
||||||
|
SAMPLING_X16 = 0b101
|
||||||
|
};
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief power modes
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
enum sensor_mode {
|
||||||
|
MODE_SLEEP = 0b00,
|
||||||
|
MODE_FORCED = 0b01,
|
||||||
|
MODE_NORMAL = 0b11
|
||||||
|
};
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief filter values
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
enum sensor_filter {
|
||||||
|
FILTER_OFF = 0b000,
|
||||||
|
FILTER_X2 = 0b001,
|
||||||
|
FILTER_X4 = 0b010,
|
||||||
|
FILTER_X8 = 0b011,
|
||||||
|
FILTER_X16 = 0b100
|
||||||
|
};
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief standby duration in ms
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
enum standby_duration {
|
||||||
|
STANDBY_MS_0_5 = 0b000,
|
||||||
|
STANDBY_MS_10 = 0b110,
|
||||||
|
STANDBY_MS_20 = 0b111,
|
||||||
|
STANDBY_MS_62_5 = 0b001,
|
||||||
|
STANDBY_MS_125 = 0b010,
|
||||||
|
STANDBY_MS_250 = 0b011,
|
||||||
|
STANDBY_MS_500 = 0b100,
|
||||||
|
STANDBY_MS_1000 = 0b101
|
||||||
|
};
|
||||||
|
|
||||||
|
// constructors
|
||||||
|
Adafruit_BME280();
|
||||||
|
Adafruit_BME280(int8_t cspin, SPIClass *theSPI = &SPI);
|
||||||
|
Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin,
|
||||||
|
int8_t sckpin);
|
||||||
|
|
||||||
|
bool begin();
|
||||||
|
bool begin(TwoWire *theWire);
|
||||||
|
bool begin(uint8_t addr);
|
||||||
|
bool begin(uint8_t addr, TwoWire *theWire);
|
||||||
|
bool init();
|
||||||
|
|
||||||
|
void setSampling(sensor_mode mode = MODE_NORMAL,
|
||||||
|
sensor_sampling tempSampling = SAMPLING_X16,
|
||||||
|
sensor_sampling pressSampling = SAMPLING_X16,
|
||||||
|
sensor_sampling humSampling = SAMPLING_X16,
|
||||||
|
sensor_filter filter = FILTER_OFF,
|
||||||
|
standby_duration duration = STANDBY_MS_0_5);
|
||||||
|
|
||||||
|
void takeForcedMeasurement();
|
||||||
|
float readTemperature(void);
|
||||||
|
float readPressure(void);
|
||||||
|
float readHumidity(void);
|
||||||
|
|
||||||
|
float readAltitude(float seaLevel);
|
||||||
|
float seaLevelForAltitude(float altitude, float pressure);
|
||||||
|
uint32_t sensorID(void);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
TwoWire *_wire; //!< pointer to a TwoWire object
|
||||||
|
SPIClass *_spi; //!< pointer to SPI object
|
||||||
|
void readCoefficients(void);
|
||||||
|
bool isReadingCalibration(void);
|
||||||
|
uint8_t spixfer(uint8_t x);
|
||||||
|
|
||||||
|
void write8(byte reg, byte value);
|
||||||
|
uint8_t read8(byte reg);
|
||||||
|
uint16_t read16(byte reg);
|
||||||
|
uint32_t read24(byte reg);
|
||||||
|
int16_t readS16(byte reg);
|
||||||
|
uint16_t read16_LE(byte reg); // little endian
|
||||||
|
int16_t readS16_LE(byte reg); // little endian
|
||||||
|
|
||||||
|
uint8_t _i2caddr; //!< I2C addr for the TwoWire interface
|
||||||
|
int32_t _sensorID; //!< ID of the BME Sensor
|
||||||
|
int32_t t_fine; //!< temperature with high resolution, stored as an attribute
|
||||||
|
//!< as this is used for temperature compensation reading
|
||||||
|
//!< humidity and pressure
|
||||||
|
|
||||||
|
int8_t _cs; //!< for the SPI interface
|
||||||
|
int8_t _mosi; //!< for the SPI interface
|
||||||
|
int8_t _miso; //!< for the SPI interface
|
||||||
|
int8_t _sck; //!< for the SPI interface
|
||||||
|
|
||||||
|
bme280_calib_data _bme280_calib; //!< here calibration data is stored
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief config register
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
struct config {
|
||||||
|
// inactive duration (standby time) in normal mode
|
||||||
|
// 000 = 0.5 ms
|
||||||
|
// 001 = 62.5 ms
|
||||||
|
// 010 = 125 ms
|
||||||
|
// 011 = 250 ms
|
||||||
|
// 100 = 500 ms
|
||||||
|
// 101 = 1000 ms
|
||||||
|
// 110 = 10 ms
|
||||||
|
// 111 = 20 ms
|
||||||
|
unsigned int t_sb : 3; ///< inactive duration (standby time) in normal mode
|
||||||
|
|
||||||
|
// filter settings
|
||||||
|
// 000 = filter off
|
||||||
|
// 001 = 2x filter
|
||||||
|
// 010 = 4x filter
|
||||||
|
// 011 = 8x filter
|
||||||
|
// 100 and above = 16x filter
|
||||||
|
unsigned int filter : 3; ///< filter settings
|
||||||
|
|
||||||
|
// unused - don't set
|
||||||
|
unsigned int none : 1; ///< unused - don't set
|
||||||
|
unsigned int spi3w_en : 1; ///< unused - don't set
|
||||||
|
|
||||||
|
/// @return combined config register
|
||||||
|
unsigned int get() { return (t_sb << 5) | (filter << 2) | spi3w_en; }
|
||||||
|
};
|
||||||
|
config _configReg; //!< config register object
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief ctrl_meas register
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
struct ctrl_meas {
|
||||||
|
// temperature oversampling
|
||||||
|
// 000 = skipped
|
||||||
|
// 001 = x1
|
||||||
|
// 010 = x2
|
||||||
|
// 011 = x4
|
||||||
|
// 100 = x8
|
||||||
|
// 101 and above = x16
|
||||||
|
unsigned int osrs_t : 3; ///< temperature oversampling
|
||||||
|
|
||||||
|
// pressure oversampling
|
||||||
|
// 000 = skipped
|
||||||
|
// 001 = x1
|
||||||
|
// 010 = x2
|
||||||
|
// 011 = x4
|
||||||
|
// 100 = x8
|
||||||
|
// 101 and above = x16
|
||||||
|
unsigned int osrs_p : 3; ///< pressure oversampling
|
||||||
|
|
||||||
|
// device mode
|
||||||
|
// 00 = sleep
|
||||||
|
// 01 or 10 = forced
|
||||||
|
// 11 = normal
|
||||||
|
unsigned int mode : 2; ///< device mode
|
||||||
|
|
||||||
|
/// @return combined ctrl register
|
||||||
|
unsigned int get() { return (osrs_t << 5) | (osrs_p << 2) | mode; }
|
||||||
|
};
|
||||||
|
ctrl_meas _measReg; //!< measurement register object
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@brief ctrl_hum register
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
struct ctrl_hum {
|
||||||
|
/// unused - don't set
|
||||||
|
unsigned int none : 5;
|
||||||
|
|
||||||
|
// pressure oversampling
|
||||||
|
// 000 = skipped
|
||||||
|
// 001 = x1
|
||||||
|
// 010 = x2
|
||||||
|
// 011 = x4
|
||||||
|
// 100 = x8
|
||||||
|
// 101 and above = x16
|
||||||
|
unsigned int osrs_h : 3; ///< pressure oversampling
|
||||||
|
|
||||||
|
/// @return combined ctrl hum register
|
||||||
|
unsigned int get() { return (osrs_h); }
|
||||||
|
};
|
||||||
|
ctrl_hum _humReg; //!< hum register object
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
27
firmware/libraries/Adafruit_BME280_Library/LICENSE
Executable file
27
firmware/libraries/Adafruit_BME280_Library/LICENSE
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
Copyright (c) 2015, Limor Fried & Kevin Townsend for Adafruit Industries
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of Adafruit Industries nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
31
firmware/libraries/Adafruit_BME280_Library/README.md
Executable file
31
firmware/libraries/Adafruit_BME280_Library/README.md
Executable file
|
@ -0,0 +1,31 @@
|
||||||
|
# Adafruit BME280 Library [![Build Status](https://travis-ci.com/adafruit/Adafruit_BME280_Library.svg?branch=master)](https://travis-ci.com/adafruit/Adafruit_BME280_Library)
|
||||||
|
|
||||||
|
<a href="http://www.adafruit.com/products/2652"><img src="./assets/board.jpg" width="500"/></a>
|
||||||
|
|
||||||
|
This is a library for the Adafruit BME280 Humidity, Barometric Pressure + Temp sensor
|
||||||
|
|
||||||
|
Designed specifically to work with the Adafruit BME280 Breakout
|
||||||
|
* http://www.adafruit.com/products/2652
|
||||||
|
|
||||||
|
These sensors use I2C or SPI to communicate, up to 4 pins are required to interface
|
||||||
|
|
||||||
|
Use of this library also requires [Adafruit_Sensor](https://github.com/adafruit/Adafruit_Sensor)
|
||||||
|
to be installed on your local system.
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code,
|
||||||
|
please support Adafruit and open-source hardware by purchasing
|
||||||
|
products from Adafruit!
|
||||||
|
|
||||||
|
Check out the links above for our tutorials and wiring diagrams
|
||||||
|
|
||||||
|
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||||
|
BSD license, all text above must be included in any redistribution
|
||||||
|
|
||||||
|
To download. click the DOWNLOAD ZIP button, rename the uncompressed folder Adafruit_BME280.
|
||||||
|
Check that the Adafruit_BME280 folder contains Adafruit_BME280.cpp and Adafruit_BME280.h
|
||||||
|
|
||||||
|
Place the Adafruit_BME280 library folder your arduinosketchfolder/libraries/ folder.
|
||||||
|
You may need to create the libraries subfolder if its your first library. Restart the IDE.
|
||||||
|
|
||||||
|
We also have a great tutorial on Arduino library installation at:
|
||||||
|
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use
|
BIN
firmware/libraries/Adafruit_BME280_Library/assets/board.jpg
Executable file
BIN
firmware/libraries/Adafruit_BME280_Library/assets/board.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 431 KiB |
|
@ -0,0 +1,159 @@
|
||||||
|
/***************************************************************************
|
||||||
|
This is a library for the BME280 humidity, temperature & pressure sensor
|
||||||
|
|
||||||
|
Designed specifically to work with the Adafruit BME280 Breakout
|
||||||
|
----> http://www.adafruit.com/products/2650
|
||||||
|
|
||||||
|
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
|
||||||
|
to interface. The device's I2C address is either 0x76 or 0x77.
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code,
|
||||||
|
please support Adafruit andopen-source hardware by purchasing products
|
||||||
|
from Adafruit!
|
||||||
|
|
||||||
|
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||||
|
BSD license, all text above must be included in any redistribution
|
||||||
|
See the LICENSE file for details.
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Adafruit_Sensor.h>
|
||||||
|
#include <Adafruit_BME280.h>
|
||||||
|
|
||||||
|
#define BME_SCK 13
|
||||||
|
#define BME_MISO 12
|
||||||
|
#define BME_MOSI 11
|
||||||
|
#define BME_CS 10
|
||||||
|
|
||||||
|
#define SEALEVELPRESSURE_HPA (1013.25)
|
||||||
|
|
||||||
|
Adafruit_BME280 bme; // I2C
|
||||||
|
//Adafruit_BME280 bme(BME_CS); // hardware SPI
|
||||||
|
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
|
||||||
|
|
||||||
|
unsigned long delayTime;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println(F("BME280 test"));
|
||||||
|
|
||||||
|
if (! bme.begin(&Wire)) {
|
||||||
|
Serial.println("Could not find a valid BME280 sensor, check wiring!");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("-- Default Test --");
|
||||||
|
Serial.println("normal mode, 16x oversampling for all, filter off,");
|
||||||
|
Serial.println("0.5ms standby period");
|
||||||
|
delayTime = 5000;
|
||||||
|
|
||||||
|
|
||||||
|
// For more details on the following scenarious, see chapter
|
||||||
|
// 3.5 "Recommended modes of operation" in the datasheet
|
||||||
|
|
||||||
|
/*
|
||||||
|
// weather monitoring
|
||||||
|
Serial.println("-- Weather Station Scenario --");
|
||||||
|
Serial.println("forced mode, 1x temperature / 1x humidity / 1x pressure oversampling,");
|
||||||
|
Serial.println("filter off");
|
||||||
|
bme.setSampling(Adafruit_BME280::MODE_FORCED,
|
||||||
|
Adafruit_BME280::SAMPLING_X1, // temperature
|
||||||
|
Adafruit_BME280::SAMPLING_X1, // pressure
|
||||||
|
Adafruit_BME280::SAMPLING_X1, // humidity
|
||||||
|
Adafruit_BME280::FILTER_OFF );
|
||||||
|
|
||||||
|
// suggested rate is 1/60Hz (1m)
|
||||||
|
delayTime = 60000; // in milliseconds
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
// humidity sensing
|
||||||
|
Serial.println("-- Humidity Sensing Scenario --");
|
||||||
|
Serial.println("forced mode, 1x temperature / 1x humidity / 0x pressure oversampling");
|
||||||
|
Serial.println("= pressure off, filter off");
|
||||||
|
bme.setSampling(Adafruit_BME280::MODE_FORCED,
|
||||||
|
Adafruit_BME280::SAMPLING_X1, // temperature
|
||||||
|
Adafruit_BME280::SAMPLING_NONE, // pressure
|
||||||
|
Adafruit_BME280::SAMPLING_X1, // humidity
|
||||||
|
Adafruit_BME280::FILTER_OFF );
|
||||||
|
|
||||||
|
// suggested rate is 1Hz (1s)
|
||||||
|
delayTime = 1000; // in milliseconds
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
// indoor navigation
|
||||||
|
Serial.println("-- Indoor Navigation Scenario --");
|
||||||
|
Serial.println("normal mode, 16x pressure / 2x temperature / 1x humidity oversampling,");
|
||||||
|
Serial.println("0.5ms standby period, filter 16x");
|
||||||
|
bme.setSampling(Adafruit_BME280::MODE_NORMAL,
|
||||||
|
Adafruit_BME280::SAMPLING_X2, // temperature
|
||||||
|
Adafruit_BME280::SAMPLING_X16, // pressure
|
||||||
|
Adafruit_BME280::SAMPLING_X1, // humidity
|
||||||
|
Adafruit_BME280::FILTER_X16,
|
||||||
|
Adafruit_BME280::STANDBY_MS_0_5 );
|
||||||
|
|
||||||
|
// suggested rate is 25Hz
|
||||||
|
// 1 + (2 * T_ovs) + (2 * P_ovs + 0.5) + (2 * H_ovs + 0.5)
|
||||||
|
// T_ovs = 2
|
||||||
|
// P_ovs = 16
|
||||||
|
// H_ovs = 1
|
||||||
|
// = 40ms (25Hz)
|
||||||
|
// with standby time that should really be 24.16913... Hz
|
||||||
|
delayTime = 41;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
// gaming
|
||||||
|
Serial.println("-- Gaming Scenario --");
|
||||||
|
Serial.println("normal mode, 4x pressure / 1x temperature / 0x humidity oversampling,");
|
||||||
|
Serial.println("= humidity off, 0.5ms standby period, filter 16x");
|
||||||
|
bme.setSampling(Adafruit_BME280::MODE_NORMAL,
|
||||||
|
Adafruit_BME280::SAMPLING_X1, // temperature
|
||||||
|
Adafruit_BME280::SAMPLING_X4, // pressure
|
||||||
|
Adafruit_BME280::SAMPLING_NONE, // humidity
|
||||||
|
Adafruit_BME280::FILTER_X16,
|
||||||
|
Adafruit_BME280::STANDBY_MS_0_5 );
|
||||||
|
|
||||||
|
// Suggested rate is 83Hz
|
||||||
|
// 1 + (2 * T_ovs) + (2 * P_ovs + 0.5)
|
||||||
|
// T_ovs = 1
|
||||||
|
// P_ovs = 4
|
||||||
|
// = 11.5ms + 0.5ms standby
|
||||||
|
delayTime = 12;
|
||||||
|
*/
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Only needed in forced mode! In normal mode, you can remove the next line.
|
||||||
|
bme.takeForcedMeasurement(); // has no effect in normal mode
|
||||||
|
|
||||||
|
printValues();
|
||||||
|
delay(delayTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printValues() {
|
||||||
|
Serial.print("Temperature = ");
|
||||||
|
Serial.print(bme.readTemperature());
|
||||||
|
Serial.println(" *C");
|
||||||
|
|
||||||
|
Serial.print("Pressure = ");
|
||||||
|
|
||||||
|
Serial.print(bme.readPressure() / 100.0F);
|
||||||
|
Serial.println(" hPa");
|
||||||
|
|
||||||
|
Serial.print("Approx. Altitude = ");
|
||||||
|
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
|
||||||
|
Serial.println(" m");
|
||||||
|
|
||||||
|
Serial.print("Humidity = ");
|
||||||
|
Serial.print(bme.readHumidity());
|
||||||
|
Serial.println(" %");
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
/***************************************************************************
|
||||||
|
This is a library for the BME280 humidity, temperature & pressure sensor
|
||||||
|
|
||||||
|
Designed specifically to work with the Adafruit BME280 Breakout
|
||||||
|
----> http://www.adafruit.com/products/2650
|
||||||
|
|
||||||
|
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
|
||||||
|
to interface. The device's I2C address is either 0x76 or 0x77.
|
||||||
|
|
||||||
|
Adafruit invests time and resources providing this open source code,
|
||||||
|
please support Adafruit andopen-source hardware by purchasing products
|
||||||
|
from Adafruit!
|
||||||
|
|
||||||
|
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||||
|
BSD license, all text above must be included in any redistribution
|
||||||
|
See the LICENSE file for details.
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Adafruit_Sensor.h>
|
||||||
|
#include <Adafruit_BME280.h>
|
||||||
|
|
||||||
|
#define BME_SCK 13
|
||||||
|
#define BME_MISO 12
|
||||||
|
#define BME_MOSI 11
|
||||||
|
#define BME_CS 10
|
||||||
|
|
||||||
|
#define SEALEVELPRESSURE_HPA (1013.25)
|
||||||
|
|
||||||
|
Adafruit_BME280 bme; // I2C
|
||||||
|
//Adafruit_BME280 bme(BME_CS); // hardware SPI
|
||||||
|
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
|
||||||
|
|
||||||
|
unsigned long delayTime;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
while(!Serial); // time to get serial running
|
||||||
|
Serial.println(F("BME280 test"));
|
||||||
|
|
||||||
|
unsigned status;
|
||||||
|
|
||||||
|
// default settings
|
||||||
|
// (you can also pass in a Wire library object like &Wire2)
|
||||||
|
status = bme.begin();
|
||||||
|
if (!status) {
|
||||||
|
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
|
||||||
|
Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
|
||||||
|
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
|
||||||
|
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
|
||||||
|
Serial.print(" ID of 0x60 represents a BME 280.\n");
|
||||||
|
Serial.print(" ID of 0x61 represents a BME 680.\n");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("-- Default Test --");
|
||||||
|
delayTime = 1000;
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
printValues();
|
||||||
|
delay(delayTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printValues() {
|
||||||
|
Serial.print("Temperature = ");
|
||||||
|
Serial.print(bme.readTemperature());
|
||||||
|
Serial.println(" *C");
|
||||||
|
|
||||||
|
Serial.print("Pressure = ");
|
||||||
|
|
||||||
|
Serial.print(bme.readPressure() / 100.0F);
|
||||||
|
Serial.println(" hPa");
|
||||||
|
|
||||||
|
Serial.print("Approx. Altitude = ");
|
||||||
|
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
|
||||||
|
Serial.println(" m");
|
||||||
|
|
||||||
|
Serial.print("Humidity = ");
|
||||||
|
Serial.print(bme.readHumidity());
|
||||||
|
Serial.println(" %");
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
}
|
9
firmware/libraries/Adafruit_BME280_Library/library.properties
Executable file
9
firmware/libraries/Adafruit_BME280_Library/library.properties
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
name=Adafruit BME280 Library
|
||||||
|
version=1.0.9
|
||||||
|
author=Adafruit
|
||||||
|
maintainer=Adafruit <info@adafruit.com>
|
||||||
|
sentence=Arduino library for BME280 sensors.
|
||||||
|
paragraph=Arduino library for BME280 humidity and pressure sensors.
|
||||||
|
category=Sensors
|
||||||
|
url=https://github.com/adafruit/Adafruit_BME280_Library
|
||||||
|
architectures=*
|
156
firmware/libraries/Adafruit_Unified_Sensor/Adafruit_Sensor.h
Executable file
156
firmware/libraries/Adafruit_Unified_Sensor/Adafruit_Sensor.h
Executable file
|
@ -0,0 +1,156 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software< /span>
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Update by K. Townsend (Adafruit Industries) for lighter typedefs, and
|
||||||
|
* extended sensor support to include color, voltage and current */
|
||||||
|
|
||||||
|
#ifndef _ADAFRUIT_SENSOR_H
|
||||||
|
#define _ADAFRUIT_SENSOR_H
|
||||||
|
|
||||||
|
#ifndef ARDUINO
|
||||||
|
#include <stdint.h>
|
||||||
|
#elif ARDUINO >= 100
|
||||||
|
#include "Arduino.h"
|
||||||
|
#include "Print.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Intentionally modeled after sensors.h in the Android API:
|
||||||
|
* https://github.com/android/platform_hardware_libhardware/blob/master/include/hardware/sensors.h */
|
||||||
|
|
||||||
|
/* Constants */
|
||||||
|
#define SENSORS_GRAVITY_EARTH (9.80665F) /**< Earth's gravity in m/s^2 */
|
||||||
|
#define SENSORS_GRAVITY_MOON (1.6F) /**< The moon's gravity in m/s^2 */
|
||||||
|
#define SENSORS_GRAVITY_SUN (275.0F) /**< The sun's gravity in m/s^2 */
|
||||||
|
#define SENSORS_GRAVITY_STANDARD (SENSORS_GRAVITY_EARTH)
|
||||||
|
#define SENSORS_MAGFIELD_EARTH_MAX (60.0F) /**< Maximum magnetic field on Earth's surface */
|
||||||
|
#define SENSORS_MAGFIELD_EARTH_MIN (30.0F) /**< Minimum magnetic field on Earth's surface */
|
||||||
|
#define SENSORS_PRESSURE_SEALEVELHPA (1013.25F) /**< Average sea level pressure is 1013.25 hPa */
|
||||||
|
#define SENSORS_DPS_TO_RADS (0.017453293F) /**< Degrees/s to rad/s multiplier */
|
||||||
|
#define SENSORS_GAUSS_TO_MICROTESLA (100) /**< Gauss to micro-Tesla multiplier */
|
||||||
|
|
||||||
|
/** Sensor types */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SENSOR_TYPE_ACCELEROMETER = (1), /**< Gravity + linear acceleration */
|
||||||
|
SENSOR_TYPE_MAGNETIC_FIELD = (2),
|
||||||
|
SENSOR_TYPE_ORIENTATION = (3),
|
||||||
|
SENSOR_TYPE_GYROSCOPE = (4),
|
||||||
|
SENSOR_TYPE_LIGHT = (5),
|
||||||
|
SENSOR_TYPE_PRESSURE = (6),
|
||||||
|
SENSOR_TYPE_PROXIMITY = (8),
|
||||||
|
SENSOR_TYPE_GRAVITY = (9),
|
||||||
|
SENSOR_TYPE_LINEAR_ACCELERATION = (10), /**< Acceleration not including gravity */
|
||||||
|
SENSOR_TYPE_ROTATION_VECTOR = (11),
|
||||||
|
SENSOR_TYPE_RELATIVE_HUMIDITY = (12),
|
||||||
|
SENSOR_TYPE_AMBIENT_TEMPERATURE = (13),
|
||||||
|
SENSOR_TYPE_VOLTAGE = (15),
|
||||||
|
SENSOR_TYPE_CURRENT = (16),
|
||||||
|
SENSOR_TYPE_COLOR = (17)
|
||||||
|
} sensors_type_t;
|
||||||
|
|
||||||
|
/** struct sensors_vec_s is used to return a vector in a common format. */
|
||||||
|
typedef struct {
|
||||||
|
union {
|
||||||
|
float v[3];
|
||||||
|
struct {
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
float z;
|
||||||
|
};
|
||||||
|
/* Orientation sensors */
|
||||||
|
struct {
|
||||||
|
float roll; /**< Rotation around the longitudinal axis (the plane body, 'X axis'). Roll is positive and increasing when moving downward. -90°<=roll<=90° */
|
||||||
|
float pitch; /**< Rotation around the lateral axis (the wing span, 'Y axis'). Pitch is positive and increasing when moving upwards. -180°<=pitch<=180°) */
|
||||||
|
float heading; /**< Angle between the longitudinal axis (the plane body) and magnetic north, measured clockwise when viewing from the top of the device. 0-359° */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
int8_t status;
|
||||||
|
uint8_t reserved[3];
|
||||||
|
} sensors_vec_t;
|
||||||
|
|
||||||
|
/** struct sensors_color_s is used to return color data in a common format. */
|
||||||
|
typedef struct {
|
||||||
|
union {
|
||||||
|
float c[3];
|
||||||
|
/* RGB color space */
|
||||||
|
struct {
|
||||||
|
float r; /**< Red component */
|
||||||
|
float g; /**< Green component */
|
||||||
|
float b; /**< Blue component */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
uint32_t rgba; /**< 24-bit RGBA value */
|
||||||
|
} sensors_color_t;
|
||||||
|
|
||||||
|
/* Sensor event (36 bytes) */
|
||||||
|
/** struct sensor_event_s is used to provide a single sensor event in a common format. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int32_t version; /**< must be sizeof(struct sensors_event_t) */
|
||||||
|
int32_t sensor_id; /**< unique sensor identifier */
|
||||||
|
int32_t type; /**< sensor type */
|
||||||
|
int32_t reserved0; /**< reserved */
|
||||||
|
int32_t timestamp; /**< time is in milliseconds */
|
||||||
|
union
|
||||||
|
{
|
||||||
|
float data[4];
|
||||||
|
sensors_vec_t acceleration; /**< acceleration values are in meter per second per second (m/s^2) */
|
||||||
|
sensors_vec_t magnetic; /**< magnetic vector values are in micro-Tesla (uT) */
|
||||||
|
sensors_vec_t orientation; /**< orientation values are in degrees */
|
||||||
|
sensors_vec_t gyro; /**< gyroscope values are in rad/s */
|
||||||
|
float temperature; /**< temperature is in degrees centigrade (Celsius) */
|
||||||
|
float distance; /**< distance in centimeters */
|
||||||
|
float light; /**< light in SI lux units */
|
||||||
|
float pressure; /**< pressure in hectopascal (hPa) */
|
||||||
|
float relative_humidity; /**< relative humidity in percent */
|
||||||
|
float current; /**< current in milliamps (mA) */
|
||||||
|
float voltage; /**< voltage in volts (V) */
|
||||||
|
sensors_color_t color; /**< color in RGB component values */
|
||||||
|
};
|
||||||
|
} sensors_event_t;
|
||||||
|
|
||||||
|
/* Sensor details (40 bytes) */
|
||||||
|
/** struct sensor_s is used to describe basic information about a specific sensor. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[12]; /**< sensor name */
|
||||||
|
int32_t version; /**< version of the hardware + driver */
|
||||||
|
int32_t sensor_id; /**< unique sensor identifier */
|
||||||
|
int32_t type; /**< this sensor's type (ex. SENSOR_TYPE_LIGHT) */
|
||||||
|
float max_value; /**< maximum value of this sensor's value in SI units */
|
||||||
|
float min_value; /**< minimum value of this sensor's value in SI units */
|
||||||
|
float resolution; /**< smallest difference between two values reported by this sensor */
|
||||||
|
int32_t min_delay; /**< min delay in microseconds between events. zero = not a constant rate */
|
||||||
|
} sensor_t;
|
||||||
|
|
||||||
|
class Adafruit_Sensor {
|
||||||
|
public:
|
||||||
|
// Constructor(s)
|
||||||
|
Adafruit_Sensor() {}
|
||||||
|
virtual ~Adafruit_Sensor() {}
|
||||||
|
|
||||||
|
// These must be defined by the subclass
|
||||||
|
virtual void enableAutoRange(bool enabled) { (void)enabled; /* suppress unused warning */ };
|
||||||
|
virtual bool getEvent(sensors_event_t*) = 0;
|
||||||
|
virtual void getSensor(sensor_t*) = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _autoRange;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
229
firmware/libraries/Adafruit_Unified_Sensor/README.md
Executable file
229
firmware/libraries/Adafruit_Unified_Sensor/README.md
Executable file
|
@ -0,0 +1,229 @@
|
||||||
|
# Adafruit Unified Sensor Driver #
|
||||||
|
|
||||||
|
Many small embedded systems exist to collect data from sensors, analyse the data, and either take an appropriate action or send that sensor data to another system for processing.
|
||||||
|
|
||||||
|
One of the many challenges of embedded systems design is the fact that parts you used today may be out of production tomorrow, or system requirements may change and you may need to choose a different sensor down the road.
|
||||||
|
|
||||||
|
Creating new drivers is a relatively easy task, but integrating them into existing systems is both error prone and time consuming since sensors rarely use the exact same units of measurement.
|
||||||
|
|
||||||
|
By reducing all data to a single **sensors\_event\_t** 'type' and settling on specific, **standardised SI units** for each sensor family the same sensor types return values that are comparable with any other similar sensor. This enables you to switch sensor models with very little impact on the rest of the system, which can help mitigate some of the risks and problems of sensor availability and code reuse.
|
||||||
|
|
||||||
|
The unified sensor abstraction layer is also useful for data-logging and data-transmission since you only have one well-known type to log or transmit over the air or wire.
|
||||||
|
|
||||||
|
## Unified Sensor Drivers ##
|
||||||
|
|
||||||
|
The following drivers are based on the Adafruit Unified Sensor Driver:
|
||||||
|
|
||||||
|
**Accelerometers**
|
||||||
|
- [Adafruit\_ADXL345](https://github.com/adafruit/Adafruit_ADXL345)
|
||||||
|
- [Adafruit\_LSM303DLHC](https://github.com/adafruit/Adafruit_LSM303DLHC)
|
||||||
|
- [Adafruit\_MMA8451\_Library](https://github.com/adafruit/Adafruit_MMA8451_Library)
|
||||||
|
|
||||||
|
**Gyroscope**
|
||||||
|
- [Adafruit\_L3GD20\_U](https://github.com/adafruit/Adafruit_L3GD20_U)
|
||||||
|
|
||||||
|
**Light**
|
||||||
|
- [Adafruit\_TSL2561](https://github.com/adafruit/Adafruit_TSL2561)
|
||||||
|
- [Adafruit\_TSL2591\_Library](https://github.com/adafruit/Adafruit_TSL2591_Library)
|
||||||
|
|
||||||
|
**Magnetometers**
|
||||||
|
- [Adafruit\_LSM303DLHC](https://github.com/adafruit/Adafruit_LSM303DLHC)
|
||||||
|
- [Adafruit\_HMC5883\_Unified](https://github.com/adafruit/Adafruit_HMC5883_Unified)
|
||||||
|
|
||||||
|
**Barometric Pressure**
|
||||||
|
- [Adafruit\_BMP085\_Unified](https://github.com/adafruit/Adafruit_BMP085_Unified)
|
||||||
|
- [Adafruit\_BMP183\_Unified\_Library](https://github.com/adafruit/Adafruit_BMP183_Unified_Library)
|
||||||
|
|
||||||
|
**Humidity & Temperature**
|
||||||
|
- [DHT-sensor-library](https://github.com/adafruit/DHT-sensor-library)
|
||||||
|
|
||||||
|
**Humidity, Temperature, & Barometric Pressure**
|
||||||
|
- [Adafruit_BME280_Library](https://github.com/adafruit/Adafruit_BME280_Library/)
|
||||||
|
|
||||||
|
**Orientation**
|
||||||
|
- [Adafruit_BNO055](https://github.com/adafruit/Adafruit_BNO055)
|
||||||
|
|
||||||
|
**All in one device**
|
||||||
|
- [Adafruit_LSM9DS0](https://github.com/adafruit/Adafruit_LSM9DS0_Library) (accelerometer, gyroscope, magnetometer)
|
||||||
|
- [Adafruit_LSM9DS1](https://github.com/adafruit/Adafruit_LSM9DS1/) (accelerometer, gyroscope, magnetometer)
|
||||||
|
|
||||||
|
|
||||||
|
## How Does it Work? ##
|
||||||
|
|
||||||
|
Any driver that supports the Adafruit unified sensor abstraction layer will implement the Adafruit\_Sensor base class. There are two main typedefs and one enum defined in Adafruit_Sensor.h that are used to 'abstract' away the sensor details and values:
|
||||||
|
|
||||||
|
**Sensor Types (sensors\_type\_t)**
|
||||||
|
|
||||||
|
These pre-defined sensor types are used to properly handle the two related typedefs below, and allows us determine what types of units the sensor uses, etc.
|
||||||
|
|
||||||
|
```
|
||||||
|
/** Sensor types */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SENSOR_TYPE_ACCELEROMETER = (1),
|
||||||
|
SENSOR_TYPE_MAGNETIC_FIELD = (2),
|
||||||
|
SENSOR_TYPE_ORIENTATION = (3),
|
||||||
|
SENSOR_TYPE_GYROSCOPE = (4),
|
||||||
|
SENSOR_TYPE_LIGHT = (5),
|
||||||
|
SENSOR_TYPE_PRESSURE = (6),
|
||||||
|
SENSOR_TYPE_PROXIMITY = (8),
|
||||||
|
SENSOR_TYPE_GRAVITY = (9),
|
||||||
|
SENSOR_TYPE_LINEAR_ACCELERATION = (10),
|
||||||
|
SENSOR_TYPE_ROTATION_VECTOR = (11),
|
||||||
|
SENSOR_TYPE_RELATIVE_HUMIDITY = (12),
|
||||||
|
SENSOR_TYPE_AMBIENT_TEMPERATURE = (13),
|
||||||
|
SENSOR_TYPE_VOLTAGE = (15),
|
||||||
|
SENSOR_TYPE_CURRENT = (16),
|
||||||
|
SENSOR_TYPE_COLOR = (17)
|
||||||
|
} sensors_type_t;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Sensor Details (sensor\_t)**
|
||||||
|
|
||||||
|
This typedef describes the specific capabilities of this sensor, and allows us to know what sensor we are using beneath the abstraction layer.
|
||||||
|
|
||||||
|
```
|
||||||
|
/* Sensor details (40 bytes) */
|
||||||
|
/** struct sensor_s is used to describe basic information about a specific sensor. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[12];
|
||||||
|
int32_t version;
|
||||||
|
int32_t sensor_id;
|
||||||
|
int32_t type;
|
||||||
|
float max_value;
|
||||||
|
float min_value;
|
||||||
|
float resolution;
|
||||||
|
int32_t min_delay;
|
||||||
|
} sensor_t;
|
||||||
|
```
|
||||||
|
|
||||||
|
The individual fields are intended to be used as follows:
|
||||||
|
|
||||||
|
- **name**: The sensor name or ID, up to a maximum of twelve characters (ex. "MPL115A2")
|
||||||
|
- **version**: The version of the sensor HW and the driver to allow us to differentiate versions of the board or driver
|
||||||
|
- **sensor\_id**: A unique sensor identifier that is used to differentiate this specific sensor instance from any others that are present on the system or in the sensor network
|
||||||
|
- **type**: The sensor type, based on **sensors\_type\_t** in sensors.h
|
||||||
|
- **max\_value**: The maximum value that this sensor can return (in the appropriate SI unit)
|
||||||
|
- **min\_value**: The minimum value that this sensor can return (in the appropriate SI unit)
|
||||||
|
- **resolution**: The smallest difference between two values that this sensor can report (in the appropriate SI unit)
|
||||||
|
- **min\_delay**: The minimum delay in microseconds between two sensor events, or '0' if there is no constant sensor rate
|
||||||
|
|
||||||
|
**Sensor Data/Events (sensors\_event\_t)**
|
||||||
|
|
||||||
|
This typedef is used to return sensor data from any sensor supported by the abstraction layer, using standard SI units and scales.
|
||||||
|
|
||||||
|
```
|
||||||
|
/* Sensor event (36 bytes) */
|
||||||
|
/** struct sensor_event_s is used to provide a single sensor event in a common format. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int32_t version;
|
||||||
|
int32_t sensor_id;
|
||||||
|
int32_t type;
|
||||||
|
int32_t reserved0;
|
||||||
|
int32_t timestamp;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
float data[4];
|
||||||
|
sensors_vec_t acceleration;
|
||||||
|
sensors_vec_t magnetic;
|
||||||
|
sensors_vec_t orientation;
|
||||||
|
sensors_vec_t gyro;
|
||||||
|
float temperature;
|
||||||
|
float distance;
|
||||||
|
float light;
|
||||||
|
float pressure;
|
||||||
|
float relative_humidity;
|
||||||
|
float current;
|
||||||
|
float voltage;
|
||||||
|
sensors_color_t color;
|
||||||
|
};
|
||||||
|
} sensors_event_t;
|
||||||
|
```
|
||||||
|
It includes the following fields:
|
||||||
|
|
||||||
|
- **version**: Contain 'sizeof(sensors\_event\_t)' to identify which version of the API we're using in case this changes in the future
|
||||||
|
- **sensor\_id**: A unique sensor identifier that is used to differentiate this specific sensor instance from any others that are present on the system or in the sensor network (must match the sensor\_id value in the corresponding sensor\_t enum above!)
|
||||||
|
- **type**: the sensor type, based on **sensors\_type\_t** in sensors.h
|
||||||
|
- **timestamp**: time in milliseconds when the sensor value was read
|
||||||
|
- **data[4]**: An array of four 32-bit values that allows us to encapsulate any type of sensor data via a simple union (further described below)
|
||||||
|
|
||||||
|
**Required Functions**
|
||||||
|
|
||||||
|
In addition to the two standard types and the sensor type enum, all drivers based on Adafruit_Sensor must also implement the following two functions:
|
||||||
|
|
||||||
|
```
|
||||||
|
bool getEvent(sensors_event_t*);
|
||||||
|
```
|
||||||
|
Calling this function will populate the supplied sensors\_event\_t reference with the latest available sensor data. You should call this function as often as you want to update your data.
|
||||||
|
|
||||||
|
```
|
||||||
|
void getSensor(sensor_t*);
|
||||||
|
```
|
||||||
|
Calling this function will provide some basic information about the sensor (the sensor name, driver version, min and max values, etc.
|
||||||
|
|
||||||
|
**Standardised SI values for sensors\_event\_t**
|
||||||
|
|
||||||
|
A key part of the abstraction layer is the standardisation of values on SI units of a particular scale, which is accomplished via the data[4] union in sensors\_event\_t above. This 16 byte union includes fields for each main sensor type, and uses the following SI units and scales:
|
||||||
|
|
||||||
|
- **acceleration**: values are in **meter per second per second** (m/s^2)
|
||||||
|
- **magnetic**: values are in **micro-Tesla** (uT)
|
||||||
|
- **orientation**: values are in **degrees**
|
||||||
|
- **gyro**: values are in **rad/s**
|
||||||
|
- **temperature**: values in **degrees centigrade** (Celsius)
|
||||||
|
- **distance**: values are in **centimeters**
|
||||||
|
- **light**: values are in **SI lux** units
|
||||||
|
- **pressure**: values are in **hectopascal** (hPa)
|
||||||
|
- **relative\_humidity**: values are in **percent**
|
||||||
|
- **current**: values are in **milliamps** (mA)
|
||||||
|
- **voltage**: values are in **volts** (V)
|
||||||
|
- **color**: values are in 0..1.0 RGB channel luminosity and 32-bit RGBA format
|
||||||
|
|
||||||
|
## The Unified Driver Abstraction Layer in Practice ##
|
||||||
|
|
||||||
|
Using the unified sensor abstraction layer is relatively easy once a compliant driver has been created.
|
||||||
|
|
||||||
|
Every compliant sensor can now be read using a single, well-known 'type' (sensors\_event\_t), and there is a standardised way of interrogating a sensor about its specific capabilities (via sensor\_t).
|
||||||
|
|
||||||
|
An example of reading the [TSL2561](https://github.com/adafruit/Adafruit_TSL2561) light sensor can be seen below:
|
||||||
|
|
||||||
|
```
|
||||||
|
Adafruit_TSL2561 tsl = Adafruit_TSL2561(TSL2561_ADDR_FLOAT, 12345);
|
||||||
|
...
|
||||||
|
/* Get a new sensor event */
|
||||||
|
sensors_event_t event;
|
||||||
|
tsl.getEvent(&event);
|
||||||
|
|
||||||
|
/* Display the results (light is measured in lux) */
|
||||||
|
if (event.light)
|
||||||
|
{
|
||||||
|
Serial.print(event.light); Serial.println(" lux");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* If event.light = 0 lux the sensor is probably saturated
|
||||||
|
and no reliable data could be generated! */
|
||||||
|
Serial.println("Sensor overload");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Similarly, we can get the basic technical capabilities of this sensor with the following code:
|
||||||
|
|
||||||
|
```
|
||||||
|
sensor_t sensor;
|
||||||
|
|
||||||
|
sensor_t sensor;
|
||||||
|
tsl.getSensor(&sensor);
|
||||||
|
|
||||||
|
/* Display the sensor details */
|
||||||
|
Serial.println("------------------------------------");
|
||||||
|
Serial.print ("Sensor: "); Serial.println(sensor.name);
|
||||||
|
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
|
||||||
|
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
|
||||||
|
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" lux");
|
||||||
|
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" lux");
|
||||||
|
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" lux");
|
||||||
|
Serial.println("------------------------------------");
|
||||||
|
Serial.println("");
|
||||||
|
```
|
10
firmware/libraries/Adafruit_Unified_Sensor/library.properties
Executable file
10
firmware/libraries/Adafruit_Unified_Sensor/library.properties
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
name=Adafruit Unified Sensor
|
||||||
|
version=1.0.3
|
||||||
|
author=Adafruit <info@adafruit.com>
|
||||||
|
maintainer=Adafruit <info@adafruit.com>
|
||||||
|
sentence=Required for all Adafruit Unified Sensor based libraries.
|
||||||
|
paragraph=A unified sensor abstraction layer used by many Adafruit sensor libraries.
|
||||||
|
category=Sensors
|
||||||
|
url=https://github.com/adafruit/Adafruit_Sensor
|
||||||
|
architectures=*
|
||||||
|
includes=Adafruit_Sensor.h
|
176
firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.cpp
Executable file
176
firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.cpp
Executable file
|
@ -0,0 +1,176 @@
|
||||||
|
#include "Arduino.h"
|
||||||
|
#include "ESP8266Influxdb.h"
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
|
||||||
|
#define DEBUG_PRINT // comment this line to disable debug print
|
||||||
|
|
||||||
|
#ifndef DEBUG_PRINT
|
||||||
|
#define DEBUG_PRINT(a)
|
||||||
|
#else
|
||||||
|
#define DEBUG_PRINT(a) (Serial.println(String(F("[Debug]: "))+(a)))
|
||||||
|
#define _DEBUG
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Influxdb::Influxdb(const char *host, uint16_t port) : WiFiClient() {
|
||||||
|
_port = port;
|
||||||
|
_host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
DB_RESPONSE Influxdb::opendb(String db, String user, String password) {
|
||||||
|
_db = "db=" + db + "&u=" + user + "&p=" + password;
|
||||||
|
}
|
||||||
|
|
||||||
|
DB_RESPONSE Influxdb::opendb(String db) {
|
||||||
|
_db = "db=" + db;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
DB_RESPONSE Influxdb::write(FIELD data) {
|
||||||
|
return write(data.postString());
|
||||||
|
}
|
||||||
|
|
||||||
|
DB_RESPONSE Influxdb::write(String data) {
|
||||||
|
if (!connect(_host, _port)) {
|
||||||
|
DEBUG_PRINT("connection failed");
|
||||||
|
_response = DB_CONNECT_FAILED;
|
||||||
|
return _response;
|
||||||
|
}
|
||||||
|
String postHead = "POST /write?" + _db + " HTTP/1.1\r\n";
|
||||||
|
postHead += "Host: " + String(_host) + ":" + String(_port) + "\r\n";
|
||||||
|
// postHead += "Content-Type: application/x-www-form-urlencoded\r\n";
|
||||||
|
postHead += "Content-Length: " + String(data.length()) + "\r\n\r\n";
|
||||||
|
|
||||||
|
DEBUG_PRINT("Writing data to " + String(_host) + ":" + String(_port));
|
||||||
|
print(postHead + data);
|
||||||
|
DEBUG_PRINT(postHead + data);
|
||||||
|
|
||||||
|
uint8_t t = 0;
|
||||||
|
// Check the reply whether writing is success or not
|
||||||
|
while (!available() && t < 200) {
|
||||||
|
delay(10);
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
if (t==200) {_response = DB_ERROR; return DB_ERROR; } // Return error if time out.
|
||||||
|
|
||||||
|
#if !defined _DEBUG
|
||||||
|
if (available()) {
|
||||||
|
_response = (findUntil("204", "\r")) ? DB_SUCCESS : DB_ERROR;
|
||||||
|
return _response;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
_response=DB_ERROR;
|
||||||
|
while (available()) {
|
||||||
|
String line = readStringUntil('\n');
|
||||||
|
if (line.substring(9,12)=="204")
|
||||||
|
_response = DB_SUCCESS;
|
||||||
|
DEBUG_PRINT("(Responsed): " + line);
|
||||||
|
}
|
||||||
|
return _response;
|
||||||
|
#endif
|
||||||
|
return DB_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
DB_RESPONSE Influxdb::query(String sql) {
|
||||||
|
|
||||||
|
if (!connect(_host, _port)) {
|
||||||
|
DEBUG_PRINT("connection failed");
|
||||||
|
_response = DB_CONNECT_FAILED;
|
||||||
|
return _response;
|
||||||
|
}
|
||||||
|
|
||||||
|
String url = "/query?";
|
||||||
|
#if defined _DEBUG
|
||||||
|
url += "pretty=true&";
|
||||||
|
#endif
|
||||||
|
url += _db;
|
||||||
|
url += "&q=" + URLEncode(sql);
|
||||||
|
DEBUG_PRINT("Requesting URL: ");
|
||||||
|
DEBUG_PRINT(url);
|
||||||
|
|
||||||
|
// This will send the request to the server
|
||||||
|
print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + _host +
|
||||||
|
":" + _port + "\r\n" + "Connection: close\r\n\r\n");
|
||||||
|
|
||||||
|
// Read all the lines of the reply from server and print them to Serial
|
||||||
|
uint8_t t = 0;
|
||||||
|
while (!available() && t < 200) {
|
||||||
|
delay(10);
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
if (t==200) {_response = DB_ERROR; return DB_ERROR; } // Return error if time out.
|
||||||
|
|
||||||
|
DEBUG_PRINT("Receiving....");
|
||||||
|
uint8_t i=0;
|
||||||
|
String line = readStringUntil('\n');
|
||||||
|
DEBUG_PRINT("[HEAD] " + line);
|
||||||
|
|
||||||
|
if (line.substring(9,12) == "200") {
|
||||||
|
while (available()) {
|
||||||
|
line = readStringUntil('\n');
|
||||||
|
DEBUG_PRINT("(HEAD) " + line);
|
||||||
|
if (i < 6 ) i++; else return _response;
|
||||||
|
}
|
||||||
|
_response = DB_SUCCESS;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
_response = DB_ERROR;
|
||||||
|
#if defined _DEBUG
|
||||||
|
while (available()) {
|
||||||
|
line = readStringUntil('\n');
|
||||||
|
DEBUG_PRINT("[HEAD] " + line);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return _response;
|
||||||
|
}
|
||||||
|
|
||||||
|
DB_RESPONSE Influxdb::response() {
|
||||||
|
return _response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------*/
|
||||||
|
// Field object
|
||||||
|
/* -----------------------------------------------*/
|
||||||
|
FIELD::FIELD(String m) {
|
||||||
|
measurement = m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIELD::empty() {
|
||||||
|
_data = "";
|
||||||
|
_tag = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIELD::addTag(String key, String value) {
|
||||||
|
_tag += "," + key + "=" + value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIELD::addField(String key, float value) {
|
||||||
|
_data = (_data == "") ? (" ") : (_data += ",");
|
||||||
|
_data += key + "=" + String(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
String FIELD::postString() {
|
||||||
|
// uint32_t utc = 1448114561 + millis() /1000;
|
||||||
|
return measurement + _tag + _data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// URL Encode with Arduino String object
|
||||||
|
String URLEncode(String msg) {
|
||||||
|
const char *hex = "0123456789abcdef";
|
||||||
|
String encodedMsg = "";
|
||||||
|
|
||||||
|
uint16_t i;
|
||||||
|
for (i = 0; i < msg.length(); i++) {
|
||||||
|
if (('a' <= msg.charAt(i) && msg.charAt(i) <= 'z') ||
|
||||||
|
('A' <= msg.charAt(i) && msg.charAt(i) <= 'Z') ||
|
||||||
|
('0' <= msg.charAt(i) && msg.charAt(i) <= '9')) {
|
||||||
|
encodedMsg += msg.charAt(i);
|
||||||
|
} else {
|
||||||
|
encodedMsg += '%';
|
||||||
|
encodedMsg += hex[msg.charAt(i) >> 4];
|
||||||
|
encodedMsg += hex[msg.charAt(i) & 15];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return encodedMsg;
|
||||||
|
}
|
72
firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.h
Executable file
72
firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.h
Executable file
|
@ -0,0 +1,72 @@
|
||||||
|
/* Influxdb library
|
||||||
|
|
||||||
|
MIT license
|
||||||
|
Written by HW Wong
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INFLUXDB_H
|
||||||
|
#define INFLUXDB_H
|
||||||
|
#include "Arduino.h"
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
|
||||||
|
enum DB_RESPONSE {DB_SUCCESS, DB_ERROR, DB_CONNECT_FAILED};
|
||||||
|
|
||||||
|
// Url encode function
|
||||||
|
String URLEncode(String msg);
|
||||||
|
|
||||||
|
class FIELD
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FIELD(String m);
|
||||||
|
|
||||||
|
String measurement;
|
||||||
|
|
||||||
|
void addField(String key, float value);
|
||||||
|
void addTag(String key, String value);
|
||||||
|
void empty();
|
||||||
|
String postString();
|
||||||
|
|
||||||
|
private:
|
||||||
|
String _data;
|
||||||
|
String _tag;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class Influxdb : private WiFiClient
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Influxdb(const char* host, uint16_t port);
|
||||||
|
|
||||||
|
DB_RESPONSE opendb(String db);
|
||||||
|
DB_RESPONSE opendb(String db, String user, String password);
|
||||||
|
DB_RESPONSE write(FIELD data);
|
||||||
|
DB_RESPONSE write(String data);
|
||||||
|
DB_RESPONSE query(String sql);
|
||||||
|
//uint8_t createDatabase(char *dbname);
|
||||||
|
DB_RESPONSE response();
|
||||||
|
|
||||||
|
using WiFiClient::available;
|
||||||
|
using WiFiClient::read;
|
||||||
|
using WiFiClient::flush;
|
||||||
|
using WiFiClient::find;
|
||||||
|
using WiFiClient::findUntil;
|
||||||
|
using WiFiClient::peek;
|
||||||
|
using WiFiClient::readBytes;
|
||||||
|
using WiFiClient::readBytesUntil;
|
||||||
|
using WiFiClient::readString;
|
||||||
|
using WiFiClient::readStringUntil;
|
||||||
|
using WiFiClient::parseInt;
|
||||||
|
using WiFiClient::setTimeout;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint16_t _port;
|
||||||
|
const char* _host;
|
||||||
|
String _db;
|
||||||
|
DB_RESPONSE _response;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
1
firmware/libraries/ESP8266Influxdb/README.md
Executable file
1
firmware/libraries/ESP8266Influxdb/README.md
Executable file
|
@ -0,0 +1 @@
|
||||||
|
# ESP8266Influxdb
|
|
@ -0,0 +1,63 @@
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <ESP8266WiFiMulti.h>
|
||||||
|
#include <ESP8266Influxdb.h>
|
||||||
|
|
||||||
|
const char *INFLUXDB_HOST = "host_or_ip";
|
||||||
|
const uint16_t INFLUXDB_PORT = 8086;
|
||||||
|
|
||||||
|
const char *DATABASE = "dbname";
|
||||||
|
const char *DB_USER = "dbuser";
|
||||||
|
const char *DB_PASSWORD = "dbpassword";
|
||||||
|
|
||||||
|
ESP8266WiFiMulti WiFiMulti;
|
||||||
|
Influxdb influxdb(INFLUXDB_HOST, INFLUXDB_PORT);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
WiFiMulti.addAP("SSID", "PASSWORD");
|
||||||
|
while (WiFiMulti.run() != WL_CONNECTED) {
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
Serial.println("Ready");
|
||||||
|
influxdb.opendb(DATABASE, DB_USER, DB_PASSWORD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Writing data with influxdb HTTP API
|
||||||
|
// https://influxdb.com/docs/v0.9/guides/writing_data.html
|
||||||
|
Serial.println("Writing data to host " + String(INFLUXDB_HOST) + ":" +
|
||||||
|
INFLUXDB_PORT + "'s database=" + DATABASE);
|
||||||
|
String data = "analog_read,method=HTTP_API,pin=A0 value=" + String(analogRead(A0));
|
||||||
|
influxdb.write(data);
|
||||||
|
Serial.println(influxdb.response() == DB_SUCCESS ? "HTTP write success"
|
||||||
|
: "Writing failed");
|
||||||
|
|
||||||
|
// Writing data using FIELD object
|
||||||
|
// Create field object with measurment name=analog_read
|
||||||
|
FIELD dataObj("analog_read");
|
||||||
|
dataObj.addTag("method", "Field_object"); // Add method tag
|
||||||
|
dataObj.addTag("pin", "A0"); // Add pin tag
|
||||||
|
dataObj.addField("value", analogRead(A0)); // Add value field
|
||||||
|
Serial.println(influxdb.write(dataObj) == DB_SUCCESS ? "Object write success"
|
||||||
|
: "Writing failed");
|
||||||
|
|
||||||
|
// Empty field object.
|
||||||
|
dataObj.empty();
|
||||||
|
|
||||||
|
// Querying Data
|
||||||
|
// https://influxdb.com/docs/v0.9/query_language/query_syntax.html
|
||||||
|
Serial.println("Querying data ........");
|
||||||
|
|
||||||
|
String sql = "select * from analog_read order by time desc limit 2";
|
||||||
|
if (influxdb.query(sql) == DB_SUCCESS) {
|
||||||
|
while (influxdb.available()) {
|
||||||
|
String line = influxdb.readStringUntil('\n');
|
||||||
|
Serial.println(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Serial.println("Query Failed");
|
||||||
|
delay(30000);
|
||||||
|
}
|
24
firmware/libraries/ESP8266Influxdb/keywords.txt
Executable file
24
firmware/libraries/ESP8266Influxdb/keywords.txt
Executable file
|
@ -0,0 +1,24 @@
|
||||||
|
##################################################
|
||||||
|
# Syntax Coloring Map For ESP8266 Influxdb library
|
||||||
|
##################################################
|
||||||
|
|
||||||
|
##################################################
|
||||||
|
# Datatypes (KEYWORD1)
|
||||||
|
##################################################
|
||||||
|
|
||||||
|
Influxdb KEYWORD1
|
||||||
|
FIELD KEYWORD1
|
||||||
|
DB_RESPOND KEYWORD1
|
||||||
|
|
||||||
|
##################################################
|
||||||
|
# Methods and Functions (KEYWORD2)
|
||||||
|
##################################################
|
||||||
|
|
||||||
|
addField KEYWORD2
|
||||||
|
addTag KEYWORD2
|
||||||
|
empty KEYWORD2
|
||||||
|
opendb KEYWORD2
|
||||||
|
write KEYWORD2
|
||||||
|
query KEYWORD2
|
||||||
|
postString KEYWORD2
|
||||||
|
response KEYWORD2
|
27
firmware/libraries/WiFi/README.adoc
Executable file
27
firmware/libraries/WiFi/README.adoc
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
= WiFi Library for Arduino =
|
||||||
|
|
||||||
|
With the Arduino WiFi Shield, this library allows an Arduino board to connect to the internet.
|
||||||
|
|
||||||
|
For more information about this library please visit us at
|
||||||
|
http://www.arduino.cc/en/Reference/WiFi
|
||||||
|
|
||||||
|
== License ==
|
||||||
|
|
||||||
|
Copyright (c) 2011-2014 Arduino LLC. All right reserved.
|
||||||
|
Copyright (C) 2006-2008, Atmel Corporation All rights reserved.
|
||||||
|
Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
Copyright (c) 2009-2010, H&D Wireless AB All rights reserved.
|
||||||
|
|
||||||
|
This library 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 library 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 library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
127
firmware/libraries/WiFi/examples/ConnectNoEncryption/ConnectNoEncryption.ino
Executable file
127
firmware/libraries/WiFi/examples/ConnectNoEncryption/ConnectNoEncryption.ino
Executable file
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
This example connects to an unencrypted Wifi network.
|
||||||
|
Then it prints the MAC address of the Wifi shield,
|
||||||
|
the IP address obtained, and other network details.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached
|
||||||
|
|
||||||
|
created 13 July 2010
|
||||||
|
by dlf (Metodo2 srl)
|
||||||
|
modified 31 May 2012
|
||||||
|
by Tom Igoe
|
||||||
|
*/
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
char ssid[] = "yourNetwork"; // the name of your network
|
||||||
|
int status = WL_IDLE_STATUS; // the Wifi radio's status
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//Initialize serial and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to open SSID: ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
status = WiFi.begin(ssid);
|
||||||
|
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// you're connected now, so print out the data:
|
||||||
|
Serial.print("You're connected to the network");
|
||||||
|
printCurrentNet();
|
||||||
|
printWifiData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// check the network connection once every 10 seconds:
|
||||||
|
delay(10000);
|
||||||
|
printCurrentNet();
|
||||||
|
}
|
||||||
|
|
||||||
|
void printWifiData() {
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print your MAC address:
|
||||||
|
byte mac[6];
|
||||||
|
WiFi.macAddress(mac);
|
||||||
|
Serial.print("MAC address: ");
|
||||||
|
Serial.print(mac[5], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[4], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[3], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[2], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[1], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.println(mac[0], HEX);
|
||||||
|
|
||||||
|
// print your subnet mask:
|
||||||
|
IPAddress subnet = WiFi.subnetMask();
|
||||||
|
Serial.print("NetMask: ");
|
||||||
|
Serial.println(subnet);
|
||||||
|
|
||||||
|
// print your gateway address:
|
||||||
|
IPAddress gateway = WiFi.gatewayIP();
|
||||||
|
Serial.print("Gateway: ");
|
||||||
|
Serial.println(gateway);
|
||||||
|
}
|
||||||
|
|
||||||
|
void printCurrentNet() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print the MAC address of the router you're attached to:
|
||||||
|
byte bssid[6];
|
||||||
|
WiFi.BSSID(bssid);
|
||||||
|
Serial.print("BSSID: ");
|
||||||
|
Serial.print(bssid[5], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[4], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[3], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[2], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[1], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.println(bssid[0], HEX);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.println(rssi);
|
||||||
|
|
||||||
|
// print the encryption type:
|
||||||
|
byte encryption = WiFi.encryptionType();
|
||||||
|
Serial.print("Encryption Type:");
|
||||||
|
Serial.println(encryption, HEX);
|
||||||
|
}
|
||||||
|
|
132
firmware/libraries/WiFi/examples/ConnectWithWEP/ConnectWithWEP.ino
Executable file
132
firmware/libraries/WiFi/examples/ConnectWithWEP/ConnectWithWEP.ino
Executable file
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
This example connects to a WEP-encrypted Wifi network.
|
||||||
|
Then it prints the MAC address of the Wifi shield,
|
||||||
|
the IP address obtained, and other network details.
|
||||||
|
|
||||||
|
If you use 40-bit WEP, you need a key that is 10 characters long,
|
||||||
|
and the characters must be hexadecimal (0-9 or A-F).
|
||||||
|
e.g. for 40-bit, ABBADEAF01 will work, but ABBADEAF won't work
|
||||||
|
(too short) and ABBAISDEAF won't work (I and S are not
|
||||||
|
hexadecimal characters).
|
||||||
|
|
||||||
|
For 128-bit, you need a string that is 26 characters long.
|
||||||
|
D0D0DEADF00DABBADEAFBEADED will work because it's 26 characters,
|
||||||
|
all in the 0-9, A-F range.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached
|
||||||
|
|
||||||
|
created 13 July 2010
|
||||||
|
by dlf (Metodo2 srl)
|
||||||
|
modified 31 May 2012
|
||||||
|
by Tom Igoe
|
||||||
|
*/
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
char ssid[] = "yourNetwork"; // your network SSID (name)
|
||||||
|
char key[] = "D0D0DEADF00DABBADEAFBEADED"; // your network key
|
||||||
|
int keyIndex = 0; // your network key Index number
|
||||||
|
int status = WL_IDLE_STATUS; // the Wifi radio's status
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//Initialize serial and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to WEP network, SSID: ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
status = WiFi.begin(ssid, keyIndex, key);
|
||||||
|
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// once you are connected :
|
||||||
|
Serial.print("You're connected to the network");
|
||||||
|
printCurrentNet();
|
||||||
|
printWifiData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// check the network connection once every 10 seconds:
|
||||||
|
delay(10000);
|
||||||
|
printCurrentNet();
|
||||||
|
}
|
||||||
|
|
||||||
|
void printWifiData() {
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print your MAC address:
|
||||||
|
byte mac[6];
|
||||||
|
WiFi.macAddress(mac);
|
||||||
|
Serial.print("MAC address: ");
|
||||||
|
Serial.print(mac[5], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[4], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[3], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[2], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[1], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.println(mac[0], HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void printCurrentNet() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print the MAC address of the router you're attached to:
|
||||||
|
byte bssid[6];
|
||||||
|
WiFi.BSSID(bssid);
|
||||||
|
Serial.print("BSSID: ");
|
||||||
|
Serial.print(bssid[5], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[4], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[3], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[2], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[1], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.println(bssid[0], HEX);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.println(rssi);
|
||||||
|
|
||||||
|
// print the encryption type:
|
||||||
|
byte encryption = WiFi.encryptionType();
|
||||||
|
Serial.print("Encryption Type:");
|
||||||
|
Serial.println(encryption, HEX);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
122
firmware/libraries/WiFi/examples/ConnectWithWPA/ConnectWithWPA.ino
Executable file
122
firmware/libraries/WiFi/examples/ConnectWithWPA/ConnectWithWPA.ino
Executable file
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
This example connects to an unencrypted Wifi network.
|
||||||
|
Then it prints the MAC address of the Wifi shield,
|
||||||
|
the IP address obtained, and other network details.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached
|
||||||
|
|
||||||
|
created 13 July 2010
|
||||||
|
by dlf (Metodo2 srl)
|
||||||
|
modified 31 May 2012
|
||||||
|
by Tom Igoe
|
||||||
|
*/
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
char ssid[] = "yourNetwork"; // your network SSID (name)
|
||||||
|
char pass[] = "secretPassword"; // your network password
|
||||||
|
int status = WL_IDLE_STATUS; // the Wifi radio's status
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//Initialize serial and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to WPA SSID: ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
// Connect to WPA/WPA2 network:
|
||||||
|
status = WiFi.begin(ssid, pass);
|
||||||
|
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// you're connected now, so print out the data:
|
||||||
|
Serial.print("You're connected to the network");
|
||||||
|
printCurrentNet();
|
||||||
|
printWifiData();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// check the network connection once every 10 seconds:
|
||||||
|
delay(10000);
|
||||||
|
printCurrentNet();
|
||||||
|
}
|
||||||
|
|
||||||
|
void printWifiData() {
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print your MAC address:
|
||||||
|
byte mac[6];
|
||||||
|
WiFi.macAddress(mac);
|
||||||
|
Serial.print("MAC address: ");
|
||||||
|
Serial.print(mac[5], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[4], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[3], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[2], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[1], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.println(mac[0], HEX);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void printCurrentNet() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print the MAC address of the router you're attached to:
|
||||||
|
byte bssid[6];
|
||||||
|
WiFi.BSSID(bssid);
|
||||||
|
Serial.print("BSSID: ");
|
||||||
|
Serial.print(bssid[5], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[4], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[3], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[2], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(bssid[1], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.println(bssid[0], HEX);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.println(rssi);
|
||||||
|
|
||||||
|
// print the encryption type:
|
||||||
|
byte encryption = WiFi.encryptionType();
|
||||||
|
Serial.print("Encryption Type:");
|
||||||
|
Serial.println(encryption, HEX);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
119
firmware/libraries/WiFi/examples/ScanNetworks/ScanNetworks.ino
Executable file
119
firmware/libraries/WiFi/examples/ScanNetworks/ScanNetworks.ino
Executable file
|
@ -0,0 +1,119 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
This example prints the Wifi shield's MAC address, and
|
||||||
|
scans for available Wifi networks using the Wifi shield.
|
||||||
|
Every ten seconds, it scans again. It doesn't actually
|
||||||
|
connect to any network, so no encryption scheme is specified.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached
|
||||||
|
|
||||||
|
created 13 July 2010
|
||||||
|
by dlf (Metodo2 srl)
|
||||||
|
modified 21 Junn 2012
|
||||||
|
by Tom Igoe and Jaymes Dec
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//Initialize serial and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print WiFi MAC address:
|
||||||
|
printMacAddress();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// scan for existing networks:
|
||||||
|
Serial.println("Scanning available networks...");
|
||||||
|
listNetworks();
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void printMacAddress() {
|
||||||
|
// the MAC address of your Wifi shield
|
||||||
|
byte mac[6];
|
||||||
|
|
||||||
|
// print your MAC address:
|
||||||
|
WiFi.macAddress(mac);
|
||||||
|
Serial.print("MAC: ");
|
||||||
|
Serial.print(mac[5], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[4], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[3], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[2], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(mac[1], HEX);
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.println(mac[0], HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void listNetworks() {
|
||||||
|
// scan for nearby networks:
|
||||||
|
Serial.println("** Scan Networks **");
|
||||||
|
int numSsid = WiFi.scanNetworks();
|
||||||
|
if (numSsid == -1) {
|
||||||
|
Serial.println("Couldn't get a wifi connection");
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// print the list of networks seen:
|
||||||
|
Serial.print("number of available networks:");
|
||||||
|
Serial.println(numSsid);
|
||||||
|
|
||||||
|
// print the network number and name for each network found:
|
||||||
|
for (int thisNet = 0; thisNet < numSsid; thisNet++) {
|
||||||
|
Serial.print(thisNet);
|
||||||
|
Serial.print(") ");
|
||||||
|
Serial.print(WiFi.SSID(thisNet));
|
||||||
|
Serial.print("\tSignal: ");
|
||||||
|
Serial.print(WiFi.RSSI(thisNet));
|
||||||
|
Serial.print(" dBm");
|
||||||
|
Serial.print("\tEncryption: ");
|
||||||
|
printEncryptionType(WiFi.encryptionType(thisNet));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printEncryptionType(int thisType) {
|
||||||
|
// read the encryption type and print out the name:
|
||||||
|
switch (thisType) {
|
||||||
|
case ENC_TYPE_WEP:
|
||||||
|
Serial.println("WEP");
|
||||||
|
break;
|
||||||
|
case ENC_TYPE_TKIP:
|
||||||
|
Serial.println("WPA");
|
||||||
|
break;
|
||||||
|
case ENC_TYPE_CCMP:
|
||||||
|
Serial.println("WPA2");
|
||||||
|
break;
|
||||||
|
case ENC_TYPE_NONE:
|
||||||
|
Serial.println("None");
|
||||||
|
break;
|
||||||
|
case ENC_TYPE_AUTO:
|
||||||
|
Serial.println("Auto");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
132
firmware/libraries/WiFi/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino
Executable file
132
firmware/libraries/WiFi/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino
Executable file
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
WiFi Web Server LED Blink
|
||||||
|
|
||||||
|
A simple web server that lets you blink an LED via the web.
|
||||||
|
This sketch will print the IP address of your WiFi Shield (once connected)
|
||||||
|
to the Serial monitor. From there, you can open that address in a web browser
|
||||||
|
to turn on and off the LED on pin 9.
|
||||||
|
|
||||||
|
If the IP address of your shield is yourAddress:
|
||||||
|
http://yourAddress/H turns the LED on
|
||||||
|
http://yourAddress/L turns it off
|
||||||
|
|
||||||
|
This example is written for a network using WPA encryption. For
|
||||||
|
WEP or WPA, change the Wifi.begin() call accordingly.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached
|
||||||
|
* LED attached to pin 9
|
||||||
|
|
||||||
|
created 25 Nov 2012
|
||||||
|
by Tom Igoe
|
||||||
|
*/
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
char ssid[] = "yourNetwork"; // your network SSID (name)
|
||||||
|
char pass[] = "secretPassword"; // your network password
|
||||||
|
int keyIndex = 0; // your network key Index number (needed only for WEP)
|
||||||
|
|
||||||
|
int status = WL_IDLE_STATUS;
|
||||||
|
WiFiServer server(80);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600); // initialize serial communication
|
||||||
|
pinMode(9, OUTPUT); // set the LED pin mode
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
while (true); // don't continue
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to Network named: ");
|
||||||
|
Serial.println(ssid); // print the network name (SSID);
|
||||||
|
|
||||||
|
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
|
||||||
|
status = WiFi.begin(ssid, pass);
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
server.begin(); // start the web server on port 80
|
||||||
|
printWifiStatus(); // you're connected now, so print out the status
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
WiFiClient client = server.available(); // listen for incoming clients
|
||||||
|
|
||||||
|
if (client) { // if you get a client,
|
||||||
|
Serial.println("new client"); // print a message out the serial port
|
||||||
|
String currentLine = ""; // make a String to hold incoming data from the client
|
||||||
|
while (client.connected()) { // loop while the client's connected
|
||||||
|
if (client.available()) { // if there's bytes to read from the client,
|
||||||
|
char c = client.read(); // read a byte, then
|
||||||
|
Serial.write(c); // print it out the serial monitor
|
||||||
|
if (c == '\n') { // if the byte is a newline character
|
||||||
|
|
||||||
|
// if the current line is blank, you got two newline characters in a row.
|
||||||
|
// that's the end of the client HTTP request, so send a response:
|
||||||
|
if (currentLine.length() == 0) {
|
||||||
|
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
|
||||||
|
// and a content-type so the client knows what's coming, then a blank line:
|
||||||
|
client.println("HTTP/1.1 200 OK");
|
||||||
|
client.println("Content-type:text/html");
|
||||||
|
client.println();
|
||||||
|
|
||||||
|
// the content of the HTTP response follows the header:
|
||||||
|
client.print("Click <a href=\"/H\">here</a> turn the LED on pin 9 on<br>");
|
||||||
|
client.print("Click <a href=\"/L\">here</a> turn the LED on pin 9 off<br>");
|
||||||
|
|
||||||
|
// The HTTP response ends with another blank line:
|
||||||
|
client.println();
|
||||||
|
// break out of the while loop:
|
||||||
|
break;
|
||||||
|
} else { // if you got a newline, then clear currentLine:
|
||||||
|
currentLine = "";
|
||||||
|
}
|
||||||
|
} else if (c != '\r') { // if you got anything else but a carriage return character,
|
||||||
|
currentLine += c; // add it to the end of the currentLine
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check to see if the client request was "GET /H" or "GET /L":
|
||||||
|
if (currentLine.endsWith("GET /H")) {
|
||||||
|
digitalWrite(9, HIGH); // GET /H turns the LED on
|
||||||
|
}
|
||||||
|
if (currentLine.endsWith("GET /L")) {
|
||||||
|
digitalWrite(9, LOW); // GET /L turns the LED off
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// close the connection:
|
||||||
|
client.stop();
|
||||||
|
Serial.println("client disonnected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printWifiStatus() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.print(rssi);
|
||||||
|
Serial.println(" dBm");
|
||||||
|
// print where to go in a browser:
|
||||||
|
Serial.print("To see this page in action, open a browser to http://");
|
||||||
|
Serial.println(ip);
|
||||||
|
}
|
117
firmware/libraries/WiFi/examples/WiFiChatServer/WiFiChatServer.ino
Executable file
117
firmware/libraries/WiFi/examples/WiFiChatServer/WiFiChatServer.ino
Executable file
|
@ -0,0 +1,117 @@
|
||||||
|
/*
|
||||||
|
Chat Server
|
||||||
|
|
||||||
|
A simple server that distributes any incoming messages to all
|
||||||
|
connected clients. To use telnet to your device's IP address and type.
|
||||||
|
You can see the client's input in the serial monitor as well.
|
||||||
|
|
||||||
|
This example is written for a network using WPA encryption. For
|
||||||
|
WEP or WPA, change the Wifi.begin() call accordingly.
|
||||||
|
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached
|
||||||
|
|
||||||
|
created 18 Dec 2009
|
||||||
|
by David A. Mellis
|
||||||
|
modified 31 May 2012
|
||||||
|
by Tom Igoe
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
char ssid[] = "yourNetwork"; // your network SSID (name)
|
||||||
|
char pass[] = "secretPassword"; // your network password (use for WPA, or use as key for WEP)
|
||||||
|
|
||||||
|
int keyIndex = 0; // your network key Index number (needed only for WEP)
|
||||||
|
|
||||||
|
int status = WL_IDLE_STATUS;
|
||||||
|
|
||||||
|
WiFiServer server(23);
|
||||||
|
|
||||||
|
boolean alreadyConnected = false; // whether or not the client was connected previously
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//Initialize serial and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to SSID: ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
|
||||||
|
status = WiFi.begin(ssid, pass);
|
||||||
|
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// start the server:
|
||||||
|
server.begin();
|
||||||
|
// you're connected now, so print out the status:
|
||||||
|
printWifiStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// wait for a new client:
|
||||||
|
WiFiClient client = server.available();
|
||||||
|
|
||||||
|
|
||||||
|
// when the client sends the first byte, say hello:
|
||||||
|
if (client) {
|
||||||
|
if (!alreadyConnected) {
|
||||||
|
// clead out the input buffer:
|
||||||
|
client.flush();
|
||||||
|
Serial.println("We have a new client");
|
||||||
|
client.println("Hello, client!");
|
||||||
|
alreadyConnected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (client.available() > 0) {
|
||||||
|
// read the bytes incoming from the client:
|
||||||
|
char thisChar = client.read();
|
||||||
|
// echo the bytes back to the client:
|
||||||
|
server.write(thisChar);
|
||||||
|
// echo the bytes to the server as well:
|
||||||
|
Serial.write(thisChar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printWifiStatus() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.print(rssi);
|
||||||
|
Serial.println(" dBm");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
182
firmware/libraries/WiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino
Executable file
182
firmware/libraries/WiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino
Executable file
|
@ -0,0 +1,182 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Udp NTP Client
|
||||||
|
|
||||||
|
Get the time from a Network Time Protocol (NTP) time server
|
||||||
|
Demonstrates use of UDP sendPacket and ReceivePacket
|
||||||
|
For more on NTP time servers and the messages needed to communicate with them,
|
||||||
|
see http://en.wikipedia.org/wiki/Network_Time_Protocol
|
||||||
|
|
||||||
|
created 4 Sep 2010
|
||||||
|
by Michael Margolis
|
||||||
|
modified 9 Apr 2012
|
||||||
|
by Tom Igoe
|
||||||
|
|
||||||
|
This code is in the public domain.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <WiFiUdp.h>
|
||||||
|
|
||||||
|
int status = WL_IDLE_STATUS;
|
||||||
|
char ssid[] = "mynetwork"; // your network SSID (name)
|
||||||
|
char pass[] = "mypassword"; // your network password
|
||||||
|
int keyIndex = 0; // your network key Index number (needed only for WEP)
|
||||||
|
|
||||||
|
unsigned int localPort = 2390; // local port to listen for UDP packets
|
||||||
|
|
||||||
|
IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server
|
||||||
|
|
||||||
|
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
|
||||||
|
|
||||||
|
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
|
||||||
|
|
||||||
|
// A UDP instance to let us send and receive packets over UDP
|
||||||
|
WiFiUDP Udp;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Open serial communications and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to SSID: ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
|
||||||
|
status = WiFi.begin(ssid, pass);
|
||||||
|
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("Connected to wifi");
|
||||||
|
printWifiStatus();
|
||||||
|
|
||||||
|
Serial.println("\nStarting connection to server...");
|
||||||
|
Udp.begin(localPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
sendNTPpacket(timeServer); // send an NTP packet to a time server
|
||||||
|
// wait to see if a reply is available
|
||||||
|
delay(1000);
|
||||||
|
if (Udp.parsePacket()) {
|
||||||
|
Serial.println("packet received");
|
||||||
|
// We've received a packet, read the data from it
|
||||||
|
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
|
||||||
|
|
||||||
|
//the timestamp starts at byte 40 of the received packet and is four bytes,
|
||||||
|
// or two words, long. First, esxtract the two words:
|
||||||
|
|
||||||
|
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
|
||||||
|
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
|
||||||
|
// combine the four bytes (two words) into a long integer
|
||||||
|
// this is NTP time (seconds since Jan 1 1900):
|
||||||
|
unsigned long secsSince1900 = highWord << 16 | lowWord;
|
||||||
|
Serial.print("Seconds since Jan 1 1900 = ");
|
||||||
|
Serial.println(secsSince1900);
|
||||||
|
|
||||||
|
// now convert NTP time into everyday time:
|
||||||
|
Serial.print("Unix time = ");
|
||||||
|
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
|
||||||
|
const unsigned long seventyYears = 2208988800UL;
|
||||||
|
// subtract seventy years:
|
||||||
|
unsigned long epoch = secsSince1900 - seventyYears;
|
||||||
|
// print Unix time:
|
||||||
|
Serial.println(epoch);
|
||||||
|
|
||||||
|
|
||||||
|
// print the hour, minute and second:
|
||||||
|
Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT)
|
||||||
|
Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day)
|
||||||
|
Serial.print(':');
|
||||||
|
if (((epoch % 3600) / 60) < 10) {
|
||||||
|
// In the first 10 minutes of each hour, we'll want a leading '0'
|
||||||
|
Serial.print('0');
|
||||||
|
}
|
||||||
|
Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute)
|
||||||
|
Serial.print(':');
|
||||||
|
if ((epoch % 60) < 10) {
|
||||||
|
// In the first 10 seconds of each minute, we'll want a leading '0'
|
||||||
|
Serial.print('0');
|
||||||
|
}
|
||||||
|
Serial.println(epoch % 60); // print the second
|
||||||
|
}
|
||||||
|
// wait ten seconds before asking for the time again
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// send an NTP request to the time server at the given address
|
||||||
|
unsigned long sendNTPpacket(IPAddress& address) {
|
||||||
|
//Serial.println("1");
|
||||||
|
// set all bytes in the buffer to 0
|
||||||
|
memset(packetBuffer, 0, NTP_PACKET_SIZE);
|
||||||
|
// Initialize values needed to form NTP request
|
||||||
|
// (see URL above for details on the packets)
|
||||||
|
//Serial.println("2");
|
||||||
|
packetBuffer[0] = 0b11100011; // LI, Version, Mode
|
||||||
|
packetBuffer[1] = 0; // Stratum, or type of clock
|
||||||
|
packetBuffer[2] = 6; // Polling Interval
|
||||||
|
packetBuffer[3] = 0xEC; // Peer Clock Precision
|
||||||
|
// 8 bytes of zero for Root Delay & Root Dispersion
|
||||||
|
packetBuffer[12] = 49;
|
||||||
|
packetBuffer[13] = 0x4E;
|
||||||
|
packetBuffer[14] = 49;
|
||||||
|
packetBuffer[15] = 52;
|
||||||
|
|
||||||
|
//Serial.println("3");
|
||||||
|
|
||||||
|
// all NTP fields have been given values, now
|
||||||
|
// you can send a packet requesting a timestamp:
|
||||||
|
Udp.beginPacket(address, 123); //NTP requests are to port 123
|
||||||
|
//Serial.println("4");
|
||||||
|
Udp.write(packetBuffer, NTP_PACKET_SIZE);
|
||||||
|
//Serial.println("5");
|
||||||
|
Udp.endPacket();
|
||||||
|
//Serial.println("6");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printWifiStatus() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.print(rssi);
|
||||||
|
Serial.println(" dBm");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
WiFi UDP Send and Receive String
|
||||||
|
|
||||||
|
This sketch wait an UDP packet on localPort using a WiFi shield.
|
||||||
|
When a packet is received an Acknowledge packet is sent to the client on port remotePort
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached
|
||||||
|
|
||||||
|
created 30 December 2012
|
||||||
|
by dlf (Metodo2 srl)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <WiFiUdp.h>
|
||||||
|
|
||||||
|
int status = WL_IDLE_STATUS;
|
||||||
|
char ssid[] = "yourNetwork"; // your network SSID (name)
|
||||||
|
char pass[] = "secretPassword"; // your network password (use for WPA, or use as key for WEP)
|
||||||
|
int keyIndex = 0; // your network key Index number (needed only for WEP)
|
||||||
|
|
||||||
|
unsigned int localPort = 2390; // local port to listen on
|
||||||
|
|
||||||
|
char packetBuffer[255]; //buffer to hold incoming packet
|
||||||
|
char ReplyBuffer[] = "acknowledged"; // a string to send back
|
||||||
|
|
||||||
|
WiFiUDP Udp;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//Initialize serial and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to SSID: ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
|
||||||
|
status = WiFi.begin(ssid);
|
||||||
|
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
Serial.println("Connected to wifi");
|
||||||
|
printWifiStatus();
|
||||||
|
|
||||||
|
Serial.println("\nStarting connection to server...");
|
||||||
|
// if you get a connection, report back via serial:
|
||||||
|
Udp.begin(localPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
// if there's data available, read a packet
|
||||||
|
int packetSize = Udp.parsePacket();
|
||||||
|
if (packetSize) {
|
||||||
|
Serial.print("Received packet of size ");
|
||||||
|
Serial.println(packetSize);
|
||||||
|
Serial.print("From ");
|
||||||
|
IPAddress remoteIp = Udp.remoteIP();
|
||||||
|
Serial.print(remoteIp);
|
||||||
|
Serial.print(", port ");
|
||||||
|
Serial.println(Udp.remotePort());
|
||||||
|
|
||||||
|
// read the packet into packetBufffer
|
||||||
|
int len = Udp.read(packetBuffer, 255);
|
||||||
|
if (len > 0) {
|
||||||
|
packetBuffer[len] = 0;
|
||||||
|
}
|
||||||
|
Serial.println("Contents:");
|
||||||
|
Serial.println(packetBuffer);
|
||||||
|
|
||||||
|
// send a reply, to the IP address and port that sent us the packet we received
|
||||||
|
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
|
||||||
|
Udp.write(ReplyBuffer);
|
||||||
|
Udp.endPacket();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printWifiStatus() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.print(rssi);
|
||||||
|
Serial.println(" dBm");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
126
firmware/libraries/WiFi/examples/WiFiWebClient/WiFiWebClient.ino
Executable file
126
firmware/libraries/WiFi/examples/WiFiWebClient/WiFiWebClient.ino
Executable file
|
@ -0,0 +1,126 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
Web client
|
||||||
|
|
||||||
|
This sketch connects to a website (http://www.google.com)
|
||||||
|
using a WiFi shield.
|
||||||
|
|
||||||
|
This example is written for a network using WPA encryption. For
|
||||||
|
WEP or WPA, change the Wifi.begin() call accordingly.
|
||||||
|
|
||||||
|
This example is written for a network using WPA encryption. For
|
||||||
|
WEP or WPA, change the Wifi.begin() call accordingly.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached
|
||||||
|
|
||||||
|
created 13 July 2010
|
||||||
|
by dlf (Metodo2 srl)
|
||||||
|
modified 31 May 2012
|
||||||
|
by Tom Igoe
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
char ssid[] = "yourNetwork"; // your network SSID (name)
|
||||||
|
char pass[] = "secretPassword"; // your network password (use for WPA, or use as key for WEP)
|
||||||
|
int keyIndex = 0; // your network key Index number (needed only for WEP)
|
||||||
|
|
||||||
|
int status = WL_IDLE_STATUS;
|
||||||
|
// if you don't want to use DNS (and reduce your sketch size)
|
||||||
|
// use the numeric IP instead of the name for the server:
|
||||||
|
//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS)
|
||||||
|
char server[] = "www.google.com"; // name address for Google (using DNS)
|
||||||
|
|
||||||
|
// Initialize the Ethernet client library
|
||||||
|
// with the IP address and port of the server
|
||||||
|
// that you want to connect to (port 80 is default for HTTP):
|
||||||
|
WiFiClient client;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//Initialize serial and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to SSID: ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
|
||||||
|
status = WiFi.begin(ssid, pass);
|
||||||
|
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
Serial.println("Connected to wifi");
|
||||||
|
printWifiStatus();
|
||||||
|
|
||||||
|
Serial.println("\nStarting connection to server...");
|
||||||
|
// if you get a connection, report back via serial:
|
||||||
|
if (client.connect(server, 80)) {
|
||||||
|
Serial.println("connected to server");
|
||||||
|
// Make a HTTP request:
|
||||||
|
client.println("GET /search?q=arduino HTTP/1.1");
|
||||||
|
client.println("Host: www.google.com");
|
||||||
|
client.println("Connection: close");
|
||||||
|
client.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// if there are incoming bytes available
|
||||||
|
// from the server, read them and print them:
|
||||||
|
while (client.available()) {
|
||||||
|
char c = client.read();
|
||||||
|
Serial.write(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the server's disconnected, stop the client:
|
||||||
|
if (!client.connected()) {
|
||||||
|
Serial.println();
|
||||||
|
Serial.println("disconnecting from server.");
|
||||||
|
client.stop();
|
||||||
|
|
||||||
|
// do nothing forevermore:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printWifiStatus() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.print(rssi);
|
||||||
|
Serial.println(" dBm");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,131 @@
|
||||||
|
/*
|
||||||
|
Repeating Wifi Web Client
|
||||||
|
|
||||||
|
This sketch connects to a a web server and makes a request
|
||||||
|
using an Arduino Wifi shield.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached to pins SPI pins and pin 7
|
||||||
|
|
||||||
|
created 23 April 2012
|
||||||
|
modified 31 May 2012
|
||||||
|
by Tom Igoe
|
||||||
|
modified 13 Jan 2014
|
||||||
|
by Federico Vanzati
|
||||||
|
|
||||||
|
http://www.arduino.cc/en/Tutorial/WifiWebClientRepeating
|
||||||
|
This code is in the public domain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
char ssid[] = "yourNetwork"; // your network SSID (name)
|
||||||
|
char pass[] = "secretPassword"; // your network password
|
||||||
|
int keyIndex = 0; // your network key Index number (needed only for WEP)
|
||||||
|
|
||||||
|
int status = WL_IDLE_STATUS;
|
||||||
|
|
||||||
|
// Initialize the Wifi client library
|
||||||
|
WiFiClient client;
|
||||||
|
|
||||||
|
// server address:
|
||||||
|
char server[] = "www.arduino.cc";
|
||||||
|
//IPAddress server(64,131,82,241);
|
||||||
|
|
||||||
|
unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
|
||||||
|
const unsigned long postingInterval = 10L * 1000L; // delay between updates, in milliseconds
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//Initialize serial and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to SSID: ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
|
||||||
|
status = WiFi.begin(ssid, pass);
|
||||||
|
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
// you're connected now, so print out the status:
|
||||||
|
printWifiStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// if there's incoming data from the net connection.
|
||||||
|
// send it out the serial port. This is for debugging
|
||||||
|
// purposes only:
|
||||||
|
while (client.available()) {
|
||||||
|
char c = client.read();
|
||||||
|
Serial.write(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if ten seconds have passed since your last connection,
|
||||||
|
// then connect again and send data:
|
||||||
|
if (millis() - lastConnectionTime > postingInterval) {
|
||||||
|
httpRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// this method makes a HTTP connection to the server:
|
||||||
|
void httpRequest() {
|
||||||
|
// close any connection before send a new request.
|
||||||
|
// This will free the socket on the WiFi shield
|
||||||
|
client.stop();
|
||||||
|
|
||||||
|
// if there's a successful connection:
|
||||||
|
if (client.connect(server, 80)) {
|
||||||
|
Serial.println("connecting...");
|
||||||
|
// send the HTTP PUT request:
|
||||||
|
client.println("GET /latest.txt HTTP/1.1");
|
||||||
|
client.println("Host: www.arduino.cc");
|
||||||
|
client.println("User-Agent: ArduinoWiFi/1.1");
|
||||||
|
client.println("Connection: close");
|
||||||
|
client.println();
|
||||||
|
|
||||||
|
// note the time that the connection was made:
|
||||||
|
lastConnectionTime = millis();
|
||||||
|
} else {
|
||||||
|
// if you couldn't make a connection:
|
||||||
|
Serial.println("connection failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printWifiStatus() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.print(rssi);
|
||||||
|
Serial.println(" dBm");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
138
firmware/libraries/WiFi/examples/WiFiWebServer/WiFiWebServer.ino
Executable file
138
firmware/libraries/WiFi/examples/WiFiWebServer/WiFiWebServer.ino
Executable file
|
@ -0,0 +1,138 @@
|
||||||
|
/*
|
||||||
|
WiFi Web Server
|
||||||
|
|
||||||
|
A simple web server that shows the value of the analog input pins.
|
||||||
|
using a WiFi shield.
|
||||||
|
|
||||||
|
This example is written for a network using WPA encryption. For
|
||||||
|
WEP or WPA, change the Wifi.begin() call accordingly.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* WiFi shield attached
|
||||||
|
* Analog inputs attached to pins A0 through A5 (optional)
|
||||||
|
|
||||||
|
created 13 July 2010
|
||||||
|
by dlf (Metodo2 srl)
|
||||||
|
modified 31 May 2012
|
||||||
|
by Tom Igoe
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
|
||||||
|
char ssid[] = "yourNetwork"; // your network SSID (name)
|
||||||
|
char pass[] = "secretPassword"; // your network password
|
||||||
|
int keyIndex = 0; // your network key Index number (needed only for WEP)
|
||||||
|
|
||||||
|
int status = WL_IDLE_STATUS;
|
||||||
|
|
||||||
|
WiFiServer server(80);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
//Initialize serial and wait for port to open:
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB port only
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for the presence of the shield:
|
||||||
|
if (WiFi.status() == WL_NO_SHIELD) {
|
||||||
|
Serial.println("WiFi shield not present");
|
||||||
|
// don't continue:
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fv = WiFi.firmwareVersion();
|
||||||
|
if (fv != "1.1.0") {
|
||||||
|
Serial.println("Please upgrade the firmware");
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to connect to Wifi network:
|
||||||
|
while (status != WL_CONNECTED) {
|
||||||
|
Serial.print("Attempting to connect to SSID: ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
|
||||||
|
status = WiFi.begin(ssid, pass);
|
||||||
|
|
||||||
|
// wait 10 seconds for connection:
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
server.begin();
|
||||||
|
// you're connected now, so print out the status:
|
||||||
|
printWifiStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// listen for incoming clients
|
||||||
|
WiFiClient client = server.available();
|
||||||
|
if (client) {
|
||||||
|
Serial.println("new client");
|
||||||
|
// an http request ends with a blank line
|
||||||
|
boolean currentLineIsBlank = true;
|
||||||
|
while (client.connected()) {
|
||||||
|
if (client.available()) {
|
||||||
|
char c = client.read();
|
||||||
|
Serial.write(c);
|
||||||
|
// if you've gotten to the end of the line (received a newline
|
||||||
|
// character) and the line is blank, the http request has ended,
|
||||||
|
// so you can send a reply
|
||||||
|
if (c == '\n' && currentLineIsBlank) {
|
||||||
|
// send a standard http response header
|
||||||
|
client.println("HTTP/1.1 200 OK");
|
||||||
|
client.println("Content-Type: text/html");
|
||||||
|
client.println("Connection: close"); // the connection will be closed after completion of the response
|
||||||
|
client.println("Refresh: 5"); // refresh the page automatically every 5 sec
|
||||||
|
client.println();
|
||||||
|
client.println("<!DOCTYPE HTML>");
|
||||||
|
client.println("<html>");
|
||||||
|
// output the value of each analog input pin
|
||||||
|
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
|
||||||
|
int sensorReading = analogRead(analogChannel);
|
||||||
|
client.print("analog input ");
|
||||||
|
client.print(analogChannel);
|
||||||
|
client.print(" is ");
|
||||||
|
client.print(sensorReading);
|
||||||
|
client.println("<br />");
|
||||||
|
}
|
||||||
|
client.println("</html>");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (c == '\n') {
|
||||||
|
// you're starting a new line
|
||||||
|
currentLineIsBlank = true;
|
||||||
|
} else if (c != '\r') {
|
||||||
|
// you've gotten a character on the current line
|
||||||
|
currentLineIsBlank = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// give the web browser time to receive the data
|
||||||
|
delay(1);
|
||||||
|
|
||||||
|
// close the connection:
|
||||||
|
client.stop();
|
||||||
|
Serial.println("client disonnected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printWifiStatus() {
|
||||||
|
// print the SSID of the network you're attached to:
|
||||||
|
Serial.print("SSID: ");
|
||||||
|
Serial.println(WiFi.SSID());
|
||||||
|
|
||||||
|
// print your WiFi shield's IP address:
|
||||||
|
IPAddress ip = WiFi.localIP();
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(ip);
|
||||||
|
|
||||||
|
// print the received signal strength:
|
||||||
|
long rssi = WiFi.RSSI();
|
||||||
|
Serial.print("signal strength (RSSI):");
|
||||||
|
Serial.print(rssi);
|
||||||
|
Serial.println(" dBm");
|
||||||
|
}
|
||||||
|
|
BIN
firmware/libraries/WiFi/extras/binary/wifiHD.elf
Executable file
BIN
firmware/libraries/WiFi/extras/binary/wifiHD.elf
Executable file
Binary file not shown.
16358
firmware/libraries/WiFi/extras/binary/wifiHD.hex
Executable file
16358
firmware/libraries/WiFi/extras/binary/wifiHD.hex
Executable file
File diff suppressed because it is too large
Load diff
BIN
firmware/libraries/WiFi/extras/binary/wifiHD_2_1.elf
Executable file
BIN
firmware/libraries/WiFi/extras/binary/wifiHD_2_1.elf
Executable file
Binary file not shown.
BIN
firmware/libraries/WiFi/extras/binary/wifi_dnld.elf
Executable file
BIN
firmware/libraries/WiFi/extras/binary/wifi_dnld.elf
Executable file
Binary file not shown.
10470
firmware/libraries/WiFi/extras/binary/wifi_dnld.hex
Executable file
10470
firmware/libraries/WiFi/extras/binary/wifi_dnld.hex
Executable file
File diff suppressed because it is too large
Load diff
BIN
firmware/libraries/WiFi/extras/binary/wifi_dnld_2_1.elf
Executable file
BIN
firmware/libraries/WiFi/extras/binary/wifi_dnld_2_1.elf
Executable file
Binary file not shown.
121
firmware/libraries/WiFi/extras/scripts/ArduinoWifiShield_upgrade.sh
Executable file
121
firmware/libraries/WiFi/extras/scripts/ArduinoWifiShield_upgrade.sh
Executable file
|
@ -0,0 +1,121 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#WIFI_FW_PATH="/hardware/arduino/firmwares/wifishield/binary"
|
||||||
|
WIFI_FW_PATH="/libraries/WiFi/extras/binary"
|
||||||
|
AVR_TOOLS_PATH="/hardware/tools/avr/bin"
|
||||||
|
|
||||||
|
TARGET_MICRO="at32uc3a1256"
|
||||||
|
|
||||||
|
|
||||||
|
progname=$0
|
||||||
|
|
||||||
|
usage () {
|
||||||
|
cat <<EOF
|
||||||
|
Usage: $progname [-a Arduino_path] [-f which_firmware] [-h]
|
||||||
|
-a set the path where the Arduino IDE is installed
|
||||||
|
-f the firmware you want to upload, valid parameters are:
|
||||||
|
shield - to upgrade the WiFi shield firmware
|
||||||
|
all - to upgrade both firmwares
|
||||||
|
-h help
|
||||||
|
EOF
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
upgradeHDmodule () {
|
||||||
|
sleep 1 # Give time to the shield to end the boot
|
||||||
|
echo "****Upgrade HD WiFi module firmware****\n"
|
||||||
|
dfu-programmer $TARGET_MICRO erase
|
||||||
|
dfu-programmer $TARGET_MICRO flash --suppress-bootloader-mem $WIFI_FW_PATH/wifi_dnld.hex
|
||||||
|
dfu-programmer $TARGET_MICRO start
|
||||||
|
|
||||||
|
if [ $? != 0 ] ; then
|
||||||
|
echo "\nError during device initialization, please close the J3 jumper and press the reset button.\nTry -h for help\n"
|
||||||
|
exit 1 # if the device is not recognized exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "\nPress the RESET button on the shield then type [ENTER] to upgrade the firmware of the shield..\n"
|
||||||
|
read readEnter
|
||||||
|
}
|
||||||
|
|
||||||
|
upgradeShield () {
|
||||||
|
sleep 1 # Give time to the shield to end the boot
|
||||||
|
echo "****Upgrade WiFi Shield firmware****\n"
|
||||||
|
dfu-programmer $TARGET_MICRO erase
|
||||||
|
dfu-programmer $TARGET_MICRO flash --suppress-bootloader-mem $WIFI_FW_PATH/wifiHD.hex
|
||||||
|
dfu-programmer $TARGET_MICRO start
|
||||||
|
|
||||||
|
if [ $? != 0 ] ; then
|
||||||
|
echo "\nError during device initialization, please close the J3 jumper and press the reset button.\nTry -h for help\n"
|
||||||
|
exit 1 # if the device is not recognized exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "\nDone. Remove the J3 jumper and press the RESET button on the shield."
|
||||||
|
echo "Thank you!\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Arduino WiFi Shield upgrade
|
||||||
|
=========================================
|
||||||
|
Instructions:
|
||||||
|
|
||||||
|
To access to the USB devices correctly, the dfu-programmer needs to have the root permissions.
|
||||||
|
|
||||||
|
You can upgrade the firmware of the antenna togheter with the shield firmware or only the shield firmware
|
||||||
|
if there aren't changes on the antenna firmware.
|
||||||
|
|
||||||
|
Use the '-h' parameter for help
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
if [ $USER = 'root' ] ; then #check if the current user is root
|
||||||
|
while getopts ":a:f:h" opt; do
|
||||||
|
case $opt in
|
||||||
|
a)
|
||||||
|
ARDUINO_PATH=$OPTARG
|
||||||
|
WIFI_FW_PATH=$ARDUINO_PATH$WIFI_FW_PATH
|
||||||
|
AVR_TOOLS_PATH=$ARDUINO_PATH$AVR_TOOLS_PATH
|
||||||
|
cd $AVR_TOOLS_PATH
|
||||||
|
./avr-objcopy --output-target=ihex $WIFI_FW_PATH/wifi_dnld.elf $WIFI_FW_PATH/wifi_dnld.hex
|
||||||
|
./avr-objcopy --output-target=ihex $WIFI_FW_PATH/wifiHD.elf $WIFI_FW_PATH/wifiHD.hex
|
||||||
|
;;
|
||||||
|
f)
|
||||||
|
if [ "$ARDUINO_PATH" != "" ] ; then
|
||||||
|
if [ "$OPTARG" = "all" ] ; then
|
||||||
|
upgradeHDmodule
|
||||||
|
upgradeShield
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
if [ "$OPTARG" = "shield" ] ; then
|
||||||
|
upgradeShield
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "invalid parameter for the -f [firmware] option, please retry."
|
||||||
|
echo "Type -h for help\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Arduino Path not setted. Retry...\n"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
usage ;;
|
||||||
|
\?)
|
||||||
|
echo "Invalid option: $OPTARG" >&2
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
:)
|
||||||
|
echo "Option -$OPTARG requires an argument." >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "Please retry running the script as root.\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
shift $(($OPTIND - 1))
|
4045
firmware/libraries/WiFi/extras/wifiHD/.cproject
Executable file
4045
firmware/libraries/WiFi/extras/wifiHD/.cproject
Executable file
File diff suppressed because it is too large
Load diff
77
firmware/libraries/WiFi/extras/wifiHD/.project
Executable file
77
firmware/libraries/WiFi/extras/wifiHD/.project
Executable file
|
@ -0,0 +1,77 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>wifiHD</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||||
|
<triggers>clean,full,incremental,</triggers>
|
||||||
|
<arguments>
|
||||||
|
<dictionary>
|
||||||
|
<key>?name?</key>
|
||||||
|
<value></value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.append_environment</key>
|
||||||
|
<value>true</value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.buildArguments</key>
|
||||||
|
<value></value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.buildCommand</key>
|
||||||
|
<value>make</value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.buildLocation</key>
|
||||||
|
<value>${workspace_loc:/wifiHD/Debug}</value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.contents</key>
|
||||||
|
<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
|
||||||
|
<value>false</value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
|
||||||
|
<value>true</value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.enableFullBuild</key>
|
||||||
|
<value>true</value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.stopOnError</key>
|
||||||
|
<value>true</value>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary>
|
||||||
|
<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
|
||||||
|
<value>true</value>
|
||||||
|
</dictionary>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>com.atmel.avr32.core.nature</nature>
|
||||||
|
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||||
|
</natures>
|
||||||
|
<linkedResources>
|
||||||
|
<link>
|
||||||
|
<name>UC3 Software Framework</name>
|
||||||
|
<type>2</type>
|
||||||
|
<locationURI>framework:/com.atmel.avr32.sf.uc3</locationURI>
|
||||||
|
</link>
|
||||||
|
</linkedResources>
|
||||||
|
</projectDescription>
|
BIN
firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.elf
Executable file
BIN
firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.elf
Executable file
Binary file not shown.
16358
firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.hex
Executable file
16358
firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.hex
Executable file
File diff suppressed because it is too large
Load diff
170
firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_access.h
Executable file
170
firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_access.h
Executable file
|
@ -0,0 +1,170 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief Memory access control configuration file.
|
||||||
|
*
|
||||||
|
* This file contains the possible external configuration of the memory access
|
||||||
|
* control.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CONF_ACCESS_H_
|
||||||
|
#define _CONF_ACCESS_H_
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
#include "board.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Activation of Logical Unit Numbers
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define LUN_0 DISABLE //!< On-Chip Virtual Memory.
|
||||||
|
#define LUN_1 ENABLE //!< AT45DBX Data Flash.
|
||||||
|
#define LUN_2 DISABLE //!< SD/MMC Card over SPI.
|
||||||
|
#define LUN_3 DISABLE
|
||||||
|
#define LUN_4 DISABLE
|
||||||
|
#define LUN_5 DISABLE
|
||||||
|
#define LUN_6 DISABLE
|
||||||
|
#define LUN_7 DISABLE
|
||||||
|
#define LUN_USB DISABLE //!< Host Mass-Storage Memory.
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name LUN 0 Definitions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define VIRTUAL_MEM LUN_0
|
||||||
|
#define LUN_ID_VIRTUAL_MEM LUN_ID_0
|
||||||
|
#define LUN_0_INCLUDE "virtual_mem.h"
|
||||||
|
#define Lun_0_test_unit_ready virtual_test_unit_ready
|
||||||
|
#define Lun_0_read_capacity virtual_read_capacity
|
||||||
|
#define Lun_0_wr_protect virtual_wr_protect
|
||||||
|
#define Lun_0_removal virtual_removal
|
||||||
|
#define Lun_0_usb_read_10 virtual_usb_read_10
|
||||||
|
#define Lun_0_usb_write_10 virtual_usb_write_10
|
||||||
|
#define Lun_0_mem_2_ram virtual_mem_2_ram
|
||||||
|
#define Lun_0_ram_2_mem virtual_ram_2_mem
|
||||||
|
#define LUN_0_NAME "\"On-Chip Virtual Memory\""
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name LUN 1 Definitions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_MEM LUN_1
|
||||||
|
#define LUN_ID_AT45DBX_MEM LUN_ID_1
|
||||||
|
#define LUN_1_INCLUDE "at45dbx_mem.h"
|
||||||
|
#define Lun_1_test_unit_ready at45dbx_test_unit_ready
|
||||||
|
#define Lun_1_read_capacity at45dbx_read_capacity
|
||||||
|
#define Lun_1_wr_protect at45dbx_wr_protect
|
||||||
|
#define Lun_1_removal at45dbx_removal
|
||||||
|
#define Lun_1_usb_read_10 at45dbx_usb_read_10
|
||||||
|
#define Lun_1_usb_write_10 at45dbx_usb_write_10
|
||||||
|
#define Lun_1_mem_2_ram at45dbx_df_2_ram
|
||||||
|
#define Lun_1_ram_2_mem at45dbx_ram_2_df
|
||||||
|
#define LUN_1_NAME "\"AT45DBX Data Flash\""
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name LUN 2 Definitions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define SD_MMC_SPI_MEM LUN_2
|
||||||
|
#define LUN_ID_SD_MMC_SPI_MEM LUN_ID_2
|
||||||
|
#define LUN_2_INCLUDE "sd_mmc_spi_mem.h"
|
||||||
|
#define Lun_2_test_unit_ready sd_mmc_spi_test_unit_ready
|
||||||
|
#define Lun_2_read_capacity sd_mmc_spi_read_capacity
|
||||||
|
#define Lun_2_wr_protect sd_mmc_spi_wr_protect
|
||||||
|
#define Lun_2_removal sd_mmc_spi_removal
|
||||||
|
#define Lun_2_usb_read_10 sd_mmc_spi_usb_read_10
|
||||||
|
#define Lun_2_usb_write_10 sd_mmc_spi_usb_write_10
|
||||||
|
#define Lun_2_mem_2_ram sd_mmc_spi_mem_2_ram
|
||||||
|
#define Lun_2_ram_2_mem sd_mmc_spi_ram_2_mem
|
||||||
|
#define LUN_2_NAME "\"SD/MMC Card over SPI\""
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name USB LUNs Definitions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define MEM_USB LUN_USB
|
||||||
|
#define LUN_ID_MEM_USB LUN_ID_USB
|
||||||
|
#define LUN_USB_INCLUDE "host_mem.h"
|
||||||
|
#define Lun_usb_test_unit_ready(lun) host_test_unit_ready(lun)
|
||||||
|
#define Lun_usb_read_capacity(lun, nb_sect) host_read_capacity(lun, nb_sect)
|
||||||
|
#define Lun_usb_read_sector_size(lun) host_read_sector_size(lun)
|
||||||
|
#define Lun_usb_wr_protect(lun) host_wr_protect(lun)
|
||||||
|
#define Lun_usb_removal() host_removal()
|
||||||
|
#define Lun_usb_mem_2_ram(addr, ram) host_read_10_ram(addr, ram)
|
||||||
|
#define Lun_usb_ram_2_mem(addr, ram) host_write_10_ram(addr, ram)
|
||||||
|
#define LUN_USB_NAME "\"Host Mass-Storage Memory\""
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name Actions Associated with Memory Accesses
|
||||||
|
*
|
||||||
|
* Write here the action to associate with each memory access.
|
||||||
|
*
|
||||||
|
* \warning Be careful not to waste time in order not to disturb the functions.
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define memory_start_read_action(nb_sectors)
|
||||||
|
#define memory_stop_read_action()
|
||||||
|
#define memory_start_write_action(nb_sectors)
|
||||||
|
#define memory_stop_write_action()
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name Activation of Interface Features
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define ACCESS_USB DISABLED //!< MEM <-> USB interface.
|
||||||
|
#define ACCESS_MEM_TO_RAM ENABLED //!< MEM <-> RAM interface.
|
||||||
|
#define ACCESS_STREAM ENABLED //!< Streaming MEM <-> MEM interface. //mlf
|
||||||
|
#define ACCESS_STREAM_RECORD DISABLED //!< Streaming MEM <-> MEM interface in record mode.
|
||||||
|
#define ACCESS_MEM_TO_MEM DISABLED //!< MEM <-> MEM interface.
|
||||||
|
#define ACCESS_CODEC DISABLED //!< Codec interface.
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name Specific Options for Access Control
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define GLOBAL_WR_PROTECT DISABLED //!< Management of a global write protection.
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _CONF_ACCESS_H_
|
83
firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_at45dbx.h
Executable file
83
firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_at45dbx.h
Executable file
|
@ -0,0 +1,83 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief AT45DBX configuration file.
|
||||||
|
*
|
||||||
|
* This file contains the possible external configuration of the AT45DBX.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices with an SPI module can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CONF_AT45DBX_H_
|
||||||
|
#define _CONF_AT45DBX_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "conf_access.h"
|
||||||
|
|
||||||
|
#if AT45DBX_MEM == DISABLE
|
||||||
|
#error conf_at45dbx.h is #included although AT45DBX_MEM is disabled
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "at45dbx.h"
|
||||||
|
|
||||||
|
|
||||||
|
//_____ D E F I N I T I O N S ______________________________________________
|
||||||
|
|
||||||
|
//! Size of AT45DBX data flash memories to manage.
|
||||||
|
#define AT45DBX_MEM_SIZE AT45DBX_1MB
|
||||||
|
|
||||||
|
//! Number of AT45DBX components to manage.
|
||||||
|
#define AT45DBX_MEM_CNT 1
|
||||||
|
|
||||||
|
//! First chip select used by AT45DBX components on the SPI module instance.
|
||||||
|
//! AT45DBX_SPI_NPCS0_PIN always corresponds to this first NPCS, whatever it is.
|
||||||
|
#define AT45DBX_SPI_FIRST_NPCS AT45DBX_SPI_NPCS
|
||||||
|
|
||||||
|
//! SPI master speed in Hz.
|
||||||
|
#define AT45DBX_SPI_MASTER_SPEED 12000000
|
||||||
|
|
||||||
|
//! Number of bits in each SPI transfer.
|
||||||
|
#define AT45DBX_SPI_BITS 8
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _CONF_AT45DBX_H_
|
108
firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_ebi.h
Executable file
108
firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_ebi.h
Executable file
|
@ -0,0 +1,108 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief CONF_EBI EBI/SMC driver for AVR32 UC3.
|
||||||
|
*
|
||||||
|
* \note The values defined in this file are device-specific. See the device
|
||||||
|
* datasheet for further information.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices with an SMC module can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CONF_EBI_H_
|
||||||
|
#define _CONF_EBI_H_
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
#include "board.h"
|
||||||
|
|
||||||
|
#if (ET024006DHU_SMC_USE_NCS == 0)
|
||||||
|
#define SMC_USE_NCS0
|
||||||
|
#define SMC_COMPONENT_CS0 ET024006DHU_SMC_COMPONENT_CS
|
||||||
|
#else
|
||||||
|
|
||||||
|
#if (ET024006DHU_SMC_USE_NCS == 2)
|
||||||
|
#define SMC_USE_NCS2
|
||||||
|
#define SMC_COMPONENT_CS2 ET024006DHU_SMC_COMPONENT_CS
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error This board is not supported
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define EBI_DATA_0 ET024006DHU_EBI_DATA_0
|
||||||
|
#define EBI_DATA_1 ET024006DHU_EBI_DATA_1
|
||||||
|
#define EBI_DATA_2 ET024006DHU_EBI_DATA_2
|
||||||
|
#define EBI_DATA_3 ET024006DHU_EBI_DATA_3
|
||||||
|
#define EBI_DATA_4 ET024006DHU_EBI_DATA_4
|
||||||
|
#define EBI_DATA_5 ET024006DHU_EBI_DATA_5
|
||||||
|
#define EBI_DATA_6 ET024006DHU_EBI_DATA_6
|
||||||
|
#define EBI_DATA_7 ET024006DHU_EBI_DATA_7
|
||||||
|
#define EBI_DATA_8 ET024006DHU_EBI_DATA_8
|
||||||
|
#define EBI_DATA_9 ET024006DHU_EBI_DATA_9
|
||||||
|
#define EBI_DATA_10 ET024006DHU_EBI_DATA_10
|
||||||
|
#define EBI_DATA_11 ET024006DHU_EBI_DATA_11
|
||||||
|
#define EBI_DATA_12 ET024006DHU_EBI_DATA_12
|
||||||
|
#define EBI_DATA_13 ET024006DHU_EBI_DATA_13
|
||||||
|
#define EBI_DATA_14 ET024006DHU_EBI_DATA_14
|
||||||
|
#define EBI_DATA_15 ET024006DHU_EBI_DATA_15
|
||||||
|
|
||||||
|
#if BOARD==EVK1105
|
||||||
|
#ifdef EVK1105_REV3
|
||||||
|
#define EBI_ADDR_19 AVR32_EBI_ADDR_19
|
||||||
|
#define EBI_NCS_2 ET024006DHU_EBI_NCS
|
||||||
|
#else
|
||||||
|
#define EBI_ADDR_21 ET024006DHU_EBI_ADDR_21
|
||||||
|
#define EBI_NCS_0 ET024006DHU_EBI_NCS
|
||||||
|
#endif
|
||||||
|
#elif BOARD == UC3C_EK
|
||||||
|
#define EBI_ADDR_22 AVR32_EBI_ADDR_22
|
||||||
|
#define EBI_NCS_0 ET024006DHU_EBI_NCS
|
||||||
|
#elif BOARD == EVK1104
|
||||||
|
#define EBI_ADDR_21 ET024006DHU_EBI_ADDR_21
|
||||||
|
#define EBI_NCS_0 ET024006DHU_EBI_NCS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define EBI_NWE0 ET024006DHU_EBI_NWE
|
||||||
|
#define EBI_NRD ET024006DHU_EBI_NRD
|
||||||
|
|
||||||
|
#endif // _CONF_EBI_H_
|
73
firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_sd_mmc_spi.h
Executable file
73
firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_sd_mmc_spi.h
Executable file
|
@ -0,0 +1,73 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief SD/MMC configuration file.
|
||||||
|
*
|
||||||
|
* This file contains the possible external configuration of the SD/MMC.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices with an SPI module can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CONF_SD_MMC_SPI_H_
|
||||||
|
#define _CONF_SD_MMC_SPI_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "conf_access.h"
|
||||||
|
|
||||||
|
#if SD_MMC_SPI_MEM == DISABLE
|
||||||
|
#error conf_sd_mmc_spi.h is #included although SD_MMC_SPI_MEM is disabled
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "sd_mmc_spi.h"
|
||||||
|
|
||||||
|
|
||||||
|
//_____ D E F I N I T I O N S ______________________________________________
|
||||||
|
|
||||||
|
//! SPI master speed in Hz.
|
||||||
|
#define SD_MMC_SPI_MASTER_SPEED 12000000
|
||||||
|
|
||||||
|
//! Number of bits in each SPI transfer.
|
||||||
|
#define SD_MMC_SPI_BITS 8
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _CONF_SD_MMC_SPI_H_
|
|
@ -0,0 +1,74 @@
|
||||||
|
/* This file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief AVR32 UC3 ISP trampoline.
|
||||||
|
*
|
||||||
|
* In order to be able to program a project with both BatchISP and JTAGICE mkII
|
||||||
|
* without having to take the general-purpose fuses into consideration, add this
|
||||||
|
* file to the project and change the program entry point to _trampoline.
|
||||||
|
*
|
||||||
|
* The pre-programmed ISP will be erased if JTAGICE mkII is used.
|
||||||
|
*
|
||||||
|
* - Compiler: GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32UC devices can be used.
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (C) 2006-2008, Atmel Corporation All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of ATMEL may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
|
||||||
|
* SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "conf_isp.h"
|
||||||
|
|
||||||
|
|
||||||
|
//! @{
|
||||||
|
//! \verbatim
|
||||||
|
|
||||||
|
|
||||||
|
// This must be linked @ 0x80000000 if it is to be run upon reset.
|
||||||
|
.section .reset, "ax", @progbits
|
||||||
|
|
||||||
|
|
||||||
|
.global _trampoline
|
||||||
|
.type _trampoline, @function
|
||||||
|
_trampoline:
|
||||||
|
// Jump to program start.
|
||||||
|
rjmp program_start
|
||||||
|
|
||||||
|
.org PROGRAM_START_OFFSET
|
||||||
|
program_start:
|
||||||
|
// Jump to the C runtime startup routine.
|
||||||
|
lda.w pc, _stext
|
||||||
|
|
||||||
|
|
||||||
|
//! \endverbatim
|
||||||
|
//! @}
|
|
@ -0,0 +1,237 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief AT32UC3A EVK1100 board header file.
|
||||||
|
*
|
||||||
|
* This file contains definitions and services related to the features of the
|
||||||
|
* EVK1100 board rev. B and C.
|
||||||
|
*
|
||||||
|
* To use this board, define BOARD=EVK1100.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 AT32UC3A devices can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARDUINO_H_
|
||||||
|
#define _ARDUINO_H_
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
|
#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling.
|
||||||
|
# include "led.h"
|
||||||
|
#endif // __AVR32_ABI_COMPILER__
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Oscillator Definitions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
// RCOsc has no custom calibration by default. Set the following definition to
|
||||||
|
// the appropriate value if a custom RCOsc calibration has been applied to your
|
||||||
|
// part.
|
||||||
|
//#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz.
|
||||||
|
|
||||||
|
#define FOSC32 32768 //!< Osc32 frequency: Hz.
|
||||||
|
#define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods.
|
||||||
|
|
||||||
|
#define FOSC0 12000000 //!< Osc0 frequency: Hz.
|
||||||
|
#define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods.
|
||||||
|
|
||||||
|
// Osc1 crystal is not mounted by default. Set the following definitions to the
|
||||||
|
// appropriate values if a custom Osc1 crystal is mounted on your board.
|
||||||
|
//#define FOSC1 12000000 //!< Osc1 frequency: Hz.
|
||||||
|
//#define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods.
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
//! Number of LEDs.
|
||||||
|
#define LED_COUNT 0
|
||||||
|
|
||||||
|
/*! \name GPIO Connections of LEDs
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define LED0_GPIO AVR32_PIN_PB19
|
||||||
|
#define LED1_GPIO AVR32_PIN_PB20
|
||||||
|
#define LED2_GPIO AVR32_PIN_PB21
|
||||||
|
#define DEB_PIN_GPIO AVR32_PIN_PA20
|
||||||
|
#define DEB2_PIN_GPIO AVR32_PIN_PB00
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name PWM Channels of LEDs
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define LED0_PWM 0
|
||||||
|
#define LED1_PWM 1
|
||||||
|
#define LED2_PWM 2
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name PWM Functions of LEDs
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define LED0_PWM_FUNCTION AVR32_PWM_0_FUNCTION
|
||||||
|
#define LED1_PWM_FUNCTION AVR32_PWM_1_FUNCTION
|
||||||
|
#define LED2_PWM_FUNCTION AVR32_PWM_2_FUNCTION
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name Color Identifiers of LEDs to Use with LED Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define LED_MONO0_GREEN LED0
|
||||||
|
#define LED_MONO1_RED LED1
|
||||||
|
#define LED_MONO2_BLU LED2
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/*! \name SPI Connections of the DIP204 LCD
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define DIP204_SPI (&AVR32_SPI1)
|
||||||
|
#define DIP204_SPI_NPCS 2
|
||||||
|
#define DIP204_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN
|
||||||
|
#define DIP204_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION
|
||||||
|
#define DIP204_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN
|
||||||
|
#define DIP204_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION
|
||||||
|
#define DIP204_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN
|
||||||
|
#define DIP204_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION
|
||||||
|
#define DIP204_SPI_NPCS_PIN AVR32_SPI1_NPCS_2_0_PIN
|
||||||
|
#define DIP204_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name GPIO and PWM Connections of the DIP204 LCD Backlight
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define DIP204_BACKLIGHT_PIN AVR32_PIN_PB18
|
||||||
|
#define DIP204_PWM_CHANNEL 6
|
||||||
|
#define DIP204_PWM_PIN AVR32_PWM_6_PIN
|
||||||
|
#define DIP204_PWM_FUNCTION AVR32_PWM_6_FUNCTION
|
||||||
|
//! @}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! \name SPI Connections of the AT45DBX Data Flash Memory
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_SPI (&AVR32_SPI1)
|
||||||
|
#define AT45DBX_SPI_NPCS 2
|
||||||
|
#define AT45DBX_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN
|
||||||
|
#define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION
|
||||||
|
#define AT45DBX_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN
|
||||||
|
#define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION
|
||||||
|
#define AT45DBX_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN
|
||||||
|
#define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION
|
||||||
|
#define AT45DBX_SPI_NPCS2_PIN AVR32_SPI1_NPCS_2_0_PIN
|
||||||
|
#define AT45DBX_SPI_NPCS2_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION
|
||||||
|
#define AT45DBX_CHIP_RESET AVR32_PIN_PA02
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name GPIO and SPI Connections of the SD/MMC Connector
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
//#define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02
|
||||||
|
//#define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA07
|
||||||
|
#define SD_MMC_SPI (&AVR32_SPI1)
|
||||||
|
#define SD_MMC_SPI_NPCS 1
|
||||||
|
#define SD_MMC_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN
|
||||||
|
#define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION
|
||||||
|
#define SD_MMC_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN
|
||||||
|
#define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION
|
||||||
|
#define SD_MMC_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN
|
||||||
|
#define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION
|
||||||
|
#define SD_MMC_SPI_NPCS_PIN AVR32_SPI1_NPCS_1_0_PIN
|
||||||
|
#define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_1_0_FUNCTION
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/* Timer Counter to generate clock for WiFi chip*/
|
||||||
|
# define WIFI_TC (&AVR32_TC)
|
||||||
|
# define WIFI_TC_CHANNEL_ID 0
|
||||||
|
# define WIFI_TC_CHANNEL_PIN AVR32_TC_A0_0_0_PIN
|
||||||
|
# define WIFI_TC_CHANNEL_FUNCTION AVR32_TC_A0_0_0_FUNCTION
|
||||||
|
// Note that TC_A0_0_0 pin is pin 6 (PB23) on AT32UC3A1512 QFP100.
|
||||||
|
|
||||||
|
/* Pin related to WiFi chip communication */
|
||||||
|
#ifndef USE_POLL
|
||||||
|
#define USE_POLL
|
||||||
|
#endif
|
||||||
|
#define SPI_CS 0
|
||||||
|
#define AVR32_SPI AVR32_SPI1
|
||||||
|
#define GPIO_IRQ_PIN AVR32_PIN_PA03
|
||||||
|
#define GPIO_IRQ AVR32_GPIO_IRQ_7
|
||||||
|
#define GPIO_W_RESET_PIN AVR32_PIN_PA07
|
||||||
|
#define GPIO_W_SHUTDOWN_PIN AVR32_PIN_PA09
|
||||||
|
|
||||||
|
/* Pin related to shield communication */
|
||||||
|
#define ARDUINO_HANDSHAKE_PIN AVR32_PIN_PA25
|
||||||
|
#define ARDUINO_EXTINT_PIN AVR32_PIN_PA04 //not used
|
||||||
|
|
||||||
|
#define AVR32_PDCA_PID_TX AVR32_PDCA_PID_SPI1_TX
|
||||||
|
#define AVR32_PDCA_PID_RX AVR32_PDCA_PID_SPI1_RX
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/*! \name TWI Connections of the Spare TWI Connector
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define SPARE_TWI (&AVR32_TWI)
|
||||||
|
#define SPARE_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN
|
||||||
|
#define SPARE_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION
|
||||||
|
#define SPARE_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN
|
||||||
|
#define SPARE_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name SPI Connections of the Spare SPI Connector
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define SPARE_SPI (&AVR32_SPI0)
|
||||||
|
#define SPARE_SPI_NPCS 0
|
||||||
|
#define SPARE_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN
|
||||||
|
#define SPARE_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION
|
||||||
|
#define SPARE_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN
|
||||||
|
#define SPARE_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION
|
||||||
|
#define SPARE_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN
|
||||||
|
#define SPARE_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION
|
||||||
|
#define SPARE_SPI_NPCS_PIN AVR32_SPI0_NPCS_0_0_PIN
|
||||||
|
#define SPARE_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION
|
||||||
|
//! @}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _ARDUINO_H_
|
|
@ -0,0 +1,346 @@
|
||||||
|
/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief AT32UC3A EVK1100 board LEDs support package.
|
||||||
|
*
|
||||||
|
* This file contains definitions and services related to the LED features of
|
||||||
|
* the EVK1100 board.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 AT32UC3A devices can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr32/io.h>
|
||||||
|
#include "preprocessor.h"
|
||||||
|
#include "compiler.h"
|
||||||
|
#include "arduino.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
|
||||||
|
//! Structure describing LED hardware connections.
|
||||||
|
typedef const struct
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
U32 PORT; //!< LED GPIO port.
|
||||||
|
U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port.
|
||||||
|
} GPIO; //!< LED GPIO descriptor.
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
S32 CHANNEL; //!< LED PWM channel (< 0 if N/A).
|
||||||
|
S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A).
|
||||||
|
} PWM; //!< LED PWM descriptor.
|
||||||
|
} tLED_DESCRIPTOR;
|
||||||
|
|
||||||
|
|
||||||
|
//! Hardware descriptors of all LEDs.
|
||||||
|
static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] =
|
||||||
|
{
|
||||||
|
#define INSERT_LED_DESCRIPTOR(LED_NO, unused) \
|
||||||
|
{ \
|
||||||
|
{LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\
|
||||||
|
{LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \
|
||||||
|
},
|
||||||
|
MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~)
|
||||||
|
#undef INSERT_LED_DESCRIPTOR
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//! Saved state of all LEDs.
|
||||||
|
static volatile U32 LED_State = (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
|
||||||
|
U32 LED_Read_Display(void)
|
||||||
|
{
|
||||||
|
return LED_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Display(U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
leds &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
LED_State = leds;
|
||||||
|
|
||||||
|
// For all LEDs...
|
||||||
|
for (led_descriptor = &LED_DESCRIPTOR[0];
|
||||||
|
led_descriptor < LED_DESCRIPTOR + LED_COUNT;
|
||||||
|
led_descriptor++)
|
||||||
|
{
|
||||||
|
// Set the LED to the requested state.
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
if (leds & 1)
|
||||||
|
{
|
||||||
|
led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U32 LED_Read_Display_Mask(U32 mask)
|
||||||
|
{
|
||||||
|
return Rd_bits(LED_State, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Display_Mask(U32 mask, U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
mask &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
Wr_bits(LED_State, mask, leds);
|
||||||
|
|
||||||
|
// While there are specified LEDs left to manage...
|
||||||
|
while (mask)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and set it to the requested state.
|
||||||
|
led_shift = 1 + ctz(mask);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
leds >>= led_shift - 1;
|
||||||
|
if (leds & 1)
|
||||||
|
{
|
||||||
|
led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= 1;
|
||||||
|
mask >>= led_shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool LED_Test(U32 leds)
|
||||||
|
{
|
||||||
|
return Tst_bits(LED_State, leds);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Off(U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
leds &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
Clr_bits(LED_State, leds);
|
||||||
|
|
||||||
|
// While there are specified LEDs left to manage...
|
||||||
|
while (leds)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and turn it off.
|
||||||
|
led_shift = 1 + ctz(leds);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= led_shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_On(U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
leds &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
Set_bits(LED_State, leds);
|
||||||
|
|
||||||
|
// While there are specified LEDs left to manage...
|
||||||
|
while (leds)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and turn it on.
|
||||||
|
led_shift = 1 + ctz(leds);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= led_shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Toggle(U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
leds &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
Tgl_bits(LED_State, leds);
|
||||||
|
|
||||||
|
// While there are specified LEDs left to manage...
|
||||||
|
while (leds)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and toggle it.
|
||||||
|
led_shift = 1 + ctz(leds);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= led_shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U32 LED_Read_Display_Field(U32 field)
|
||||||
|
{
|
||||||
|
return Rd_bitfield(LED_State, field);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Display_Field(U32 field, U32 leds)
|
||||||
|
{
|
||||||
|
// Move the bit-field to the appropriate position for the bit-mask.
|
||||||
|
LED_Display_Mask(field, leds << ctz(field));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U8 LED_Get_Intensity(U32 led)
|
||||||
|
{
|
||||||
|
tLED_DESCRIPTOR *led_descriptor;
|
||||||
|
|
||||||
|
// Check that the argument value is valid.
|
||||||
|
led = ctz(led);
|
||||||
|
led_descriptor = &LED_DESCRIPTOR[led];
|
||||||
|
if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0;
|
||||||
|
|
||||||
|
// Return the duty cycle value if the LED PWM channel is enabled, else 0.
|
||||||
|
return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ?
|
||||||
|
AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Set_Intensity(U32 leds, U8 intensity)
|
||||||
|
{
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_pwm_channel_t *led_pwm_channel;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// For each specified LED...
|
||||||
|
for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and check that it has a PWM channel.
|
||||||
|
led_shift = 1 + ctz(leds);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
if (led_descriptor->PWM.CHANNEL < 0) continue;
|
||||||
|
|
||||||
|
// Initialize or update the LED PWM channel.
|
||||||
|
led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL];
|
||||||
|
if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)))
|
||||||
|
{
|
||||||
|
led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) &
|
||||||
|
~(AVR32_PWM_CALG_MASK |
|
||||||
|
AVR32_PWM_CPOL_MASK |
|
||||||
|
AVR32_PWM_CPD_MASK);
|
||||||
|
led_pwm_channel->cprd = 0x000000FF;
|
||||||
|
led_pwm_channel->cdty = intensity;
|
||||||
|
AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AVR32_PWM.isr;
|
||||||
|
while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL)));
|
||||||
|
led_pwm_channel->cupd = intensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch the LED pin to its PWM function.
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
if (led_descriptor->PWM.FUNCTION & 0x1)
|
||||||
|
{
|
||||||
|
led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
if (led_descriptor->PWM.FUNCTION & 0x2)
|
||||||
|
{
|
||||||
|
led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,191 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief AT32UC3A EVK1100 board LEDs support package.
|
||||||
|
*
|
||||||
|
* This file contains definitions and services related to the LED features of
|
||||||
|
* the EVK1100 board.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 AT32UC3A devices can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LED_H_
|
||||||
|
#define _LED_H_
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Identifiers of LEDs to Use with LED Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define LED0 0x01
|
||||||
|
#define LED1 0x02
|
||||||
|
#define LED2 0x04
|
||||||
|
#define LED3 0x08
|
||||||
|
#define LED4 0x10
|
||||||
|
#define LED5 0x20
|
||||||
|
#define LED6 0x40
|
||||||
|
#define LED7 0x80
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Gets the last state of all LEDs set through the LED API.
|
||||||
|
*
|
||||||
|
* \return State of all LEDs (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern U32 LED_Read_Display(void);
|
||||||
|
|
||||||
|
/*! \brief Sets the state of all LEDs.
|
||||||
|
*
|
||||||
|
* \param leds New state of all LEDs (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of all LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Display(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Gets the last state of the specified LEDs set through the LED API.
|
||||||
|
*
|
||||||
|
* \param mask LEDs of which to get the state (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \return State of the specified LEDs (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern U32 LED_Read_Display_Mask(U32 mask);
|
||||||
|
|
||||||
|
/*! \brief Sets the state of the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param mask LEDs of which to set the state (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \param leds New state of the specified LEDs (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Display_Mask(U32 mask, U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Tests the last state of the specified LEDs set through the LED API.
|
||||||
|
*
|
||||||
|
* \param leds LEDs of which to test the state (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \return \c TRUE if at least one of the specified LEDs has a state on, else
|
||||||
|
* \c FALSE.
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern Bool LED_Test(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Turns off the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param leds LEDs to turn off (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Off(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Turns on the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param leds LEDs to turn on (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_On(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Toggles the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param leds LEDs to toggle (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Toggle(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Gets as a bit-field the last state of the specified LEDs set through
|
||||||
|
* the LED API.
|
||||||
|
*
|
||||||
|
* \param field LEDs of which to get the state (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \return State of the specified LEDs (1 bit per LED, beginning with the first
|
||||||
|
* specified LED).
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern U32 LED_Read_Display_Field(U32 field);
|
||||||
|
|
||||||
|
/*! \brief Sets as a bit-field the state of the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param field LEDs of which to set the state (1 bit per LED).
|
||||||
|
* \param leds New state of the specified LEDs (1 bit per LED, beginning with
|
||||||
|
* the first specified LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Display_Field(U32 field, U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Gets the intensity of the specified LED.
|
||||||
|
*
|
||||||
|
* \param led LED of which to get the intensity (1 bit per LED; only the least
|
||||||
|
* significant set bit is used).
|
||||||
|
*
|
||||||
|
* \return Intensity of the specified LED (0x00 to 0xFF).
|
||||||
|
*
|
||||||
|
* \warning The PWM channel of the specified LED is supposed to be used only by
|
||||||
|
* this module.
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern U8 LED_Get_Intensity(U32 led);
|
||||||
|
|
||||||
|
/*! \brief Sets the intensity of the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param leds LEDs of which to set the intensity (1 bit per LED).
|
||||||
|
* \param intensity New intensity of the specified LEDs (0x00 to 0xFF).
|
||||||
|
*
|
||||||
|
* \warning The PWM channels of the specified LEDs are supposed to be used only
|
||||||
|
* by this module.
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to PWM output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Set_Intensity(U32 leds, U8 intensity);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _LED_H_
|
|
@ -0,0 +1,433 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief AT32UC3A EVK1105 board header file.
|
||||||
|
*
|
||||||
|
* This file contains definitions and services related to the features of the
|
||||||
|
* EVK1105 board rev. B.
|
||||||
|
*
|
||||||
|
* To use this board, define BOARD=EVK1105.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 AT32UC3A devices can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _EVK1105_H_
|
||||||
|
#define _EVK1105_H_
|
||||||
|
|
||||||
|
#ifdef EVK1105_REV3
|
||||||
|
# include "evk1105_rev3.h"
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
|
#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling.
|
||||||
|
# include "led.h"
|
||||||
|
#endif // __AVR32_ABI_COMPILER__
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Oscillator Definitions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
// RCOsc has no custom calibration by default. Set the following definition to
|
||||||
|
// the appropriate value if a custom RCOsc calibration has been applied to your
|
||||||
|
// part.
|
||||||
|
//#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz.
|
||||||
|
|
||||||
|
#define FOSC32 32768 //!< Osc32 frequency: Hz.
|
||||||
|
#define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods.
|
||||||
|
|
||||||
|
#define FOSC0 12000000 //!< Osc0 frequency: Hz.
|
||||||
|
#define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods.
|
||||||
|
|
||||||
|
#define FOSC1 11289600 //!< Osc1 frequency: Hz
|
||||||
|
#define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods.
|
||||||
|
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name SDRAM Definitions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
//! Part header file of used SDRAM(s).
|
||||||
|
#define SDRAM_PART_HDR "MT48LC16M16A2TG7E/mt48lc16m16a2tg7e.h"
|
||||||
|
|
||||||
|
//! Data bus width to use the SDRAM(s) with (16 or 32 bits; always 16 bits on
|
||||||
|
//! UC3).
|
||||||
|
#define SDRAM_DBW 16
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name USB Definitions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
//! Multiplexed pin used for USB_ID: AVR32_USBB_USB_ID_x_x.
|
||||||
|
//! To be selected according to the AVR32_USBB_USB_ID_x_x_PIN and
|
||||||
|
//! AVR32_USBB_USB_ID_x_x_FUNCTION definitions from <avr32/uc3axxxx.h>.
|
||||||
|
#define AVR32_USBB_USB_ID_0_2_PIN 21
|
||||||
|
#define AVR32_USBB_USB_ID_0_2_FUNCTION 2
|
||||||
|
#define USB_ID AVR32_USBB_USB_ID_0_2
|
||||||
|
|
||||||
|
//! Multiplexed pin used for USB_VBOF: AVR32_USBB_USB_VBOF_x_x.
|
||||||
|
//! To be selected according to the AVR32_USBB_USB_VBOF_x_x_PIN and
|
||||||
|
//! AVR32_USBB_USB_VBOF_x_x_FUNCTION definitions from <avr32/uc3axxxx.h>.
|
||||||
|
# define USB_VBOF AVR32_USBB_USB_VBOF_0_1
|
||||||
|
|
||||||
|
|
||||||
|
//! Active level of the USB_VBOF output pin.
|
||||||
|
# define USB_VBOF_ACTIVE_LEVEL LOW
|
||||||
|
|
||||||
|
//! USB overcurrent detection pin.
|
||||||
|
# define USB_OVERCURRENT_DETECT_PIN AVR32_PIN_PX15
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
//! GPIO connection of the MAC PHY PWR_DOWN/INT signal.
|
||||||
|
# define MACB_INTERRUPT_PIN AVR32_PIN_PA26
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//! Number of LEDs.
|
||||||
|
#define LED_COUNT 4
|
||||||
|
|
||||||
|
/*! \name GPIO Connections of LEDs
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
# define LED0_GPIO AVR32_PIN_PB27
|
||||||
|
# define LED1_GPIO AVR32_PIN_PB28
|
||||||
|
# define LED2_GPIO AVR32_PIN_PA05
|
||||||
|
# define LED3_GPIO AVR32_PIN_PA06
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name Color Identifiers of LEDs to Use with LED Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define LED_MONO0_GREEN LED0
|
||||||
|
#define LED_MONO1_GREEN LED1
|
||||||
|
#define LED_MONO2_GREEN LED2
|
||||||
|
#define LED_MONO3_GREEN LED3
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name PWM Channels of LEDs
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define LED0_PWM 4
|
||||||
|
#define LED1_PWM 5
|
||||||
|
#define LED2_PWM (-1)
|
||||||
|
#define LED3_PWM (-1)
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name PWM Functions of LEDs
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
/* TODO: Implement PWM functionality */
|
||||||
|
#define LED0_PWM_FUNCTION (-1)//AVR32_PWM_0_FUNCTION
|
||||||
|
#define LED1_PWM_FUNCTION (-1)//AVR32_PWM_1_FUNCTION
|
||||||
|
#define LED2_PWM_FUNCTION (-1)
|
||||||
|
#define LED3_PWM_FUNCTION (-1)
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
//! External interrupt connection of touch sensor.
|
||||||
|
#define QT1081_EIC_EXTINT_PIN AVR32_EIC_EXTINT_1_PIN
|
||||||
|
#define QT1081_EIC_EXTINT_FUNCTION AVR32_EIC_EXTINT_1_FUNCTION
|
||||||
|
#define QT1081_EIC_EXTINT_IRQ AVR32_EIC_IRQ_1
|
||||||
|
#define QT1081_EIC_EXTINT_INT AVR32_EIC_INT1
|
||||||
|
/*! \name Touch sensor low power mode select
|
||||||
|
*/
|
||||||
|
#define QT1081_LP_MODE AVR32_PIN_PB29
|
||||||
|
|
||||||
|
/*! \name GPIO Connections of touch buttons
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define QT1081_TOUCH_SENSOR_0 AVR32_PIN_PB22
|
||||||
|
#define QT1081_TOUCH_SENSOR_0_PRESSED 1
|
||||||
|
#define QT1081_TOUCH_SENSOR_1 AVR32_PIN_PB23
|
||||||
|
#define QT1081_TOUCH_SENSOR_1_PRESSED 1
|
||||||
|
#define QT1081_TOUCH_SENSOR_2 AVR32_PIN_PB24
|
||||||
|
#define QT1081_TOUCH_SENSOR_2_PRESSED 1
|
||||||
|
#define QT1081_TOUCH_SENSOR_3 AVR32_PIN_PB25
|
||||||
|
#define QT1081_TOUCH_SENSOR_3_PRESSED 1
|
||||||
|
#define QT1081_TOUCH_SENSOR_4 AVR32_PIN_PB26
|
||||||
|
#define QT1081_TOUCH_SENSOR_4_PRESSED 1
|
||||||
|
|
||||||
|
#define QT1081_TOUCH_SENSOR_ENTER QT1081_TOUCH_SENSOR_4
|
||||||
|
#define QT1081_TOUCH_SENSOR_ENTER_PRESSED QT1081_TOUCH_SENSOR_4_PRESSED
|
||||||
|
#define QT1081_TOUCH_SENSOR_LEFT QT1081_TOUCH_SENSOR_3
|
||||||
|
#define QT1081_TOUCH_SENSOR_LEFT_PRESSED QT1081_TOUCH_SENSOR_3_PRESSED
|
||||||
|
#define QT1081_TOUCH_SENSOR_RIGHT QT1081_TOUCH_SENSOR_2
|
||||||
|
#define QT1081_TOUCH_SENSOR_RIGHT_PRESSED QT1081_TOUCH_SENSOR_2_PRESSED
|
||||||
|
#define QT1081_TOUCH_SENSOR_UP QT1081_TOUCH_SENSOR_0
|
||||||
|
#define QT1081_TOUCH_SENSOR_UP_PRESSED QT1081_TOUCH_SENSOR_0_PRESSED
|
||||||
|
#define QT1081_TOUCH_SENSOR_DOWN QT1081_TOUCH_SENSOR_1
|
||||||
|
#define QT1081_TOUCH_SENSOR_DOWN_PRESSED QT1081_TOUCH_SENSOR_1_PRESSED
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name SPI Connections of the AT45DBX Data Flash Memory
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_SPI (&AVR32_SPI0)
|
||||||
|
#define AT45DBX_SPI_NPCS 0
|
||||||
|
#define AT45DBX_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN
|
||||||
|
#define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION
|
||||||
|
#define AT45DBX_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN
|
||||||
|
#define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION
|
||||||
|
#define AT45DBX_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN
|
||||||
|
#define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION
|
||||||
|
#define AT45DBX_SPI_NPCS0_PIN AVR32_SPI0_NPCS_0_0_PIN
|
||||||
|
#define AT45DBX_SPI_NPCS0_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name GPIO and SPI Connections of the SD/MMC Connector
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02
|
||||||
|
#define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA18
|
||||||
|
#define SD_MMC_SPI (&AVR32_SPI0)
|
||||||
|
#define SD_MMC_SPI_NPCS 1
|
||||||
|
#define SD_MMC_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN
|
||||||
|
#define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION
|
||||||
|
#define SD_MMC_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN
|
||||||
|
#define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION
|
||||||
|
#define SD_MMC_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN
|
||||||
|
#define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION
|
||||||
|
#define SD_MMC_SPI_NPCS_PIN AVR32_SPI0_NPCS_1_0_PIN
|
||||||
|
#define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_1_0_FUNCTION
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name TWI expansion
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define EXPANSION_TWI (&AVR32_TWI)
|
||||||
|
#define EXPANSION_RESET AVR32_PIN_PX16
|
||||||
|
#define EXPANSION_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN
|
||||||
|
#define EXPANSION_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION
|
||||||
|
#define EXPANSION_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN
|
||||||
|
#define EXPANSION_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name Wireless expansion
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WEXPANSION_EXTINT_PIN AVR32_EIC_EXTINT_8_PIN
|
||||||
|
#define WEXPANSION_EXTINT_FUNCTION AVR32_EIC_EXTINT_8_FUNCTION
|
||||||
|
#define WEXPANSION_GPIO1 AVR32_PIN_PB30
|
||||||
|
#define WEXPANSION_GPIO2 AVR32_PIN_PB31
|
||||||
|
|
||||||
|
#define WEXPANSION_SPI (&AVR32_SPI0)
|
||||||
|
#define WEXPANSION_SPI_NPCS 2
|
||||||
|
#define WEXPANSION_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN
|
||||||
|
#define WEXPANSION_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION
|
||||||
|
#define WEXPANSION_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN
|
||||||
|
#define WEXPANSION_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION
|
||||||
|
#define WEXPANSION_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN
|
||||||
|
#define WEXPANSION_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION
|
||||||
|
#define WEXPANSION_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN
|
||||||
|
#define WEXPANSION_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name ET024006DHU TFT display
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
#define ET024006DHU_TE_PIN AVR32_PIN_PX19
|
||||||
|
#define ET024006DHU_RESET_PIN AVR32_PIN_PX22
|
||||||
|
#define ET024006DHU_BL_PIN AVR32_PWM_6_PIN
|
||||||
|
#define ET024006DHU_BL_FUNCTION AVR32_PWM_6_FUNCTION
|
||||||
|
#define ET024006DHU_DNC_PIN AVR32_EBI_ADDR_21_1_PIN
|
||||||
|
#define ET024006DHU_DNC_FUNCTION AVR32_EBI_ADDR_21_1_FUNCTION
|
||||||
|
#define ET024006DHU_EBI_NCS_PIN AVR32_EBI_NCS_0_1_PIN
|
||||||
|
#define ET024006DHU_EBI_NCS_FUNCTION AVR32_EBI_NCS_0_1_FUNCTION
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
/*! \name Optional SPI connection to the TFT
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
#define ET024006DHU_SPI (&AVR32_SPI0)
|
||||||
|
#define ET024006DHU_SPI_NPCS 3
|
||||||
|
#define ET024006DHU_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN
|
||||||
|
#define ET024006DHU_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION
|
||||||
|
#define ET024006DHU_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN
|
||||||
|
#define ET024006DHU_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION
|
||||||
|
#define ET024006DHU_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN
|
||||||
|
#define ET024006DHU_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION
|
||||||
|
#define ET024006DHU_SPI_NPCS_PIN AVR32_SPI1_NPCS_3_0_PIN
|
||||||
|
#define ET024006DHU_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_3_0_FUNCTION
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Audio amplifier connection to the DAC
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
#define TPA6130_ABDAC (&AVR32_ABDAC)
|
||||||
|
|
||||||
|
#define TPA6130_DATA0_PIN AVR32_ABDAC_DATA_0_1_PIN
|
||||||
|
#define TPA6130_DATA0_FUNCTION AVR32_ABDAC_DATA_0_1_FUNCTION
|
||||||
|
#define TPA6130_DATAN0_PIN AVR32_ABDAC_DATAN_0_1_PIN
|
||||||
|
#define TPA6130_DATAN0_FUNCTION AVR32_ABDAC_DATAN_0_1_FUNCTION
|
||||||
|
#define TPA6130_DATA1_PIN AVR32_ABDAC_DATA_1_1_PIN
|
||||||
|
#define TPA6130_DATA1_FUNCTION AVR32_ABDAC_DATA_1_1_FUNCTION
|
||||||
|
#define TPA6130_DATAN1_PIN AVR32_ABDAC_DATAN_1_1_PIN
|
||||||
|
#define TPA6130_DATAN1_FUNCTION AVR32_ABDAC_DATAN_1_1_FUNCTION
|
||||||
|
|
||||||
|
#define TPA6130_ABDAC_PDCA_PID AVR32_PDCA_PID_ABDAC_TX
|
||||||
|
#define TPA6130_ABDAC_PDCA_CHANNEL 0
|
||||||
|
#define TPA6130_ABDAC_PDCA_IRQ AVR32_PDCA_IRQ_0
|
||||||
|
#define TPA6130_ABDAC_PDCA_INT_LEVEL AVR32_INTC_INT3
|
||||||
|
|
||||||
|
#define TPA6130_TWI (&AVR32_TWI)
|
||||||
|
#define TPA6130_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN
|
||||||
|
#define TPA6130_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION
|
||||||
|
#define TPA6130_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN
|
||||||
|
#define TPA6130_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION
|
||||||
|
|
||||||
|
//! }@
|
||||||
|
/*! \name TI TLV320AIC23B sound chip
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define TLV320_SSC (&AVR32_SSC)
|
||||||
|
#define TLV320_SSC_TX_CLOCK_PIN AVR32_SSC_TX_CLOCK_0_PIN
|
||||||
|
#define TLV320_SSC_TX_CLOCK_FUNCTION AVR32_SSC_TX_CLOCK_0_FUNCTION
|
||||||
|
#define TLV320_SSC_TX_DATA_PIN AVR32_SSC_TX_DATA_0_PIN
|
||||||
|
#define TLV320_SSC_TX_DATA_FUNCTION AVR32_SSC_TX_DATA_0_FUNCTION
|
||||||
|
#define TLV320_SSC_TX_FRAME_SYNC_PIN AVR32_SSC_TX_FRAME_SYNC_0_PIN
|
||||||
|
#define TLV320_SSC_TX_FRAME_SYNC_FUNCTION AVR32_SSC_TX_FRAME_SYNC_0_FUNCTION
|
||||||
|
|
||||||
|
#define TLV320_TWI (&AVR32_TWI)
|
||||||
|
#define TLV320_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN
|
||||||
|
#define TLV320_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION
|
||||||
|
#define TLV320_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN
|
||||||
|
#define TLV320_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION
|
||||||
|
|
||||||
|
#define TLV320_PM_GCLK_PIN AVR32_PM_GCLK_0_0_PIN
|
||||||
|
#define TLV320_PM_GCLK_FUNCTION AVR32_PM_GCLK_0_0_FUNCTION
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
////! \name SPI: Apple Authentication Chip Hardware Connections
|
||||||
|
////! @{
|
||||||
|
#define IPOD_AUTH_CHIP_SPI (&AVR32_SPI0)
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_IRQ AVR32_SPI0_IRQ
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_NPCS 2
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_N_RESET_PIN AVR32_PIN_PB30
|
||||||
|
#define IPOD_AUTH_CHIP_SPI_CP_READY_PIN AVR32_PIN_PB31
|
||||||
|
//! }@
|
||||||
|
|
||||||
|
/*! \name Connections of the iPOD Authentication Coprocessor
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
#define IPOD_AUTH_CHIP_TWI (&AVR32_TWI)
|
||||||
|
#define IPOD_AUTH_CHIP_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN
|
||||||
|
#define IPOD_AUTH_CHIP_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION
|
||||||
|
#define IPOD_AUTH_CHIP_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN
|
||||||
|
#define IPOD_AUTH_CHIP_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION
|
||||||
|
#define IPOD_AUTH_CHIP_TWI_N_RESET_PIN AVR32_PIN_PX16
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name USART connection to the UC3B board controller
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
#define USART0_RXD_PIN AVR32_USART0_RXD_0_0_PIN
|
||||||
|
#define USART0_RXD_FUNCTION AVR32_USART0_RXD_0_0_FUNCTION
|
||||||
|
#define USART0_TXD_PIN AVR32_USART0_TXD_0_0_PIN
|
||||||
|
#define USART0_TXD_FUNCTION AVR32_USART0_TXD_0_0_FUNCTION
|
||||||
|
#define USART0_RTS_PIN AVR32_USART0_RTS_0_0_PIN
|
||||||
|
#define USART0_RTS_FUNCTION AVR32_USART0_RTS_0_0_FUNCTION
|
||||||
|
#define USART0_CTS_PIN AVR32_USART0_CTS_0_0_PIN
|
||||||
|
#define USART0_CTS_FUNCTION AVR32_USART0_CTS_0_0_FUNCTION
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#define ADC_VEXT_PIN AVR32_ADC_AD_7_PIN
|
||||||
|
#define ADC_VEXT_FUNCTION AVR32_ADC_AD_7_FUNCTION
|
||||||
|
|
||||||
|
/*! \name LCD Connections of the ET024006DHU display
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define ET024006DHU_SMC_USE_NCS 0
|
||||||
|
#define ET024006DHU_SMC_COMPONENT_CS "smc_et024006dhu.h"
|
||||||
|
|
||||||
|
#define ET024006DHU_EBI_DATA_0 AVR32_EBI_DATA_0
|
||||||
|
#define ET024006DHU_EBI_DATA_1 AVR32_EBI_DATA_1
|
||||||
|
#define ET024006DHU_EBI_DATA_2 AVR32_EBI_DATA_2
|
||||||
|
#define ET024006DHU_EBI_DATA_3 AVR32_EBI_DATA_3
|
||||||
|
#define ET024006DHU_EBI_DATA_4 AVR32_EBI_DATA_4
|
||||||
|
#define ET024006DHU_EBI_DATA_5 AVR32_EBI_DATA_5
|
||||||
|
#define ET024006DHU_EBI_DATA_6 AVR32_EBI_DATA_6
|
||||||
|
#define ET024006DHU_EBI_DATA_7 AVR32_EBI_DATA_7
|
||||||
|
#define ET024006DHU_EBI_DATA_8 AVR32_EBI_DATA_8
|
||||||
|
#define ET024006DHU_EBI_DATA_9 AVR32_EBI_DATA_9
|
||||||
|
#define ET024006DHU_EBI_DATA_10 AVR32_EBI_DATA_10
|
||||||
|
#define ET024006DHU_EBI_DATA_11 AVR32_EBI_DATA_11
|
||||||
|
#define ET024006DHU_EBI_DATA_12 AVR32_EBI_DATA_12
|
||||||
|
#define ET024006DHU_EBI_DATA_13 AVR32_EBI_DATA_13
|
||||||
|
#define ET024006DHU_EBI_DATA_14 AVR32_EBI_DATA_14
|
||||||
|
#define ET024006DHU_EBI_DATA_15 AVR32_EBI_DATA_15
|
||||||
|
|
||||||
|
#define ET024006DHU_EBI_ADDR_21 AVR32_EBI_ADDR_21_1
|
||||||
|
|
||||||
|
#define ET024006DHU_EBI_NWE AVR32_EBI_NWE0_0
|
||||||
|
#define ET024006DHU_EBI_NRD AVR32_EBI_NRD_0
|
||||||
|
#define ET024006DHU_EBI_NCS AVR32_EBI_NCS_0_1
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // !EVK1105_REVA
|
||||||
|
|
||||||
|
#endif // _EVK1105_H_
|
|
@ -0,0 +1,346 @@
|
||||||
|
/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief AT32UC3A EVK1105 board LEDs support package.
|
||||||
|
*
|
||||||
|
* This file contains definitions and services related to the LED features of
|
||||||
|
* the EVK1105 board.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 AT32UC3A devices can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr32/io.h>
|
||||||
|
#include "preprocessor.h"
|
||||||
|
#include "compiler.h"
|
||||||
|
#include "evk1105.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
|
||||||
|
//! Structure describing LED hardware connections.
|
||||||
|
typedef const struct
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
U32 PORT; //!< LED GPIO port.
|
||||||
|
U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port.
|
||||||
|
} GPIO; //!< LED GPIO descriptor.
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
S32 CHANNEL; //!< LED PWM channel (< 0 if N/A).
|
||||||
|
S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A).
|
||||||
|
} PWM; //!< LED PWM descriptor.
|
||||||
|
} tLED_DESCRIPTOR;
|
||||||
|
|
||||||
|
|
||||||
|
//! Hardware descriptors of all LEDs.
|
||||||
|
static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] =
|
||||||
|
{
|
||||||
|
#define INSERT_LED_DESCRIPTOR(LED_NO, unused) \
|
||||||
|
{ \
|
||||||
|
{LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\
|
||||||
|
{LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \
|
||||||
|
},
|
||||||
|
MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~)
|
||||||
|
#undef INSERT_LED_DESCRIPTOR
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//! Saved state of all LEDs.
|
||||||
|
static volatile U32 LED_State = (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
|
||||||
|
U32 LED_Read_Display(void)
|
||||||
|
{
|
||||||
|
return LED_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Display(U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
leds &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
LED_State = leds;
|
||||||
|
|
||||||
|
// For all LEDs...
|
||||||
|
for (led_descriptor = &LED_DESCRIPTOR[0];
|
||||||
|
led_descriptor < LED_DESCRIPTOR + LED_COUNT;
|
||||||
|
led_descriptor++)
|
||||||
|
{
|
||||||
|
// Set the LED to the requested state.
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
if (leds & 1)
|
||||||
|
{
|
||||||
|
led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U32 LED_Read_Display_Mask(U32 mask)
|
||||||
|
{
|
||||||
|
return Rd_bits(LED_State, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Display_Mask(U32 mask, U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
mask &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
Wr_bits(LED_State, mask, leds);
|
||||||
|
|
||||||
|
// While there are specified LEDs left to manage...
|
||||||
|
while (mask)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and set it to the requested state.
|
||||||
|
led_shift = 1 + ctz(mask);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
leds >>= led_shift - 1;
|
||||||
|
if (leds & 1)
|
||||||
|
{
|
||||||
|
led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= 1;
|
||||||
|
mask >>= led_shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool LED_Test(U32 leds)
|
||||||
|
{
|
||||||
|
return Tst_bits(LED_State, leds);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Off(U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
leds &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
Clr_bits(LED_State, leds);
|
||||||
|
|
||||||
|
// While there are specified LEDs left to manage...
|
||||||
|
while (leds)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and turn it off.
|
||||||
|
led_shift = 1 + ctz(leds);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= led_shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_On(U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
leds &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
Set_bits(LED_State, leds);
|
||||||
|
|
||||||
|
// While there are specified LEDs left to manage...
|
||||||
|
while (leds)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and turn it on.
|
||||||
|
led_shift = 1 + ctz(leds);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= led_shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Toggle(U32 leds)
|
||||||
|
{
|
||||||
|
// Use the LED descriptors to get the connections of a given LED to the MCU.
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// Make sure only existing LEDs are specified.
|
||||||
|
leds &= (1 << LED_COUNT) - 1;
|
||||||
|
|
||||||
|
// Update the saved state of all LEDs with the requested changes.
|
||||||
|
Tgl_bits(LED_State, leds);
|
||||||
|
|
||||||
|
// While there are specified LEDs left to manage...
|
||||||
|
while (leds)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and toggle it.
|
||||||
|
led_shift = 1 + ctz(leds);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
leds >>= led_shift;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U32 LED_Read_Display_Field(U32 field)
|
||||||
|
{
|
||||||
|
return Rd_bitfield(LED_State, field);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Display_Field(U32 field, U32 leds)
|
||||||
|
{
|
||||||
|
// Move the bit-field to the appropriate position for the bit-mask.
|
||||||
|
LED_Display_Mask(field, leds << ctz(field));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U8 LED_Get_Intensity(U32 led)
|
||||||
|
{
|
||||||
|
tLED_DESCRIPTOR *led_descriptor;
|
||||||
|
|
||||||
|
// Check that the argument value is valid.
|
||||||
|
led = ctz(led);
|
||||||
|
led_descriptor = &LED_DESCRIPTOR[led];
|
||||||
|
if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0;
|
||||||
|
|
||||||
|
// Return the duty cycle value if the LED PWM channel is enabled, else 0.
|
||||||
|
return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ?
|
||||||
|
AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_Set_Intensity(U32 leds, U8 intensity)
|
||||||
|
{
|
||||||
|
tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1;
|
||||||
|
volatile avr32_pwm_channel_t *led_pwm_channel;
|
||||||
|
volatile avr32_gpio_port_t *led_gpio_port;
|
||||||
|
U8 led_shift;
|
||||||
|
|
||||||
|
// For each specified LED...
|
||||||
|
for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift)
|
||||||
|
{
|
||||||
|
// Select the next specified LED and check that it has a PWM channel.
|
||||||
|
led_shift = 1 + ctz(leds);
|
||||||
|
led_descriptor += led_shift;
|
||||||
|
if (led_descriptor->PWM.CHANNEL < 0) continue;
|
||||||
|
|
||||||
|
// Initialize or update the LED PWM channel.
|
||||||
|
led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL];
|
||||||
|
if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)))
|
||||||
|
{
|
||||||
|
led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) &
|
||||||
|
~(AVR32_PWM_CALG_MASK |
|
||||||
|
AVR32_PWM_CPOL_MASK |
|
||||||
|
AVR32_PWM_CPD_MASK);
|
||||||
|
led_pwm_channel->cprd = 0x000000FF;
|
||||||
|
led_pwm_channel->cdty = intensity;
|
||||||
|
AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AVR32_PWM.isr;
|
||||||
|
while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL)));
|
||||||
|
led_pwm_channel->cupd = intensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch the LED pin to its PWM function.
|
||||||
|
led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT];
|
||||||
|
if (led_descriptor->PWM.FUNCTION & 0x1)
|
||||||
|
{
|
||||||
|
led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
if (led_descriptor->PWM.FUNCTION & 0x2)
|
||||||
|
{
|
||||||
|
led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,187 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief AT32UC3A EVK1105 board LEDs support package.
|
||||||
|
*
|
||||||
|
* This file contains definitions and services related to the LED features of
|
||||||
|
* the EVK1105 board.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 AT32UC3A devices can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LED_H_
|
||||||
|
#define _LED_H_
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Identifiers of LEDs to Use with LED Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define LED0 0x01
|
||||||
|
#define LED1 0x02
|
||||||
|
#define LED2 0x04
|
||||||
|
#define LED3 0x08
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Gets the last state of all LEDs set through the LED API.
|
||||||
|
*
|
||||||
|
* \return State of all LEDs (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern U32 LED_Read_Display(void);
|
||||||
|
|
||||||
|
/*! \brief Sets the state of all LEDs.
|
||||||
|
*
|
||||||
|
* \param leds New state of all LEDs (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of all LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Display(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Gets the last state of the specified LEDs set through the LED API.
|
||||||
|
*
|
||||||
|
* \param mask LEDs of which to get the state (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \return State of the specified LEDs (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern U32 LED_Read_Display_Mask(U32 mask);
|
||||||
|
|
||||||
|
/*! \brief Sets the state of the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param mask LEDs of which to set the state (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \param leds New state of the specified LEDs (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Display_Mask(U32 mask, U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Tests the last state of the specified LEDs set through the LED API.
|
||||||
|
*
|
||||||
|
* \param leds LEDs of which to test the state (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \return \c TRUE if at least one of the specified LEDs has a state on, else
|
||||||
|
* \c FALSE.
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern Bool LED_Test(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Turns off the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param leds LEDs to turn off (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Off(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Turns on the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param leds LEDs to turn on (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_On(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Toggles the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param leds LEDs to toggle (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Toggle(U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Gets as a bit-field the last state of the specified LEDs set through
|
||||||
|
* the LED API.
|
||||||
|
*
|
||||||
|
* \param field LEDs of which to get the state (1 bit per LED).
|
||||||
|
*
|
||||||
|
* \return State of the specified LEDs (1 bit per LED, beginning with the first
|
||||||
|
* specified LED).
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern U32 LED_Read_Display_Field(U32 field);
|
||||||
|
|
||||||
|
/*! \brief Sets as a bit-field the state of the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param field LEDs of which to set the state (1 bit per LED).
|
||||||
|
* \param leds New state of the specified LEDs (1 bit per LED, beginning with
|
||||||
|
* the first specified LED).
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to GPIO output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Display_Field(U32 field, U32 leds);
|
||||||
|
|
||||||
|
/*! \brief Gets the intensity of the specified LED.
|
||||||
|
*
|
||||||
|
* \param led LED of which to get the intensity (1 bit per LED; only the least
|
||||||
|
* significant set bit is used).
|
||||||
|
*
|
||||||
|
* \return Intensity of the specified LED (0x00 to 0xFF).
|
||||||
|
*
|
||||||
|
* \warning The PWM channel of the specified LED is supposed to be used only by
|
||||||
|
* this module.
|
||||||
|
*
|
||||||
|
* \note The GPIO pin configuration of all LEDs is left unchanged.
|
||||||
|
*/
|
||||||
|
extern U8 LED_Get_Intensity(U32 led);
|
||||||
|
|
||||||
|
/*! \brief Sets the intensity of the specified LEDs.
|
||||||
|
*
|
||||||
|
* \param leds LEDs of which to set the intensity (1 bit per LED).
|
||||||
|
* \param intensity New intensity of the specified LEDs (0x00 to 0xFF).
|
||||||
|
*
|
||||||
|
* \warning The PWM channels of the specified LEDs are supposed to be used only
|
||||||
|
* by this module.
|
||||||
|
*
|
||||||
|
* \note The pins of the specified LEDs are set to PWM output mode.
|
||||||
|
*/
|
||||||
|
extern void LED_Set_Intensity(U32 leds, U8 intensity);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _LED_H_
|
120
firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h
Executable file
120
firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h
Executable file
|
@ -0,0 +1,120 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief Standard board header file.
|
||||||
|
*
|
||||||
|
* This file includes the appropriate board header file according to the
|
||||||
|
* defined board.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BOARD_H_
|
||||||
|
#define _BOARD_H_
|
||||||
|
|
||||||
|
#include <avr32/io.h>
|
||||||
|
|
||||||
|
/*! \name Base Boards
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define EVK1100 1 //!< AT32UC3A EVK1100 board.
|
||||||
|
#define EVK1101 2 //!< AT32UC3B EVK1101 board.
|
||||||
|
#define UC3C_EK 3 //!< AT32UC3C UC3C_EK board.
|
||||||
|
#define EVK1104 4 //!< AT32UC3A3 EVK1104 board.
|
||||||
|
#define EVK1105 5 //!< AT32UC3A EVK1105 board.
|
||||||
|
#define STK1000 6 //!< AT32AP7000 STK1000 board.
|
||||||
|
#define NGW100 7 //!< AT32AP7000 NGW100 board.
|
||||||
|
#define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board.
|
||||||
|
#define UC3L_EK 9 //!< AT32UC3L-EK board.
|
||||||
|
#define USER_BOARD 99 //!< User-reserved board (if any).
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name Extension Boards
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define EXT1102 1 //!< AT32UC3B EXT1102 board.
|
||||||
|
#define MC300 2 //!< AT32UC3 MC300 board.
|
||||||
|
#define USER_EXT_BOARD 99 //!< User-reserved extension board (if any).
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#if BOARD == EVK1100
|
||||||
|
#include "EVK1100/evk1100.h"
|
||||||
|
#elif BOARD == EVK1101
|
||||||
|
#include "EVK1101/evk1101.h"
|
||||||
|
#elif BOARD == UC3C_EK
|
||||||
|
#include "UC3C_EK/uc3c_ek.h"
|
||||||
|
#elif BOARD == EVK1104
|
||||||
|
#include "EVK1104/evk1104.h"
|
||||||
|
#elif BOARD == EVK1105
|
||||||
|
#include "EVK1105/evk1105.h"
|
||||||
|
#elif BOARD == STK1000
|
||||||
|
#include "STK1000/stk1000.h"
|
||||||
|
#elif BOARD == NGW100
|
||||||
|
#include "NGW100/ngw100.h"
|
||||||
|
#elif BOARD == STK600_RCUC3L0
|
||||||
|
#include "STK600/RCUC3L0/stk600_rcuc3l0.h"
|
||||||
|
#elif BOARD == UC3L_EK
|
||||||
|
#include "UC3L_EK/uc3l_ek.h"
|
||||||
|
#elif BOARD == ARDUINO
|
||||||
|
#include "ARDUINO/arduino.h"
|
||||||
|
#else
|
||||||
|
#error No known AVR32 board defined
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined EXT_BOARD)
|
||||||
|
#if EXT_BOARD == EXT1102
|
||||||
|
#include "EXT1102/ext1102.h"
|
||||||
|
#elif EXT_BOARD == MC300
|
||||||
|
#include "MC300/mc300.h"
|
||||||
|
#elif EXT_BOARD == USER_EXT_BOARD
|
||||||
|
// User-reserved area: #include the header file of your extension board here
|
||||||
|
// (if any).
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef FRCOSC
|
||||||
|
#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _BOARD_H_
|
120
firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.my
Executable file
120
firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.my
Executable file
|
@ -0,0 +1,120 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief Standard board header file.
|
||||||
|
*
|
||||||
|
* This file includes the appropriate board header file according to the
|
||||||
|
* defined board.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BOARD_H_
|
||||||
|
#define _BOARD_H_
|
||||||
|
|
||||||
|
#include <avr32/io.h>
|
||||||
|
|
||||||
|
/*! \name Base Boards
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define EVK1100 1 //!< AT32UC3A EVK1100 board.
|
||||||
|
#define EVK1101 2 //!< AT32UC3B EVK1101 board.
|
||||||
|
#define UC3C_EK 3 //!< AT32UC3C UC3C_EK board.
|
||||||
|
#define EVK1104 4 //!< AT32UC3A3 EVK1104 board.
|
||||||
|
#define EVK1105 5 //!< AT32UC3A EVK1105 board.
|
||||||
|
#define STK1000 6 //!< AT32AP7000 STK1000 board.
|
||||||
|
#define NGW100 7 //!< AT32AP7000 NGW100 board.
|
||||||
|
#define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board.
|
||||||
|
#define UC3L_EK 9 //!< AT32UC3L-EK board.
|
||||||
|
#define USER_BOARD 99 //!< User-reserved board (if any).
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name Extension Boards
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define EXT1102 1 //!< AT32UC3B EXT1102 board.
|
||||||
|
#define MC300 2 //!< AT32UC3 MC300 board.
|
||||||
|
#define USER_EXT_BOARD 99 //!< User-reserved extension board (if any).
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#if BOARD == EVK1100
|
||||||
|
#include "EVK1100/evk1100.h"
|
||||||
|
#elif BOARD == EVK1101
|
||||||
|
#include "EVK1101/evk1101.h"
|
||||||
|
#elif BOARD == UC3C_EK
|
||||||
|
#include "UC3C_EK/uc3c_ek.h"
|
||||||
|
#elif BOARD == EVK1104
|
||||||
|
#include "EVK1104/evk1104.h"
|
||||||
|
#elif BOARD == EVK1105
|
||||||
|
#include "EVK1105/evk1105.h"
|
||||||
|
#elif BOARD == STK1000
|
||||||
|
#include "STK1000/stk1000.h"
|
||||||
|
#elif BOARD == NGW100
|
||||||
|
#include "NGW100/ngw100.h"
|
||||||
|
#elif BOARD == STK600_RCUC3L0
|
||||||
|
#include "STK600/RCUC3L0/stk600_rcuc3l0.h"
|
||||||
|
#elif BOARD == UC3L_EK
|
||||||
|
#include "UC3L_EK/uc3l_ek.h"
|
||||||
|
#elif BOARD == ARDUINO
|
||||||
|
#include "ARDUINO/arduino.h"
|
||||||
|
#else
|
||||||
|
#error No known AVR32 board defined
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined EXT_BOARD)
|
||||||
|
#if EXT_BOARD == EXT1102
|
||||||
|
#include "EXT1102/ext1102.h"
|
||||||
|
#elif EXT_BOARD == MC300
|
||||||
|
#include "MC300/mc300.h"
|
||||||
|
#elif EXT_BOARD == USER_EXT_BOARD
|
||||||
|
// User-reserved area: #include the header file of your extension board here
|
||||||
|
// (if any).
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef FRCOSC
|
||||||
|
#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _BOARD_H_
|
|
@ -0,0 +1,653 @@
|
||||||
|
/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief Management of the AT45DBX data flash controller through SPI.
|
||||||
|
*
|
||||||
|
* This file manages the accesses to the AT45DBX data flash components.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices with an SPI module can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
//_____ I N C L U D E S ___________________________________________________
|
||||||
|
|
||||||
|
#include "conf_access.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if AT45DBX_MEM == ENABLE
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
#include "board.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
#include "spi.h"
|
||||||
|
#include "conf_at45dbx.h"
|
||||||
|
#include "at45dbx.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if AT45DBX_MEM_CNT > 4
|
||||||
|
#error AT45DBX_MEM_CNT must not exceed 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//_____ D E F I N I T I O N S ______________________________________________
|
||||||
|
|
||||||
|
/*! \name AT45DBX Group A Commands
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_CMDA_RD_PAGE 0xD2 //!< Main Memory Page Read (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDA_RD_ARRAY_LEG 0xE8 //!< Continuous Array Read, Legacy Command (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDA_RD_ARRAY_LF_SM 0x03 //!< Continuous Array Read, Low-Frequency Mode (Serial Mode).
|
||||||
|
#define AT45DBX_CMDA_RD_ARRAY_AF_SM 0x0B //!< Continuous Array Read, Any-Frequency Mode (Serial Mode).
|
||||||
|
#define AT45DBX_CMDA_RD_SECTOR_PROT_REG 0x32 //!< Read Sector Protection Register (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDA_RD_SECTOR_LKDN_REG 0x35 //!< Read Sector Lockdown Register (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDA_RD_SECURITY_REG 0x77 //!< Read Security Register (Serial/8-bit Mode).
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name AT45DBX Group B Commands
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_CMDB_ER_PAGE 0x81 //!< Page Erase (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_ER_BLOCK 0x50 //!< Block Erase (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_ER_SECTOR 0x7C //!< Sector Erase (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_ER_CHIP 0xC794809A //!< Chip Erase (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_XFR_PAGE_TO_BUF1 0x53 //!< Main Memory Page to Buffer 1 Transfer (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_XFR_PAGE_TO_BUF2 0x55 //!< Main Memory Page to Buffer 2 Transfer (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_CMP_PAGE_TO_BUF1 0x60 //!< Main Memory Page to Buffer 1 Compare (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_CMP_PAGE_TO_BUF2 0x61 //!< Main Memory Page to Buffer 2 Compare (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_PR_BUF1_TO_PAGE_ER 0x83 //!< Buffer 1 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_PR_BUF2_TO_PAGE_ER 0x86 //!< Buffer 2 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_PR_BUF1_TO_PAGE 0x88 //!< Buffer 1 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_PR_BUF2_TO_PAGE 0x89 //!< Buffer 2 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_PR_PAGE_TH_BUF1 0x82 //!< Main Memory Page Program through Buffer 1 (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_PR_PAGE_TH_BUF2 0x85 //!< Main Memory Page Program through Buffer 2 (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_RWR_PAGE_TH_BUF1 0x58 //!< Auto Page Rewrite through Buffer 1 (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDB_RWR_PAGE_TH_BUF2 0x59 //!< Auto Page Rewrite through Buffer 2 (Serial/8-bit Mode).
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name AT45DBX Group C Commands
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_CMDC_RD_BUF1_LF_SM 0xD1 //!< Buffer 1 Read, Low-Frequency Mode (Serial Mode).
|
||||||
|
#define AT45DBX_CMDC_RD_BUF2_LF_SM 0xD3 //!< Buffer 2 Read, Low-Frequency Mode (Serial Mode).
|
||||||
|
#define AT45DBX_CMDC_RD_BUF1_AF_SM 0xD4 //!< Buffer 1 Read, Any-Frequency Mode (Serial Mode).
|
||||||
|
#define AT45DBX_CMDC_RD_BUF2_AF_SM 0xD6 //!< Buffer 2 Read, Any-Frequency Mode (Serial Mode).
|
||||||
|
#define AT45DBX_CMDC_RD_BUF1_AF_8M 0x54 //!< Buffer 1 Read, Any-Frequency Mode (8-bit Mode).
|
||||||
|
#define AT45DBX_CMDC_RD_BUF2_AF_8M 0x56 //!< Buffer 2 Read, Any-Frequency Mode (8-bit Mode).
|
||||||
|
#define AT45DBX_CMDC_WR_BUF1 0x84 //!< Buffer 1 Write (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDC_WR_BUF2 0x87 //!< Buffer 2 Write (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDC_RD_STATUS_REG 0xD7 //!< Status Register Read (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDC_RD_MNFCT_DEV_ID_SM 0x9F //!< Manufacturer and Device ID Read (Serial Mode).
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/*! \name AT45DBX Group D Commands
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_CMDD_EN_SECTOR_PROT 0x3D2A7FA9 //!< Enable Sector Protection (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDD_DIS_SECTOR_PROT 0x3D2A7F9A //!< Disable Sector Protection (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDD_ER_SECTOR_PROT_REG 0x3D2A7FCF //!< Erase Sector Protection Register (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDD_PR_SECTOR_PROT_REG 0x3D2A7FFC //!< Program Sector Protection Register (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDD_LKDN_SECTOR 0x3D2A7F30 //!< Sector Lockdown (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDD_PR_SECURITY_REG 0x9B000000 //!< Program Security Register (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDD_PR_CONF_REG 0x3D2A80A6 //!< Program Configuration Register (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDD_DEEP_PWR_DN 0xB9 //!< Deep Power-down (Serial/8-bit Mode).
|
||||||
|
#define AT45DBX_CMDD_RSM_DEEP_PWR_DN 0xAB //!< Resume from Deep Power-down (Serial/8-bit Mode).
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Bit-Masks and Values for the Status Register
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_MSK_BUSY 0x80 //!< Busy status bit-mask.
|
||||||
|
#define AT45DBX_BUSY 0x00 //!< Busy status value (0x00 when busy, 0x80 when ready).
|
||||||
|
#define AT45DBX_MSK_DENSITY 0x3C //!< Device density bit-mask.
|
||||||
|
//! @}
|
||||||
|
#if AT45DBX_MEM_SIZE == AT45DBX_1MB
|
||||||
|
|
||||||
|
/*! \name AT45DB081 Memories
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_DENSITY 0x24 //!< Device density value.
|
||||||
|
#define AT45DBX_BYTE_ADDR_BITS 9 //!< Address bits for byte position within buffer.
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
#elif AT45DBX_MEM_SIZE == AT45DBX_2MB
|
||||||
|
|
||||||
|
/*! \name AT45DB161 Memories
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_DENSITY 0x2C //!< Device density value.
|
||||||
|
#define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer.
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#elif AT45DBX_MEM_SIZE == AT45DBX_4MB
|
||||||
|
|
||||||
|
/*! \name AT45DB321 Memories
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_DENSITY 0x34 //!< Device density value.
|
||||||
|
#define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer.
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#elif AT45DBX_MEM_SIZE == AT45DBX_8MB
|
||||||
|
|
||||||
|
/*! \name AT45DB642 Memories
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_DENSITY 0x3C //!< Device density value.
|
||||||
|
#define AT45DBX_BYTE_ADDR_BITS 11 //!< Address bits for byte position within buffer.
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error AT45DBX_MEM_SIZE is not defined to a supported value
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//! Address bits for page selection.
|
||||||
|
#define AT45DBX_PAGE_ADDR_BITS (AT45DBX_MEM_SIZE - AT45DBX_PAGE_BITS)
|
||||||
|
|
||||||
|
//! Number of bits for addresses within pages.
|
||||||
|
#define AT45DBX_PAGE_BITS (AT45DBX_BYTE_ADDR_BITS - 1)
|
||||||
|
|
||||||
|
//! Page size in bytes.
|
||||||
|
#define AT45DBX_PAGE_SIZE (1 << AT45DBX_PAGE_BITS)
|
||||||
|
|
||||||
|
//! Bit-mask for byte position within buffer in \ref gl_ptr_mem.
|
||||||
|
#define AT45DBX_MSK_PTR_BYTE ((1 << AT45DBX_PAGE_BITS) - 1)
|
||||||
|
|
||||||
|
//! Bit-mask for page selection in \ref gl_ptr_mem.
|
||||||
|
#define AT45DBX_MSK_PTR_PAGE (((1 << AT45DBX_PAGE_ADDR_BITS) - 1) << AT45DBX_PAGE_BITS)
|
||||||
|
|
||||||
|
//! Bit-mask for byte position within sector in \ref gl_ptr_mem.
|
||||||
|
#define AT45DBX_MSK_PTR_SECTOR ((1 << AT45DBX_SECTOR_BITS) - 1)
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Sends a dummy byte through SPI.
|
||||||
|
*/
|
||||||
|
#define spi_write_dummy() spi_write(AT45DBX_SPI, 0xFF)
|
||||||
|
|
||||||
|
|
||||||
|
//! Boolean indicating whether memory is in busy state.
|
||||||
|
static Bool at45dbx_busy;
|
||||||
|
|
||||||
|
//! Memory data pointer.
|
||||||
|
static U32 gl_ptr_mem;
|
||||||
|
|
||||||
|
//! Sector buffer.
|
||||||
|
static U8 sector_buf[AT45DBX_SECTOR_SIZE];
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Control Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz)
|
||||||
|
{
|
||||||
|
// Setup SPI registers according to spiOptions.
|
||||||
|
for (spiOptions.reg = AT45DBX_SPI_FIRST_NPCS;
|
||||||
|
spiOptions.reg < AT45DBX_SPI_FIRST_NPCS + AT45DBX_MEM_CNT;
|
||||||
|
spiOptions.reg++)
|
||||||
|
{
|
||||||
|
if (spi_setupChipReg(AT45DBX_SPI, &spiOptions, pba_hz) != SPI_OK) return KO;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Memory ready.
|
||||||
|
at45dbx_busy = FALSE;
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Selects or unselects a DF memory.
|
||||||
|
*
|
||||||
|
* \param memidx Memory ID of DF to select or unselect.
|
||||||
|
* \param bSelect Boolean indicating whether the DF memory has to be selected.
|
||||||
|
*/
|
||||||
|
static void at45dbx_chipselect_df(U8 memidx, Bool bSelect)
|
||||||
|
{
|
||||||
|
if (bSelect)
|
||||||
|
{
|
||||||
|
// Select SPI chip.
|
||||||
|
spi_selectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Unselect SPI chip.
|
||||||
|
spi_unselectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_mem_check(void)
|
||||||
|
{
|
||||||
|
U8 df;
|
||||||
|
U16 status = 0;
|
||||||
|
|
||||||
|
// DF memory check.
|
||||||
|
for (df = 0; df < AT45DBX_MEM_CNT; df++)
|
||||||
|
{
|
||||||
|
// Select the DF memory to check.
|
||||||
|
at45dbx_chipselect_df(df, TRUE);
|
||||||
|
|
||||||
|
// Send the Status Register Read command.
|
||||||
|
spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG);
|
||||||
|
|
||||||
|
// Send a dummy byte to read the status register.
|
||||||
|
spi_write_dummy();
|
||||||
|
spi_read(AT45DBX_SPI, &status);
|
||||||
|
|
||||||
|
// Unselect the checked DF memory.
|
||||||
|
at45dbx_chipselect_df(df, FALSE);
|
||||||
|
|
||||||
|
// Unexpected device density value.
|
||||||
|
if ((status & AT45DBX_MSK_DENSITY) < AT45DBX_DENSITY) return KO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Waits until the DF is ready.
|
||||||
|
*/
|
||||||
|
static void at45dbx_wait_ready(void)
|
||||||
|
{
|
||||||
|
U16 status;
|
||||||
|
|
||||||
|
// Select the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE);
|
||||||
|
|
||||||
|
// Send the Status Register Read command.
|
||||||
|
spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG);
|
||||||
|
|
||||||
|
// Read the status register until the DF is ready.
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// Send a dummy byte to read the status register.
|
||||||
|
spi_write_dummy();
|
||||||
|
spi_read(AT45DBX_SPI, &status);
|
||||||
|
} while ((status & AT45DBX_MSK_BUSY) == AT45DBX_BUSY);
|
||||||
|
|
||||||
|
// Unselect the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_read_open(U32 sector)
|
||||||
|
{
|
||||||
|
U32 addr;
|
||||||
|
|
||||||
|
// Set the global memory pointer to a byte address.
|
||||||
|
gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE.
|
||||||
|
|
||||||
|
// If the DF memory is busy, wait until it's ready.
|
||||||
|
if (at45dbx_busy) at45dbx_wait_ready();
|
||||||
|
at45dbx_busy = FALSE;
|
||||||
|
|
||||||
|
// Select the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE);
|
||||||
|
|
||||||
|
// Initiate a page read at a given sector.
|
||||||
|
|
||||||
|
// Send the Main Memory Page Read command.
|
||||||
|
spi_write(AT45DBX_SPI, AT45DBX_CMDA_RD_PAGE);
|
||||||
|
|
||||||
|
// Send the three address bytes, which comprise:
|
||||||
|
// - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits;
|
||||||
|
// - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read;
|
||||||
|
// - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page.
|
||||||
|
// NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local
|
||||||
|
// DF addressing. They are used for DF discrimination when there are several DFs.
|
||||||
|
addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) |
|
||||||
|
Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE);
|
||||||
|
spi_write(AT45DBX_SPI, LSB2W(addr));
|
||||||
|
spi_write(AT45DBX_SPI, LSB1W(addr));
|
||||||
|
spi_write(AT45DBX_SPI, LSB0W(addr));
|
||||||
|
|
||||||
|
// Send 32 don't care clock cycles to initialize the read operation.
|
||||||
|
spi_write_dummy();
|
||||||
|
spi_write_dummy();
|
||||||
|
spi_write_dummy();
|
||||||
|
spi_write_dummy();
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void at45dbx_read_close(void)
|
||||||
|
{
|
||||||
|
// Unselect the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE);
|
||||||
|
|
||||||
|
// Memory ready.
|
||||||
|
at45dbx_busy = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_write_open(U32 sector)
|
||||||
|
{
|
||||||
|
U32 addr;
|
||||||
|
|
||||||
|
// Set the global memory pointer to a byte address.
|
||||||
|
gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE.
|
||||||
|
|
||||||
|
// If the DF memory is busy, wait until it's ready.
|
||||||
|
if (at45dbx_busy) at45dbx_wait_ready();
|
||||||
|
at45dbx_busy = FALSE;
|
||||||
|
|
||||||
|
#if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE
|
||||||
|
// Select the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE);
|
||||||
|
|
||||||
|
// Transfer the content of the current page to buffer 1.
|
||||||
|
|
||||||
|
// Send the Main Memory Page to Buffer 1 Transfer command.
|
||||||
|
spi_write(AT45DBX_SPI, AT45DBX_CMDB_XFR_PAGE_TO_BUF1);
|
||||||
|
|
||||||
|
// Send the three address bytes, which comprise:
|
||||||
|
// - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits;
|
||||||
|
// - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read;
|
||||||
|
// - then AT45DBX_BYTE_ADDR_BITS don't care bits.
|
||||||
|
// NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local
|
||||||
|
// DF addressing. They are used for DF discrimination when there are several DFs.
|
||||||
|
addr = Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS;
|
||||||
|
spi_write(AT45DBX_SPI, LSB2W(addr));
|
||||||
|
spi_write(AT45DBX_SPI, LSB1W(addr));
|
||||||
|
spi_write(AT45DBX_SPI, LSB0W(addr));
|
||||||
|
|
||||||
|
// Unselect the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE);
|
||||||
|
|
||||||
|
// Wait for end of page transfer.
|
||||||
|
at45dbx_wait_ready();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Select the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE);
|
||||||
|
|
||||||
|
// Initiate a page write at a given sector.
|
||||||
|
|
||||||
|
// Send the Main Memory Page Program through Buffer 1 command.
|
||||||
|
spi_write(AT45DBX_SPI, AT45DBX_CMDB_PR_PAGE_TH_BUF1);
|
||||||
|
|
||||||
|
// Send the three address bytes, which comprise:
|
||||||
|
// - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits;
|
||||||
|
// - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be written;
|
||||||
|
// - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page.
|
||||||
|
// NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local
|
||||||
|
// DF addressing. They are used for DF discrimination when there are several DFs.
|
||||||
|
addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) |
|
||||||
|
Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE);
|
||||||
|
spi_write(AT45DBX_SPI, LSB2W(addr));
|
||||||
|
spi_write(AT45DBX_SPI, LSB1W(addr));
|
||||||
|
spi_write(AT45DBX_SPI, LSB0W(addr));
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void at45dbx_write_close(void)
|
||||||
|
{
|
||||||
|
// While end of logical sector not reached, zero-fill remaining memory bytes.
|
||||||
|
while (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_SECTOR))
|
||||||
|
{
|
||||||
|
spi_write(AT45DBX_SPI, 0x00);
|
||||||
|
gl_ptr_mem++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unselect the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE);
|
||||||
|
|
||||||
|
// Memory busy.
|
||||||
|
at45dbx_busy = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Single-Byte Access Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
|
U8 at45dbx_read_byte(void)
|
||||||
|
{
|
||||||
|
U16 data;
|
||||||
|
|
||||||
|
// Memory busy.
|
||||||
|
if (at45dbx_busy)
|
||||||
|
{
|
||||||
|
// Being here, we know that we previously finished a page read.
|
||||||
|
// => We have to access the next page.
|
||||||
|
|
||||||
|
// Memory ready.
|
||||||
|
at45dbx_busy = FALSE;
|
||||||
|
|
||||||
|
// Eventually select the next DF and open the next page.
|
||||||
|
// NOTE: at45dbx_read_open input parameter is a sector.
|
||||||
|
at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send a dummy byte to read the next data byte.
|
||||||
|
spi_write_dummy();
|
||||||
|
spi_read(AT45DBX_SPI, &data);
|
||||||
|
gl_ptr_mem++;
|
||||||
|
|
||||||
|
// If end of page reached,
|
||||||
|
if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE))
|
||||||
|
{
|
||||||
|
// unselect the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE);
|
||||||
|
|
||||||
|
// Memory busy.
|
||||||
|
at45dbx_busy = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_write_byte(U8 b)
|
||||||
|
{
|
||||||
|
// Memory busy.
|
||||||
|
if (at45dbx_busy)
|
||||||
|
{
|
||||||
|
// Being here, we know that we previously launched a page programming.
|
||||||
|
// => We have to access the next page.
|
||||||
|
|
||||||
|
// Eventually select the next DF and open the next page.
|
||||||
|
// NOTE: at45dbx_write_open input parameter is a sector.
|
||||||
|
at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the next data byte.
|
||||||
|
spi_write(AT45DBX_SPI, b);
|
||||||
|
gl_ptr_mem++;
|
||||||
|
|
||||||
|
// If end of page reached,
|
||||||
|
if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE))
|
||||||
|
{
|
||||||
|
// unselect the DF memory gl_ptr_mem points to in order to program the page.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE);
|
||||||
|
|
||||||
|
// Memory busy.
|
||||||
|
at45dbx_busy = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Multiple-Sector Access Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_read_multiple_sector(U16 nb_sector)
|
||||||
|
{
|
||||||
|
while (nb_sector--)
|
||||||
|
{
|
||||||
|
// Read the next sector.
|
||||||
|
at45dbx_read_sector_2_ram(sector_buf);
|
||||||
|
at45dbx_read_multiple_sector_callback(sector_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_write_multiple_sector(U16 nb_sector)
|
||||||
|
{
|
||||||
|
while (nb_sector--)
|
||||||
|
{
|
||||||
|
// Write the next sector.
|
||||||
|
at45dbx_write_multiple_sector_callback(sector_buf);
|
||||||
|
at45dbx_write_sector_from_ram(sector_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Single-Sector Access Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_read_sector_2_ram(void *ram)
|
||||||
|
{
|
||||||
|
U8 *_ram = ram;
|
||||||
|
U16 i;
|
||||||
|
U16 data;
|
||||||
|
|
||||||
|
// Memory busy.
|
||||||
|
if (at45dbx_busy)
|
||||||
|
{
|
||||||
|
// Being here, we know that we previously finished a page read.
|
||||||
|
// => We have to access the next page.
|
||||||
|
|
||||||
|
// Memory ready.
|
||||||
|
at45dbx_busy = FALSE;
|
||||||
|
|
||||||
|
// Eventually select the next DF and open the next page.
|
||||||
|
// NOTE: at45dbx_read_open input parameter is a sector.
|
||||||
|
at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the next sector.
|
||||||
|
for (i = AT45DBX_SECTOR_SIZE; i; i--)
|
||||||
|
{
|
||||||
|
// Send a dummy byte to read the next data byte.
|
||||||
|
spi_write_dummy();
|
||||||
|
spi_read(AT45DBX_SPI, &data);
|
||||||
|
*_ram++ = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the memory pointer.
|
||||||
|
gl_ptr_mem += AT45DBX_SECTOR_SIZE;
|
||||||
|
|
||||||
|
#if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE
|
||||||
|
// If end of page reached,
|
||||||
|
if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
// unselect the DF memory gl_ptr_mem points to.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE);
|
||||||
|
|
||||||
|
// Memory busy.
|
||||||
|
at45dbx_busy = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_write_sector_from_ram(const void *ram)
|
||||||
|
{
|
||||||
|
const U8 *_ram = ram;
|
||||||
|
U16 i;
|
||||||
|
|
||||||
|
// Memory busy.
|
||||||
|
if (at45dbx_busy)
|
||||||
|
{
|
||||||
|
// Being here, we know that we previously launched a page programming.
|
||||||
|
// => We have to access the next page.
|
||||||
|
|
||||||
|
// Eventually select the next DF and open the next page.
|
||||||
|
// NOTE: at45dbx_write_open input parameter is a sector.
|
||||||
|
at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the next sector.
|
||||||
|
for (i = AT45DBX_SECTOR_SIZE; i; i--)
|
||||||
|
{
|
||||||
|
// Write the next data byte.
|
||||||
|
spi_write(AT45DBX_SPI, *_ram++);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the memory pointer.
|
||||||
|
gl_ptr_mem += AT45DBX_SECTOR_SIZE;
|
||||||
|
|
||||||
|
#if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE
|
||||||
|
// If end of page reached,
|
||||||
|
if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
// unselect the DF memory gl_ptr_mem points to in order to program the page.
|
||||||
|
at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE);
|
||||||
|
|
||||||
|
// Memory busy.
|
||||||
|
at45dbx_busy = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // AT45DBX_MEM == ENABLE
|
|
@ -0,0 +1,270 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief Management of the AT45DBX data flash controller through SPI.
|
||||||
|
*
|
||||||
|
* This file manages the accesses to the AT45DBX data flash components.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices with an SPI module can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _AT45DBX_H_
|
||||||
|
#define _AT45DBX_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "conf_access.h"
|
||||||
|
|
||||||
|
#if AT45DBX_MEM == DISABLE
|
||||||
|
#error at45dbx.h is #included although AT45DBX_MEM is disabled
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "spi.h"
|
||||||
|
|
||||||
|
|
||||||
|
//_____ D E F I N I T I O N S ______________________________________________
|
||||||
|
|
||||||
|
/*! \name Available AT45DBX Sizes
|
||||||
|
*
|
||||||
|
* Number of address bits of available AT45DBX data flash memories.
|
||||||
|
*
|
||||||
|
* \note Only memories with page sizes of at least 512 bytes (sector size) are
|
||||||
|
* supported.
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
#define AT45DBX_1MB 20
|
||||||
|
#define AT45DBX_2MB 21
|
||||||
|
#define AT45DBX_4MB 22
|
||||||
|
#define AT45DBX_8MB 23
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
// AT45DBX_1MB
|
||||||
|
#define AT45DBX_SECTOR_BITS 8 //! Number of bits for addresses within sectors.
|
||||||
|
// AT45DBX_2MB AT45DBX_4MB AT45DBX_8MB
|
||||||
|
//#define AT45DBX_SECTOR_BITS 9 //! Number of bits for addresses within sectors.
|
||||||
|
|
||||||
|
//! Sector size in bytes.
|
||||||
|
#define AT45DBX_SECTOR_SIZE (1 << AT45DBX_SECTOR_BITS)
|
||||||
|
|
||||||
|
|
||||||
|
//_____ D E C L A R A T I O N S ____________________________________________
|
||||||
|
|
||||||
|
/*! \name Control Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
/*! \brief Initializes the data flash controller and the SPI channel by which
|
||||||
|
* the DF is controlled.
|
||||||
|
*
|
||||||
|
* \param spiOptions Initialization options of the DF SPI channel.
|
||||||
|
* \param pba_hz SPI module input clock frequency (PBA clock, Hz).
|
||||||
|
*
|
||||||
|
* \retval OK Success.
|
||||||
|
* \retval KO Failure.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz);
|
||||||
|
|
||||||
|
/*! \brief Performs a memory check on all DFs.
|
||||||
|
*
|
||||||
|
* \retval OK Success.
|
||||||
|
* \retval KO Failure.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_mem_check(void);
|
||||||
|
|
||||||
|
/*! \brief Opens a DF memory in read mode at a given sector.
|
||||||
|
*
|
||||||
|
* \param sector Start sector.
|
||||||
|
*
|
||||||
|
* \retval OK Success.
|
||||||
|
* \retval KO Failure.
|
||||||
|
*
|
||||||
|
* \note Sector may be page-unaligned (depending on the DF page size).
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_read_open(U32 sector);
|
||||||
|
|
||||||
|
/*! \brief Unselects the current DF memory.
|
||||||
|
*/
|
||||||
|
extern void at45dbx_read_close(void);
|
||||||
|
|
||||||
|
/*! \brief This function opens a DF memory in write mode at a given sector.
|
||||||
|
*
|
||||||
|
* \param sector Start sector.
|
||||||
|
*
|
||||||
|
* \retval OK Success.
|
||||||
|
* \retval KO Failure.
|
||||||
|
*
|
||||||
|
* \note Sector may be page-unaligned (depending on the DF page size).
|
||||||
|
*
|
||||||
|
* \note If \ref AT45DBX_PAGE_SIZE > \ref AT45DBX_SECTOR_SIZE, page content is
|
||||||
|
* first loaded in buffer to then be partially updated by write byte or
|
||||||
|
* write sector functions.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_write_open(U32 sector);
|
||||||
|
|
||||||
|
/*! \brief Fills the end of the current logical sector and launches page programming.
|
||||||
|
*/
|
||||||
|
extern void at45dbx_write_close(void);
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Single-Byte Access Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
/*! \brief Performs a single byte read from DF memory.
|
||||||
|
*
|
||||||
|
* \return The read byte.
|
||||||
|
*
|
||||||
|
* \note First call must be preceded by a call to the \ref at45dbx_read_open
|
||||||
|
* function.
|
||||||
|
*/
|
||||||
|
extern U8 at45dbx_read_byte(void);
|
||||||
|
|
||||||
|
/*! \brief Performs a single byte write to DF memory.
|
||||||
|
*
|
||||||
|
* \param b The byte to write.
|
||||||
|
*
|
||||||
|
* \retval OK Success.
|
||||||
|
* \retval KO Failure.
|
||||||
|
*
|
||||||
|
* \note First call must be preceded by a call to the \ref at45dbx_write_open
|
||||||
|
* function.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_write_byte(U8 b);
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Multiple-Sector Access Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
/*! \brief Reads \a nb_sector sectors from DF memory.
|
||||||
|
*
|
||||||
|
* Data flow is: DF -> callback.
|
||||||
|
*
|
||||||
|
* \param nb_sector Number of contiguous sectors to read.
|
||||||
|
*
|
||||||
|
* \retval OK Success.
|
||||||
|
* \retval KO Failure.
|
||||||
|
*
|
||||||
|
* \note First call must be preceded by a call to the \ref at45dbx_read_open
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* \note As \ref AT45DBX_PAGE_SIZE is always a multiple of
|
||||||
|
* \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each
|
||||||
|
* byte.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_read_multiple_sector(U16 nb_sector);
|
||||||
|
|
||||||
|
/*! \brief Callback function invoked after each sector read during
|
||||||
|
* \ref at45dbx_read_multiple_sector.
|
||||||
|
*
|
||||||
|
* \param psector Pointer to read sector.
|
||||||
|
*/
|
||||||
|
extern void at45dbx_read_multiple_sector_callback(const void *psector);
|
||||||
|
|
||||||
|
/*! \brief Writes \a nb_sector sectors to DF memory.
|
||||||
|
*
|
||||||
|
* Data flow is: callback -> DF.
|
||||||
|
*
|
||||||
|
* \param nb_sector Number of contiguous sectors to write.
|
||||||
|
*
|
||||||
|
* \retval OK Success.
|
||||||
|
* \retval KO Failure.
|
||||||
|
*
|
||||||
|
* \note First call must be preceded by a call to the \ref at45dbx_write_open
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* \note As \ref AT45DBX_PAGE_SIZE is always a multiple of
|
||||||
|
* \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each
|
||||||
|
* byte.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_write_multiple_sector(U16 nb_sector);
|
||||||
|
|
||||||
|
/*! \brief Callback function invoked before each sector write during
|
||||||
|
* \ref at45dbx_write_multiple_sector.
|
||||||
|
*
|
||||||
|
* \param psector Pointer to sector to write.
|
||||||
|
*/
|
||||||
|
extern void at45dbx_write_multiple_sector_callback(void *psector);
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Single-Sector Access Functions
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
/*! \brief Reads 1 DF sector to a RAM buffer.
|
||||||
|
*
|
||||||
|
* Data flow is: DF -> RAM.
|
||||||
|
*
|
||||||
|
* \param ram Pointer to RAM buffer.
|
||||||
|
*
|
||||||
|
* \retval OK Success.
|
||||||
|
* \retval KO Failure.
|
||||||
|
*
|
||||||
|
* \note First call must be preceded by a call to the \ref at45dbx_read_open
|
||||||
|
* function.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_read_sector_2_ram(void *ram);
|
||||||
|
|
||||||
|
/*! \brief Writes 1 DF sector from a RAM buffer.
|
||||||
|
*
|
||||||
|
* Data flow is: RAM -> DF.
|
||||||
|
*
|
||||||
|
* \param ram Pointer to RAM buffer.
|
||||||
|
*
|
||||||
|
* \retval OK Success.
|
||||||
|
* \retval KO Failure.
|
||||||
|
*
|
||||||
|
* \note First call must be preceded by a call to the \ref at45dbx_write_open
|
||||||
|
* function.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_write_sector_from_ram(const void *ram);
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _AT45DBX_H_
|
|
@ -0,0 +1,234 @@
|
||||||
|
/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief CTRL_ACCESS interface for the AT45DBX data flash controller.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices with an SPI module can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
//_____ I N C L U D E S ___________________________________________________
|
||||||
|
|
||||||
|
#include "conf_access.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if AT45DBX_MEM == ENABLE
|
||||||
|
|
||||||
|
#include "conf_at45dbx.h"
|
||||||
|
#include "at45dbx.h"
|
||||||
|
#include "at45dbx_mem.h"
|
||||||
|
|
||||||
|
|
||||||
|
//_____ D E F I N I T I O N S ______________________________________________
|
||||||
|
|
||||||
|
//! Whether to detect write accesses to the memory.
|
||||||
|
#define AT45DBX_MEM_TEST_CHANGE_STATE ENABLED
|
||||||
|
|
||||||
|
|
||||||
|
#if (ACCESS_USB == ENABLED || ACCESS_MEM_TO_RAM == ENABLED) && AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED
|
||||||
|
|
||||||
|
//! Memory data modified flag.
|
||||||
|
static volatile Bool s_b_data_modify = FALSE;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name Control Interface
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
|
Ctrl_status at45dbx_test_unit_ready(void)
|
||||||
|
{
|
||||||
|
return (at45dbx_mem_check() == OK) ? CTRL_GOOD : CTRL_NO_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector)
|
||||||
|
{
|
||||||
|
*u32_nb_sector = (AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) - 1;
|
||||||
|
|
||||||
|
return CTRL_GOOD;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_wr_protect(void)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool at45dbx_removal(void)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
#if ACCESS_USB == ENABLED
|
||||||
|
|
||||||
|
#include "usb_drv.h"
|
||||||
|
#include "scsi_decoder.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*! \name MEM <-> USB Interface
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
|
Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector)
|
||||||
|
{
|
||||||
|
if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL;
|
||||||
|
|
||||||
|
at45dbx_read_open(addr);
|
||||||
|
at45dbx_read_multiple_sector(nb_sector);
|
||||||
|
at45dbx_read_close();
|
||||||
|
|
||||||
|
return CTRL_GOOD;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void at45dbx_read_multiple_sector_callback(const void *psector)
|
||||||
|
{
|
||||||
|
U16 data_to_transfer = AT45DBX_SECTOR_SIZE;
|
||||||
|
|
||||||
|
// Transfer read sector to the USB interface.
|
||||||
|
while (data_to_transfer)
|
||||||
|
{
|
||||||
|
while (!Is_usb_in_ready(g_scsi_ep_ms_in))
|
||||||
|
{
|
||||||
|
if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_in))
|
||||||
|
return; // USB Reset
|
||||||
|
}
|
||||||
|
|
||||||
|
Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in);
|
||||||
|
data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, psector,
|
||||||
|
data_to_transfer, &psector);
|
||||||
|
Usb_ack_in_ready_send(g_scsi_ep_ms_in);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector)
|
||||||
|
{
|
||||||
|
if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL;
|
||||||
|
|
||||||
|
#if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED
|
||||||
|
if (nb_sector) s_b_data_modify = TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
at45dbx_write_open(addr);
|
||||||
|
at45dbx_write_multiple_sector(nb_sector);
|
||||||
|
at45dbx_write_close();
|
||||||
|
|
||||||
|
return CTRL_GOOD;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void at45dbx_write_multiple_sector_callback(void *psector)
|
||||||
|
{
|
||||||
|
U16 data_to_transfer = AT45DBX_SECTOR_SIZE;
|
||||||
|
|
||||||
|
// Transfer sector to write from the USB interface.
|
||||||
|
while (data_to_transfer)
|
||||||
|
{
|
||||||
|
while (!Is_usb_out_received(g_scsi_ep_ms_out))
|
||||||
|
{
|
||||||
|
if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_out))
|
||||||
|
return; // USB Reset
|
||||||
|
}
|
||||||
|
|
||||||
|
Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out);
|
||||||
|
data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, psector,
|
||||||
|
data_to_transfer, &psector);
|
||||||
|
Usb_ack_out_received_free(g_scsi_ep_ms_out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#endif // ACCESS_USB == ENABLED
|
||||||
|
|
||||||
|
|
||||||
|
#if ACCESS_MEM_TO_RAM == ENABLED
|
||||||
|
|
||||||
|
/*! \name MEM <-> RAM Interface
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
|
Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram)
|
||||||
|
{
|
||||||
|
if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL;
|
||||||
|
|
||||||
|
at45dbx_read_open(addr);
|
||||||
|
at45dbx_read_sector_2_ram(ram);
|
||||||
|
at45dbx_read_close();
|
||||||
|
|
||||||
|
return CTRL_GOOD;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram)
|
||||||
|
{
|
||||||
|
if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL;
|
||||||
|
|
||||||
|
#if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED
|
||||||
|
s_b_data_modify = TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
at45dbx_write_open(addr);
|
||||||
|
at45dbx_write_sector_from_ram(ram);
|
||||||
|
at45dbx_write_close();
|
||||||
|
|
||||||
|
return CTRL_GOOD;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#endif // ACCESS_MEM_TO_RAM == ENABLED
|
||||||
|
|
||||||
|
|
||||||
|
#endif // AT45DBX_MEM == ENABLE
|
|
@ -0,0 +1,164 @@
|
||||||
|
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
|
||||||
|
|
||||||
|
/*This file is prepared for Doxygen automatic documentation generation.*/
|
||||||
|
/*! \file *********************************************************************
|
||||||
|
*
|
||||||
|
* \brief CTRL_ACCESS interface for the AT45DBX data flash controller.
|
||||||
|
*
|
||||||
|
* - Compiler: IAR EWAVR32 and GNU GCC for AVR32
|
||||||
|
* - Supported devices: All AVR32 devices with an SPI module can be used.
|
||||||
|
* - AppNote:
|
||||||
|
*
|
||||||
|
* \author Atmel Corporation: http://www.atmel.com \n
|
||||||
|
* Support and FAQ: http://support.atmel.no/
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software may only be redistributed and used in connection with an Atmel
|
||||||
|
* AVR product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||||
|
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _AT45DBX_MEM_H_
|
||||||
|
#define _AT45DBX_MEM_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "conf_access.h"
|
||||||
|
|
||||||
|
#if AT45DBX_MEM == DISABLE
|
||||||
|
#error at45dbx_mem.h is #included although AT45DBX_MEM is disabled
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "ctrl_access.h"
|
||||||
|
|
||||||
|
|
||||||
|
//_____ D E C L A R A T I O N S ____________________________________________
|
||||||
|
|
||||||
|
/*! \name Control Interface
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
/*! \brief Tests the memory state and initializes the memory if required.
|
||||||
|
*
|
||||||
|
* The TEST UNIT READY SCSI primary command allows an application client to poll
|
||||||
|
* a LUN until it is ready without having to allocate memory for returned data.
|
||||||
|
*
|
||||||
|
* This command may be used to check the media status of LUNs with removable
|
||||||
|
* media.
|
||||||
|
*
|
||||||
|
* \return Status.
|
||||||
|
*/
|
||||||
|
extern Ctrl_status at45dbx_test_unit_ready(void);
|
||||||
|
|
||||||
|
/*! \brief Returns the address of the last valid sector in the memory.
|
||||||
|
*
|
||||||
|
* \param u32_nb_sector Pointer to the address of the last valid sector.
|
||||||
|
*
|
||||||
|
* \return Status.
|
||||||
|
*/
|
||||||
|
extern Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector);
|
||||||
|
|
||||||
|
/*! \brief Returns the write-protection state of the memory.
|
||||||
|
*
|
||||||
|
* \return \c TRUE if the memory is write-protected, else \c FALSE.
|
||||||
|
*
|
||||||
|
* \note Only used by removable memories with hardware-specific write
|
||||||
|
* protection.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_wr_protect(void);
|
||||||
|
|
||||||
|
/*! \brief Tells whether the memory is removable.
|
||||||
|
*
|
||||||
|
* \return \c TRUE if the memory is removable, else \c FALSE.
|
||||||
|
*/
|
||||||
|
extern Bool at45dbx_removal(void);
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
|
#if ACCESS_USB == ENABLED
|
||||||
|
|
||||||
|
/*! \name MEM <-> USB Interface
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
/*! \brief Tranfers data from the memory to USB.
|
||||||
|
*
|
||||||
|
* \param addr Address of first memory sector to read.
|
||||||
|
* \param nb_sector Number of sectors to transfer.
|
||||||
|
*
|
||||||
|
* \return Status.
|
||||||
|
*/
|
||||||
|
extern Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector);
|
||||||
|
|
||||||
|
/*! \brief Tranfers data from USB to the memory.
|
||||||
|
*
|
||||||
|
* \param addr Address of first memory sector to write.
|
||||||
|
* \param nb_sector Number of sectors to transfer.
|
||||||
|
*
|
||||||
|
* \return Status.
|
||||||
|
*/
|
||||||
|
extern Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector);
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if ACCESS_MEM_TO_RAM == ENABLED
|
||||||
|
|
||||||
|
/*! \name MEM <-> RAM Interface
|
||||||
|
*/
|
||||||
|
//! @{
|
||||||
|
|
||||||
|
/*! \brief Copies 1 data sector from the memory to RAM.
|
||||||
|
*
|
||||||
|
* \param addr Address of first memory sector to read.
|
||||||
|
* \param ram Pointer to RAM buffer to write.
|
||||||
|
*
|
||||||
|
* \return Status.
|
||||||
|
*/
|
||||||
|
extern Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram);
|
||||||
|
|
||||||
|
/*! \brief Copies 1 data sector from RAM to the memory.
|
||||||
|
*
|
||||||
|
* \param addr Address of first memory sector to write.
|
||||||
|
* \param ram Pointer to RAM buffer to read.
|
||||||
|
*
|
||||||
|
* \return Status.
|
||||||
|
*/
|
||||||
|
extern Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram);
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _AT45DBX_MEM_H_
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
Revision: 2491
|
File diff suppressed because it is too large
Load diff
19287
firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_fw.h
Executable file
19287
firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_fw.h
Executable file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,35 @@
|
||||||
|
#ifndef WL_OS_H
|
||||||
|
#define WL_OS_H
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
void *owl_os_alloc(size_t size);
|
||||||
|
void *owl_os_realloc(void *ptr, size_t size);
|
||||||
|
void owl_os_free(void *p);
|
||||||
|
void *owl_os_memcpy(void *dst, const void *src, size_t n);
|
||||||
|
void *owl_os_memset(void *s, int c, size_t n);
|
||||||
|
void *owl_os_memmove(void *dst, const void *src, size_t n);
|
||||||
|
size_t owl_os_strlen(char *s);
|
||||||
|
char *owl_os_strncpy(char *dst, const char *src, size_t n);
|
||||||
|
int owl_os_strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
int owl_os_strcmp(const char *s1, const char *s2);
|
||||||
|
char *owl_os_strcpy(char *dst, const char *src);
|
||||||
|
char *owl_os_strdup(const char *s);
|
||||||
|
char *owl_os_strndup(const char *s, size_t n);
|
||||||
|
int owl_os_memcmp(const void *s1, const void *s2, size_t n);
|
||||||
|
long int owl_os_strtol(const char *nptr, char **endptr, int base);
|
||||||
|
char *owl_os_strchr(const char *s, int c);
|
||||||
|
char *owl_os_strrchr(const char *s, int c);
|
||||||
|
int owl_os_strcasecmp(const char *s1, const char *s2);
|
||||||
|
char *owl_os_strstr(const char *haystack, const char *needle);
|
||||||
|
|
||||||
|
int owl_os_snprintf(char *str, size_t size, const char *format, ...)
|
||||||
|
__attribute__((format(printf, 3, 4)));
|
||||||
|
|
||||||
|
int owl_os_vprintf(const char *format, va_list arg); /* debug only */
|
||||||
|
int owl_os_printf(const char *format, ...) /* debug only */
|
||||||
|
__attribute__((format(printf, 1, 2)));
|
||||||
|
|
||||||
|
#endif /* WL_OS_H */
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue